这里主要用于控制舵机,使用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,和总计数控制频率。