中级会员
 
- 积分
- 331
- 金钱
- 331
- 注册时间
- 2016-10-12
- 在线时间
- 53 小时
|
一、PWM是什么?
PWM其实就是在一个周期内,高电平的持续时间可以调整的周期信号,有两个参数非常重要:频率和脉宽,频率是周期的倒数,而脉宽,一般会用占空比来表示,也就是高电平时间占周期的比例。
二、如何产生PWM
1、最简单粗暴,也是最直观的,用延时函数,这里推荐用硬件延时函数
初始化IO口
while(1)
{
置位端口
延时80ms
复位端口
延时20ms
}
这样就产生了一个周期为100ms,占空比为80%的PWM信号
2、有点技术含量的,使用定时器中断
初始化一个定时器,产生更新中断,在中断里累加一个变量
中断服务程序()
{
pwm_value++
if (pwm_value==80) 复位端口
if(pwm_value==100)
{
置位端口;
pwm_value=0;
}
}
这样就产生了一个占空比为80%的PWM信号,具体的周期,要卖定时器设定有并,如果定时器更新周期为1ms,那这个PWM的周期为100ms
3、真正的高大上,定时器产的比较功能,产生PWM信号
其它它的原理和上述第2种相拟,给定一个值,如果定时器的计数比这个值小,就输出高电平(这是可调的),如果大于这个值,就输出低电平(可调),只是说,上述是在中断里,靠CPU来控制,而定时器比较,就用的是硬件自己来控制,设定好以后,就完全不要CPU来参与。
部分代码如下:
void TIME_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitTypeDefStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
TIM_TimeBaseInitStructure.TIM_Period = 100-1;
TIM_TimeBaseInitStructure.TIM_Prescaler=840-1;
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);
TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM4,ENABLE);
TIM_OCInitTypeDefStructure.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OCInitTypeDefStructure.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInitTypeDefStructure.TIM_OCPolarity=TIM_OCPolarity_Low;
TIM_OC1Init(TIM14,&TIM_OCInitTypeDefStructure);
TIM_Cmd(TIM14,ENABLE);
}
int main(void)
{
TIME_Configuration();
while(1)
{
TIM_SetCompare1(TIM14,20);
}
}
上述代码,产生的PWM的频率=主时钟/重载数/定时器分频,所以,频率为:84M/840/100=1000
占空比为:比较数/重载数,上述代码为:20/100=20%
仅供大家参考,如有错误,敬请原谅!
|
|