这里主要用于控制舵机,使用TIM1模拟了5路50Hz的PWM信号,只调节占空比控制舵机角度。
最大能模拟多少路没有具体测试。
缺点:因为是定时器中断模拟(中断比较频繁),所以会影响main函数运行。
LED p1('A',8); //IO口初始化,这里就不介绍了,推挽输出 LED p2('A',9); LED p3('A',10); LED p4('A',11); LED p5('A',4); u16 count=0; u16 pwm_count=1000; //总计数 周期20ms,20us进次 u16 pwm1=25; u16 pwm2=25; u16 pwm3=25; u16 pwm4=125; u16 pwm5=125; extern "C" void TIM4_IRQHandler(void)//1ms进来1次 { if(TIM4->SR&0X0001)//溢出中断 { count++; if(count<pwm1) { PAout(8)=1; } else{ PAout(8)=0; } //------------------------------- if(count<pwm2) { PAout(9)=1; } else{ PAout(9)=0; } //------------------------------ if(count<pwm3) { PAout(10)=1; } else{ PAout(10)=0; } //-------------------------------- if(count<pwm4) { PAout(11)=1; } else{ PAout(11)=0; } //------------------------------- if(count<pwm5) { PAout(4)=1; } else{ PAout(4)=0; } if(count==pwm_count)count=0; } TIM4->SR&=~(1<<0);//清除中断标志位 } //使能定时器4,使能中断. void Timer1_Init(u16 arr,u16 psc) { RCC->APB1ENR|=1<<2; //TIM4时钟使能 TIM4->ARR=arr; //设定计数器自动重装值 TIM4->PSC=psc; //预分频器71,得到1Mhz的计数时钟 TIM4->DIER|=1<<0; //允许更新中断 TIM4->CR1|=0x01; //使能定时器2 MY_NVIC_Init(1,1,TIM4_IRQn,2);//抢占1,子优先级1,组2(组2中优先级最高的) }
Timer1_Init(19,71); 初始化就好,20us一次中断。
通过更改这些值控制舵机角度
19,和总计数控制频率。