软硬件型号
STM32F103RCT开发板
STM32CUBEMX+KEIL5编程
STM32F1 1.8.3 库版本
一、舵机需要什么信号?
- 正负极电压信号:这个具体要看购买的舵机为那种类型,有3.3v的,8.0v的,还有各种的类型。
- 脉宽调制信号(PWM):对于180°的舵机,一般来说周期为20ms(频率为50Hz),脉宽(一个周期内高电平持续时间)为500–2500us。其中为1500us使得舵机转轮处于中间位置,可以理解为90°的位置,为500-1500us和1500–2500us之间分别会朝着0–90°和90–180°的方向旋转。
二、实现步骤
1. CUBE配置
这里仅以TIM2和它的通道2进行配置(选择芯片等基本内容不再赘述):
- 时钟树配置
此处我是直接利用的的默认的分频系数,没有进行改动,根据自己的需求改动即可。 - 选择晶振时钟
点击RCC
选择石英晶振
- 选择定时器及其通道
- 计算分频系数等参数
- 这里频率是8MHz,首先将其800分频:
不知道这里八百分频为什么要写成800-1,建议先看下数电的计数器部分巩固基础知识。 - 现在的计数器加一需要消耗的事件为1/(8MHz/800)= 0.1ms,想要周期为20ms,那就需要计数20/0.1 = 200次,那么自动重装载值就是200
- 现在周期为20ms,我们需要设置脉宽了,计数200就是20ms,想要高电平持续时间为1.5ms,就需要计数15次,那么我们的比较值就需要是15啦
如果我们想要改变他的初始值的话就在代码里边改变CCR的值就可以了。
- 接着导出代码
2. 代码添加
- 启动PWM的输出
在main函数里边添加:
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);
表示启动定时器2,通道2的PWM输出
2. 在while循环里边添加:
TIM2->CCR2=10;
HAL_Delay(2000);
TIM2->CCR2=20;
HAL_Delay(2000);
表示改变比较值,使输出的脉宽在1000us和2000us之间进行切换,从而实现角度的偏转。
3. 整体main函数如下:
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM2_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
TIM2->CCR2=10;
HAL_Delay(2000);
TIM2->CCR2=21;
HAL_Delay(2000);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}