ESP32之PWM输出

        许多设备的控制都依赖于PWM波的精确调整,例如,电机速度控制、LED亮度调节、步进电机驱动等都离不开PWM波。ESP32官方为我们提供了便捷的PWM使用方法,那么我们就以输出50%占空比的PWM波为例来了解一下如何进行PWM的输出操作。

        首先,老规矩我们还是来看一下官方的实现方案是什么如何进行操作。请看根据官方的文档,文档中写明了需要通过定时器配置,通道配置,改变PWM信号三个步骤来实现PWM波形的输出。

那么我们按照官方的文档首先进行的步骤就是定时器的配置:

 配置定时器:
分辨率:13bit

频率:4000Hz

速度模式:低速

定时器:Timer_0

时钟:自动时钟

   ledc_timer_config_t ledc_timer = {
       .duty_resolution = LEDC_TIMER_13_BIT, 
        .freq_hz = 4000,                      
        .speed_mode = LEDC_LOW_SPEED_MODE,    
        .timer_num = LEDC_TIMER_0,
        .clk_cfg=LEDC_AUTO_CLK              
    };
    ESP_ERROR_CHECK(ledc_timer_config(&ledc_timer));

第二步我们应该进行的是通道配置之: 

通道:通道0

占空比:0(后面会设置目前先设置为0)

gpio_num(引脚号):整个值具体的自己传

速度模式:低速模式

始终选择:Time0

   ledc_channel_config_t ledc_channel = {
        .channel    = LEDC_CHANNEL_0,        
        .duty       = 0,                       
        .gpio_num   = gpio_num,                       
        .speed_mode = LEDC_LOW_SPEED_MODE,    
        .hpoint     = 0,                       
        .timer_sel  = LEDC_TIMER_0             
    };
    ESP_ERROR_CHECK(ledc_channel_config(&ledc_channel));

第三步我们进行改变PWM信号的配置:

根据官方的文档呢我们应该进行的操作是首先设置占空比

 

我们应该首先设置占空比然后再更新占空比

  ESP_ERROR_CHECK(ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, rate));
  ESP_ERROR_CHECK(ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0));

 然后把这玩意统一一下完整一点的代码就是:

这里的最大占空比是通过官方的2的13次方得出的分辨率为13。

typedef enum{
    MIN_PWM_RATE=0,
    LOW_PWM_RATE=1024,      //25%
    MID_PWM_RATE=4096,      //50%
    HIGH_PWM_RATE=8192,     //75%
    MAX_PWM_RATE=8192       //MAX PWM_RATE = 2 ** 13 = 8192
}PWM_RATE_T;


void PwmDev_Init(int gpio_num,PWM_RATE_T rate)
{
    ledc_timer_config_t ledc_timer = {
        .duty_resolution = LEDC_TIMER_13_BIT, 
        .freq_hz = 4000,                      
        .speed_mode = LEDC_LOW_SPEED_MODE,    
        .timer_num = LEDC_TIMER_0,
        .clk_cfg=LEDC_AUTO_CLK             
    };
    ESP_ERROR_CHECK(ledc_timer_config(&ledc_timer));

  
    ledc_channel_config_t ledc_channel = {
        .channel    = LEDC_CHANNEL_0,        
        .duty       = 0,                       
        .gpio_num   = gpio_num,                       
        .speed_mode = LEDC_LOW_SPEED_MODE,    
        .hpoint     = 0,                       
        .timer_sel  = LEDC_TIMER_0             
    };
    ESP_ERROR_CHECK(ledc_channel_config(&ledc_channel));
    ESP_ERROR_CHECK(ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, rate));
    ESP_ERROR_CHECK(ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0));
}

extern "C" void app_main(void)
{

PwmDev_Init();
    while(1)
{


}

}

ok,最后的实现效果如下 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值