pwm control steering gear experiment

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 gear

Most 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.
Insert picture description here
It looks like this after separation. Note that the yellow thread does not have a plastic shell and should be protected.
Insert picture description here
This is how it is plugged into the microcontroller.
Insert picture description here

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!

Guess you like

Origin blog.csdn.net/innumai/article/details/112794706