learning target:
Complete the basic control of the single-chip steering gear
Learning Content:
1. Understanding and application of pwm
2. Learning to assemble the steering gear correctly
3. Programming to make the steering gear move
study-time:
January 18, 2021
Learning output:
1. keil5 pwm control steering gear engineering 2. CSDN technical blog 1 chapter 3. Complete the preliminary application of steering gearMost of the servos bought are closed with three wires like the picture below. The brown is GND, the red is the 5V power line of the servo, and the yellow is the PWM signal line. To plug into the STM32F1 elite board, we need to separate the yellow wire.
It looks like this after separation. Note that the yellow thread does not have a plastic shell and should be protected.
This is how it is plugged into the microcontroller.
code segment
timer.c
//designed by HIT TDD
#include "timer.h"
void TIM3_PWM_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //初始化定时器
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器3时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射 TIM3_CH2->PB5
//设置该引脚为复用输出功能,输出TIM3 CH2的P`在这里插入代码片`WM脉冲波形 GPIOB.5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
//初始化TIM3
TIM_TimeBaseStructure.TIM_Period = 199; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler = 7199; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
//初始化TIM3 Channel2 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性高
TIM_OC2Init(TIM3, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC2
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装载寄存器
TIM_Cmd(TIM3, ENABLE); //使能TIM3
}
timer.h
#ifndef __TIMER_H
#define __TIMER_H
#include "sys.h"
void TIM3_PWM_Init(void);
#endif
main.c
#include "delay.h"
#include "sys.h"
#include "timer.h"
int main(void)
{
u16 pwmval;
delay_init();
TIM3_PWM_Init();
//设175为0度,则195为180度
pwmval = 175;
TIM_SetCompare2(TIM3, pwmval);
delay_ms(500);
pwmval = 195;
TIM_SetCompare2(TIM3, pwmval);
delay_ms(500);
// while(1)
// {
// for(pwmval = 195; pwmval >= 175; pwmval -= 5)
// {
// TIM_SetCompare2(TIM3,pwmval);
// delay_ms(500);
// }
// }
}
If you move this code intact into the project, the error will be reported because the IO port is reused. Just pre-compile some and find the conflicting place and use // comment it out!