做网站要ftp信息吗,长沙做网站要微联讯点很好,建一个购物网站多少钱,什么是网站推广方案PWM PWM (Pulse Width Modulation) 是一种模拟信号电平的方法#xff0c;它通过使用数字信号#xff08;通常是方波#xff09;来近似地表示模拟信号。在PWM中#xff0c;信号的占空比#xff08;即高电平时间占整个周期的比例#xff09;被用来控制平均输出电压或电流。…PWM PWM (Pulse Width Modulation) 是一种模拟信号电平的方法它通过使用数字信号通常是方波来近似地表示模拟信号。在PWM中信号的占空比即高电平时间占整个周期的比例被用来控制平均输出电压或电流。 PWM在许多应用中都非常重要特别是那些需要精确控制模拟信号的应用如电机控制、LED亮度调节、音频放大器等。以下是PWM的一些关键特点和优势 高效能PWM允许在开关电源中精确控制能量传输从而提高效率。简单实现PWM可以通过数字电路或微控制器轻松实现。减少功耗在需要调节功率的应用中PWM可以确保只有必要的能量被传输从而减少了不必要的功耗。降低噪声与模拟控制相比PWM可以减少由模拟电路引起的噪声。精确控制通过改变PWM信号的占空比可以非常精确地控制输出电压或电流。 在电机控制中PWM通常用于控制电机的速度和方向。通过改变PWM信号的占空比可以精确地控制电机的平均电压从而控制电机的速度和扭矩。 在LED亮度调节中PWM也被广泛使用。通过改变PWM信号的占空比可以控制LED的平均电流从而控制LED的亮度。这种方法比使用模拟电阻来调节亮度更加高效和精确。 总之PWM是一种非常有用的技术它允许我们使用数字信号来精确控制模拟信号的电平。 以上介绍来自文心一言。
简而言之PWM就是我们把定时器的计数器的值拿来和一个数做比较计数器的值比较大的时候我们就输出高低电平反之输出低高电平。
因此PWM离不开定时器所以一写完上一篇定时器我就写了这PWM。
GD32E230中的PWM
因为我们上一篇是用的通用L4类型的定时器15因此我们主要来看看这个类型的定时器的PWM。 我们这个类型的定时器是有PWM的不过只有一个通道。
根据数据手册可以看到定时器15的唯一一个通道是GPIOB的8号引脚。 知道这个之后就够了接下来可以看看相关的固件库函数了。
固件库函数
在固件库使用指南中没有单独的PWM章节是和定时器在一起的我这边就挑我们用的到的说说。
我们可以拿上一篇定时器的代码接着用配置定时器什么的都可以留着把中断部分删掉就行剩下就是配置一个PWM通道输出的就行。
timer_channel_output_config 配置定时器的通道输出传入的参数有定时器还有待配置通道我们通用L4的没得选只能用通道0高级定时器的话是有四个通道可以用的。
最后一个参数是结构体变量的指针。
我们来看看这个结构体是怎么样的。 一共六个成员首先第一个通道输出状态那必然是要使能的TIMER_CCX_ENABLE。
第二个互补通道输出状态一样给个使能TIMER_CCXN_ENABLE。
第三第四通道输出极性和互补通道输出极性我们都给个高电平TIMER_OC_POLARITY_HIGHTIMER_OCN_POLARITY_HIGH。表示当输出比较生效的时候我们通道输出高电平。
第五第六个空闲状态下通道输出我们和上面非空闲状态来个不一样的低电平TIMER_OC_IDLE_STATE_LOWTIMER_OCN_IDLE_STATE_LOW。表示当输出比较不生效的时候我们通道输出低电平。
具体这个输出比较的方法我们后面会再配置。
在我们配置结构体成员之前我们需要先调用一个函数。
timer_channel_output_struct_para_init 就是这个函数在配置之前先用这个函数进行初始化。
timer_channel_output_mode_config 设置输出比较模式。
我们主要看看模式0和模式1一般都选模式0。 简单来说模式0是当我们计数器的值小于我们设置的值时通道输出我们之前设置好的极性我们上面选了高电平反之输出空闲状态下的电平我们上面选了低电平。
模式1和模式0相反。
timer_primary_output_config 上面的配置完之后记得还有之前的定时器也要先配置好我们调用这个函数就可以使能通道输出了。
timer_channel_output_pulse_value_config 设置通道输出的比较值要注意的是它需要和计数器的值做比较因此它不要大于计数器的最大值就是我们配置定时器时的周期值否则永远都无法触发。
呼吸灯示例代码
因为我们设置的定时器周期值就是计数器达到的最大值并且是需要和输出比较值做比较的因此我们最好是选择10的倍数这样好计算占空比。
#include gd32e23x.h
#include systick.hint main(void){systick_config();rcu_periph_clock_enable(RCU_TIMER15); //开启定时器时钟 rcu_periph_clock_enable(RCU_GPIOB); gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE,GPIO_PIN_8); gpio_output_options_set(GPIOB,GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_8); gpio_af_set(GPIOB,GPIO_AF_2,GPIO_PIN_8);timer_parameter_struct timer_initpara; timer_initpara.prescaler 72 - 1; //预分频timer_initpara.alignedmode TIMER_COUNTER_EDGE; //边缘对齐timer_initpara.counterdirection TIMER_COUNTER_UP; //向上计数timer_initpara.period 1000 - 1; //周期 最好是10的倍数,这样好计算占空比timer_init(TIMER15,timer_initpara); //初始化定时器timer_prescaler_config(TIMER15, 1, TIMER_PSC_RELOAD_NOW);//设置预分频器为立即加载模式timer_enable(TIMER15); //使能定时器timer_oc_parameter_struct timer_ocinitpara;timer_channel_output_struct_para_init(timer_ocinitpara); //先初始化一下配置结构体timer_ocinitpara.outputstate TIMER_CCX_ENABLE; //使能timer_ocinitpara.outputnstate TIMER_CCXN_ENABLE;timer_ocinitpara.ocpolarity TIMER_OC_POLARITY_HIGH; //高电平timer_ocinitpara.ocnpolarity TIMER_OCN_POLARITY_HIGH;timer_ocinitpara.ocidlestate TIMER_OC_IDLE_STATE_LOW; //低电平timer_ocinitpara.ocnidlestate TIMER_OCN_IDLE_STATE_LOW;timer_channel_output_config(TIMER15,TIMER_CH_0, timer_ocinitpara); //配置通道输出timer_channel_output_mode_config(TIMER15, TIMER_CH_0, TIMER_OC_MODE_PWM0);// 配置定时器通道输出比较模式timer_primary_output_config(TIMER15, ENABLE); //使能输出比较while(1){for(uint16_t i0;i1000;i){timer_channel_output_pulse_value_config(TIMER15,TIMER_CH_0,i);delay_ms(1);}}
}