STM32F103RCT6 实验代码之舵机实验代码之舵机+超声波避障小车(二)舵机超声波避障小车(二)舵机+超声波超声波
舵机舵机+超声波简介超声波简介一.SG90舵机二.超声波数据处理
补充一下上一篇博客遗漏掉的一个问题,一般电机的PWM都是有一些频率限制的,而我的直流电机是10Khz来进行驱动的。
一一.SG90舵机舵机
这个是我买的舵机+超声波模块,这个舵机是SG90模拟舵机,网上有很多的资料
模拟电机与数字电机的区别
SG90的驱动是靠不同占空比的50hz的PWM波来控制
0度——>2.5%
45度——>5%
90度——>7.5%
135度——>10%
180度——>12.5%
不同的占空比对应转过不同的角度
我在网上找了一些文章,大概有两种实现操控舵机的方法,第一种是直接输入不同的占空比来控制转过的角度,第二种是连续改变占空比来改变角度,首先我来初始化一下PWM波:
#include "sg90.h"
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void sg90_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);//
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); //使能GPIO外设时钟使能
//设置该引脚为复用输出功能,输出TIM1 CH2的PWM脉冲波形
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //TIM_CH2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period = 199; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 80K
TIM_TimeBaseStructure.TIM_Prescaler =7199; //设置用来作为TIMx时钟频率除数的预分频值 不分频
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1 ; //选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性高
TIM_OC4Init(TIM1, &TIM_OCInitStructure); //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
TIM_CtrlPWMOutputs(TIM1,ENABLE); //MOE 主输出使能
TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable); //CH3预装载使能
TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器
TIM_Cmd(TIM1, ENABLE); //使能TIM1
}
接下来是两种不同的控制方法:
第一种:第一种:
在.h文件里宏定义不同占空比的PWM波
#ifndef __SG90_H
#define __SG90_H
#include "sys.h"
#define SG90_Right_90 TIM_SetCompare4(TIM1, 195)
#define SG90_Right_45 TIM_SetCompare4(TIM1, 190)
#define SG90_Front TIM_SetCompare4(TIM1, 185)
#define SG90_Left_45 TIM_SetCompare4(TIM1, 180)
#define SG90_Left_90 TIM_SetCompare4(TIM1, 175)
void sg90_Init(void);
#endif
之后再main函数里进行操作:
while(1)
{
SG90_Left_90;
delay_ms(700);
SG90_Left_45;
delay_ms(700);
评论0