实验8 PWM输出实验
用STM32的定时器来产生PWM呼吸灯。
代码讲解
main.c
int main(void)
{
u16 led0pwmval=0;
u8 dir=1;
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
LED_Init(); //LED端口初始化
TIM3_PWM_Init(899,0); //不分频。PWM频率=72000000/900=80Khz
while(1)
{
delay_ms(10);
if(dir)led0pwmval++;//led0pwmval:需要与当前值作比较地比较值
else led0pwmval--;
if(led0pwmval>300)dir=0;
if(led0pwmval==0)dir=1;
TIM_SetCompare2(TIM3,led0pwmval);
}
}
1、TIM3_PWM_Init(899,0)
PWM频率=72000000/(psc+1)/(arr+1)=72Mhz/900=80Khz。表示从0计数到899,频率为72MHz。
2、while内执行过程:
第一次进入while循环时,由于一开始led0pwmval=0,所以10ms内一直处于高电平的状态。
当led0pwmval=1。且计数值<led0pwmval时,出现低电平,剩下的全部是高电平。当led0pwmval=2。计数值<led0pwmval,出现低电平,剩下的全部是高电平,以此类推…直到led0pwmval=300,开始自减,持续之前的比较过程。
timer.c
TIM3_PWM_Init
1、使能GPIO外设和AFIO复用功能模块时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器3时钟
RCC_APB2PeriphClockCmd