ESP 8266 PWM 인터페이스 참조

5471 단어 ESP8266WIFI
1. 개술
    PWM 의 특성 은 다음 과 같다. 
  • NMI (Non Maskable Interrupt) 사용 중단, 더욱 정확
  • 최대 8 번 PWM 신호
  • 확장 가능
  • > 14bit 해상도, 최소 해상도 45ns
  • 레지스터 를 설정 하지 않 아 도 함수 인 터 페 이 스 를 호출 하면 설정 을 완성 할 수 있 습 니 다.

  •     1.2 실현 방식
    ESP 8266 시스템 은 FRC 1 타이머 에 NMI 를 마 운 트 함으로써 GPIO 포트 에 여러 개의 PWM 신 호 를 출력 하 는 최 적 화 된 소프트웨어 알고리즘 을 제공 했다.PWM 의 시 계 는 고속 시스템 시계 에서 제공 되 는데 그 주파 수 는 80MHz 에 달한다.PWM 은 프 리 젠 테 이 션 스크린 16 분 주파 수 를 통 해 시계 주파 수 를 5MHz 로 입력 한다.PWM 은 FRC 1 을 통 해 굵게 시간 을 조정 하고 고속 시스템 시계의 미세 조정 과 결합 하여 해상 도 를 45ns 까지 높 일 수 있다.
    설명: NMI 는 최고 인 터 럽 트 우선 순 위 를 가지 고 있어 PWM 출력 파형 의 정확 도 를 확보 할 수 있다.
        1.3 설정 설명
  • 정시 중단 시 프로그램 을 빨리 종료 하기 위해 PWM 주기 가 시 작 될 때마다 다음 주기의 정시 인자
  • 를 불 러 옵 니 다.
  • 각 채널 의 차지 비례 를 설정 한 후 시스템 은 pwm 를 호출 합 니 다.start () 함수 로 정시 주 기 를 계산 합 니 다.그 전에 시스템 은 현재 의 채널 매개 변 수 를 저장 하고 계산 완료 표 지 를 제거 하 며 PWM 주기 가 되면 저 장 된 매개 변 수 를 사용 합 니 다.
  • PWM 주기 가 중단 되면 새로운 인 자 를 사용 하기 때문에 계산 이 완료 되면 로 고 를 설정 해 야 합 니 다.이렇게 하면 점 공비 점진 (예 를 들 어 RGB 색 등 제어) 을 실현 하 는 과정 에서 색 의 부 드 러 운 과 도 를 확보 할 수 있다.
  • userlight. h 에서 사용 할 GPIO 를 설정 합 니 다.SDK 코드 예제 에 서 는 5 번 PWM 을 사용 하여 실제 자체 적 으로 확장 할 수 있 으 며 최대 8 까지 확장 할 수 있 습 니 다.  도로 PWM.최소 해상도 45ns, 주파수 가 1KHz 일 때 차지 하 는 비례 가 최소 1 / 2222 에 달한다.

  •   1.4 매개 변수 설명
  • 최소 해상도: 45ns (하드웨어 PWM 에 대응 하 는 입력 시계의 주파 수 는 22.72MHz 와 비슷 함): > 14bit PWM @ 1 KHz
  • PWM 주기: 1000 us (1KHz) ~ 10000 us (100 Hz)
  • 2. PWM. h 상세 설명
     
      2.1 코드 예제
    #ifndef __PWM_H__
    #define __PWM_H__
    #define PWM_CHANNEL_NUM_MAX    8        //    8   PWM
    struct pwm_single_param                 //      PWM        
    {
        uint16 gpio_set;                    //       GPIO
        uint16 gpio_clear;                  //       GPIO
        uint32 h_time;                      //      FRC1_LOAD        
    };
    struct pwm_param                        //    PWM      
    {
        uint32 period;                      // PWM   
        uint32 freq;                        // PWM   
        uint32 duty[PWM_CHANNEL_NUM_MAX];   // PWM    
    };
    void pwm_init(uint32 period, uint32 *duty, uint32 pwm_channel_num, uint32(*pin_info_list)[3]);
    void pwm_start(void);
    void pwm_set_duty(uint32 duty, uint8 channel);
    uint32 pwm_get_duty(uint8 channel);
    void pwm_set_freq(uint32 period);
    uint32 pwm_get_freq(void);
    
    

      2.2 인터페이스 설명
      :pwm_init
      :PWM    
      :pwm_init(uint32 freq, uint32 *duty, uint32 pwm_channel_num, uint32 (*pin_info_list)[3]);
      :PWM GPIO,          
      :
        uint32 freq: PWM    
        uint32 *duty:         
        uint32 pwm_channel_num: PWM    。
        uint32 (*pin_info_list)[3]: PWM      GPIO     ,       n*3      。       GPIO     ,   PIN    IO    ,  GPIO      。
      :      3     PWM。
        uint32 io_info[][3] = 
        {{PWM_0_OUT_IO_MUX, PWM_0_OUT_IO_FUNC, PWM_0_OUT_IO_NUM},
         {PWM_1_OUT_IO_MUX, PWM_1_OUT_IO_FUNC, PWM_1_OUT_IO_NUM},
         {PWM_2_OUT_IO_MUX, PWM_2_OUT_IO_FUNC, PWM_2_OUT_IO_NUM}};
        pwm_init(light_param.pwm_period, light_param.pwm_duty, 2, io_info);
      :        。        。
       : 
      :pwm_set_period
      :   PWM   
      :pwm_set_period(uint32 period)
      :   PWM   ,   us。
           :1KHz PWM,     1000us.
      :uint32 period:PWM   
      :          pwm_start()     。
       : 
      :pwm_set_duty
      :   PWM           
        :pwm_set_duty(uint32 duty, uint8 channel);
      :   PWM    。     PWM           ,duty      PWM     。    :period * 1000 / 45 ( 1KHz  :duty     0 ~ 22222)。
        :uint32 duty:       ,      (duty * 45) / (period * 1000).
             uint8 channel:       PWM   ,  PWM_CHANNEL       。
      :          pwm_start()     。
       : 
      :pwm_get_period
      :     PWM   
        :pwm_get_period(void)
        : 
       :PWM   ,  us.
      :pwm_get_duty
      :     channel     PWM     duty   。
        :pwm_get_duty(uint8 channel)
        :uint8 channel:       PWM    ,  PWM_CHANNEL       
      :         pwm_start()    。
       :channel         ,       (duty * 45) / (period * 1000)。
      :pwm_start
      :PWM     
        :pwm_start(void);
        : 
      :PWM          ,     pwm_start()     
       : 

    3. 사용자 정의 채널
    사용 자 는 GPIO 4 가 PWM 으로 출력 되 는 네 번 째 채널 을 추가 할 수 있 으 며 설정 절 차 는 다음 과 같다.
    1.        。
        uint32 io_info[][3] = 
        {
            {PWM_0_OUT_IO_MUX, PWM_0_OUT_IO_FUNC, PWM_0_OUT_IO_NUM},
            {PWM_1_OUT_IO_MUX, PWM_1_OUT_IO_FUNC, PWM_1_OUT_IO_NUM},  
            {PWM_2_OUT_IO_MUX, PWM_2_OUT_IO_FUNC, PWM_2_OUT_IO_NUM},
            {PWM_3_OUT_IO_MUX, PWM_3_OUT_IO_FUNC, PWM_3_OUT_IO_NUM},   
            {PWM_4_OUT_IO_MUX, PWM_4_OUT_IO_FUNC, PWM_4_OUT_IO_NUM},      
        };
        pwm_init(light_param.pwm_period, light_param.pwm_duty, PWM_CHANNEL, io_info);
    2.    user_light.h   
        #define PWM_0_OUT_IO_MUX        PERIPHS_IO_MUX_MTDI_U
        #define PWM_0_OUT_IO_NUM        12
        #define PWM_0_OUT_IO_FUNC       FUNC_GPIO12
        #define PWM_1_OUT_IO_MUX        PERIPHS_IO_MUX_MTDO_U
        #define PWM_1_OUT_IO_NUM        15
        #define PWM_1_OUT_IO_FUNC       FUNC_GPIO15
        #define PWM_2_OUT_IO_MUX        PERIPHS_IO_MUX_MTCK_U
        #define PWM_2_OUT_IO_NUM        13
        #define PWM_2_OUT_IO_FUNC       FUNC_GPIO13
        #define PWM_3_OUT_IO_MUX        PERIPHS_IO_MUX_GPIO4_U
        #define PWM_3_OUT_IO_NUM        4
        #define PWM_3_OUT_IO_FUNC       FUNC_GPIO4
        #define PWM_4_OUT_IO_MUX        PERIPHS_IO_MUX_GPIO5_U
        #define PWM_4_OUT_IO_NUM        5
        #define PWM_4_OUT_IO_FUNC       FUNC_GPIO5
        #define PWM_CHANNEL             5

    좋은 웹페이지 즐겨찾기