目录
1、PWM介绍
1.STM32F103C8T6 PWM资源:
2.PWM输出模式
3.PWM周期与频率
4.不同IO口输出PWM相对应连接到定时器的那一路
2、sg90舵机介绍及实战
1.sg90舵机介绍
2.代码实现
1.codeMX配置
2.用到的HAL库函数
1.开始产生PWM信号
返回状态值
2.修改比较值,修改占空比
具体代码
看这篇文章之前如果对PWM波和SSG90舵机不熟悉可以先看我之前51的文章
51—PWM开发SG90舵机
在51的时候因为芯片没有集成PWM功能,所以我们当时是使用IO口模拟的,在STM32上芯片已经集成了PWM功能,所以我们直接使用即可。
1、PWM介绍
1.STM32F103C8T6 PWM资源:
- 高级定时器(TIM1):7路
- 通用定时器(TIM2~TIM4):各4路
(这是我的单片机的,这个可以在芯片手册查看)
2.PWM输出模式
- PWM模式1:在向上计数时,一旦 CNT < CCRx 时输出为有效电平,否则为无效电平; 在向下计数时,一旦 CNT > CCRx 时输出为无效电平,否则为有效电平。
- PWM模式2:在向上计数时,一旦 CNT < CCRx 时输出为无效电平,否则为有效电平; 在向下计数时,一旦 CNT > CCRx 时输出为有效电平,否则为无效电平。
3.PWM周期与频率
【公式】:f=1/T,单位是s,单位是HZ。(其中大写字母T,表示周期,小写字母f表示频率)
PWM占空比由TIMx_CCRx寄存器决定
4.不同IO口输出PWM相对应连接到定时器的那一路
这个我们可以查看产品手册(都是可以查看到的)
2、sg90舵机介绍及实战
1.sg90舵机介绍
注意接线
PWM波的频率不能太高,大约50HZ,即周期=1/频率=1/50=0.02s,20ms左右。
确定周期/频率
如果周期为20ms,则 PSC=7199,ARR=199(这两个值也可以是其它的)
角度控制
- 0.5ms-----------0度; 2.5% 对应函数中CCRx为5
- 1.0ms-----------45度; 5.0% 对应函数中CCRx为10
- 1.5ms-----------90度; 7.5% 对应函数中CCRx为15
- 2.0ms-----------135度; 10.0% 对应函数中CCRx为20
- 2.5ms-----------180度; 12.5% 对应函数中CCRx为25
2.代码实现
需求:每隔1s,转动一个角度:0度 --> 45度 --> 90度 --> 135度 --> 180度 --> 0度
1.codeMX配置
2.用到的HAL库函数
1.开始产生PWM信号
HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel)
参数1:定时器句柄
参数2:使用通道
返回状态值
2.修改比较值,修改占空比
#define __HAL_TIM_SetCompare __HAL_TIM_SET_COMPARE
#define __HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__)
参数1:定时器句柄
参数2:使用通道
参数3:指定捕获比较寄存器的新值(占空比)
具体代码
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_3);//启动定时器while (1){HAL_Delay(1000);__HAL_TIM_SetCompare(&htim4,TIM_CHANNEL_3,5);HAL_Delay(1000);__HAL_TIM_SetCompare(&htim4,TIM_CHANNEL_3,10);HAL_Delay(1000);__HAL_TIM_SetCompare(&htim4,TIM_CHANNEL_3,15);HAL_Delay(1000);__HAL_TIM_SetCompare(&htim4,TIM_CHANNEL_3,20);HAL_Delay(1000);__HAL_TIM_SetCompare(&htim4,TIM_CHANNEL_3,25);}