简述
脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。
代码原理
1 配置IO口----将对应四个IO使能并配置为复用 时钟B使能
2 部分重映射----寄存器MAPR第11-10位 置10 不需要可删除中间三段代码 相应IO口配置发生改变
3 舵机需要一段20ms的PWM波
f=1/T
T=(arr*(psc+1))/72000000
定时器3时钟为72M =72000000
推荐使用 arr=199,psc=7199
f=50HZ
4 舵机的转动角度
在20ms中 对应0.5-2.5ms 为0-180°
即(arr+1)*(0.5/20)=5
每修改寄存器5个单位转动45度
TIM3->CCR1=195;0度
TIM3->CCR1=190;45度
TIM3->CCR1=185;90度
TIM3->CCR1=180;135度
TIM3->CCR1=175;180度
5 定时器3单个通道配置且预装载使能 定时器使能
TIM3->CR1=0x0080; //ARPE使能
TIM3->CR1|=0x01; //使能定时器3
TIM3->CCMR1|=7<<4; //CH1 PWM2模式
TIM3->CCMR1|=1<<3; //CH1预装载使能
TIM3->CCER|=1<<0; //OC1 输出使能
总代码实现
main函数初始化为
TIM3_PWM_Init(199,7199);//PWM输出舵机驱动
Steering_Engine_Open(1000,195,4);//延时1000ms,0度,通道四PB1
Steering_Engine_Open(1000,195,3);//延时1000ms,0度,通道四PB0
Steering_Engine_Open(1000,195,2);//延时1000ms,0度,通道四PB5
Steering_Engine_Open(1000,195,1);//延时1000ms,0度,通道四PB4
定时器3初始化配置
void TIM3_PWM_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<1; //TIM3时钟使能
RCC->APB2ENR|=1<<3; //使能PORTB时钟
//此部分需手动修改IO口设置
GPIOB->CRL&=0XFFFFFFF0; //PB0输出
GPIOB->CRL|=0X0000000B; //复用功能输出
GPIOB->CRL&=0XFFFFFF0F; //PB1输出
GPIOB->CRL|=0X000000B0; //复用功能输出
GPIOB->CRL&=0XFFF0FFFF; //PB4输出
GPIOB->CRL|=0X000B0000; //复用功能输出
GPIOB->CRL&=0XFF0FFFFF; //PB5输出
GPIOB->CRL|=0X00B00000; //复用功能输出
RCC->APB2ENR|=1<<0; //开启辅助时钟
AFIO->MAPR&=0XFFFFF3FF; //清除MAPR的[11:10]
AFIO->MAPR|=1<<11; //部分重映像,TIM3_CH2->PB5
TIM3->ARR=arr; //设定计数器自动重装值
TIM3->PSC=psc; //预分频器不分频
TIM3->CR1=0x0080; //ARPE使能
TIM3->CR1|=0x01; //使能定时器3
TIM3->CCMR1|=7<<4; //CH1 PWM2模式
TIM3->CCMR1|=1<<3; //CH1预装载使能
TIM3->CCMR1|=7<<12; //CH2 PWM2模式
TIM3->CCMR1|=1<<11; //CH2预装载使能
TIM3->CCMR2|=7<<4; //CH3 PWM2模式
TIM3->CCMR2|=1<<3; //CH3预装载使能
TIM3->CCMR2|=7<<12; //CH4 PWM2模式
TIM3->CCMR2|=1<<11; //CH4预装载使能
TIM3->CCER|=1<<0; //OC1 输出使能
TIM3->CCER|=1<<4; //OC2 输出使能
TIM3->CCER|=1<<8; //OC3 输出使能
TIM3->CCER|=1<<12; //OC4 输出使能
}
调用函数
//舵机转动开始
//time 延时时间
//degree 角度 195-175
//num 定时器3通道对应不同IO引脚如:PB0/PB1/…
void Steering_Engine_Open(int times,int degree,int num)
{
delay_ms(times);
switch(num)
{
case 1:TIM3->CCR1=degree;
break;
case 2:TIM3->CCR2=degree;
break;
case 3:TIM3->CCR3=degree;
break;
case 4:TIM3->CCR4=degree;
break;
}
}