准备工作:
1.硬件工具:
SG90舵机,单片机本体,一根usb数据线,杜邦线
2.软件工具:
STM32CubeMAX,STM32CubeIDE
3.需要了解
SG90舵机所需信号,脉宽调制信号(PWM):对于180°的舵机,一般来说周期为20ms(频率为50Hz),脉宽(一个周期内高电平持续时间)为500–2500us。其中为1500us使得舵机转轮处于中间位置,可以理解为90°的位置,为500-1500us和1500–2500us之间分别会朝着0–90°和90–180°的方向旋转。
4.接线
舵机从上至下的棕色红色橙色线分别对应GND,VCC,PWM信号线,注意vcc需接5v电压方可驱动,PWM信号线接单片机上D9引脚
1.配置CubeMAX
通过翻阅手册,这里选用D9引脚,定时器4通道4
打开cubemax,芯片选择等基础操作不再多赘述,来到引脚配置,找到D9对应的PD15,选择启用定时器
选择石英晶振
时钟树配置
接下来来到最重要的一步,配置PWM,首先启用通道4,开启内部时钟
这里频率是160MHz,首先将其16000分频:现在的计数器加一需要消耗的事件为1/(160MHz/16000)= 0.1ms,想要周期为20ms,那就需要计数20/0.1 = 200次,那么自动重装载值就是200,现在周期为20ms,我们需要设置脉宽了,计数200就是20ms,想要高电平持续时间为1.5ms,就需要计数15次,那么我们的比较值就需要是15
- 启动PWM的输出
在main函数里边添加:
HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_4);
表示启动定时器4,通道4的PWM输出
-
在while循环里边添加:
TIM4->CCR4=5;
HAL_Delay(2000);
TIM4->CCR4=15;
HAL_Delay(2000);
表示改变比较值,使输出的脉宽在500us和1500us之间进行切换,从而实现角度的偏转。
-
整体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();
/* Configure the System Power */
SystemPower_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_ICACHE_Init();
MX_MEMORYMAP_Init();
MX_TIM4_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_4);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
TIM4->CCR4=5;
HAL_Delay(2000);
TIM4->CCR4=15;
HAL_Delay(2000);
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
3.现象
8dfa09be359e3d448efa886bba11c8e4
可以看到定时器旋转了90度