赞
踩
基于STM32F103C8T6的循迹避障小车完整制作过程(详细)----中篇(第456点)
上篇主要是讲一些基础的东西,中篇讲了如何制作循迹,本篇讲一下制作避障小车。
这位博主讲的很详细:
stm32 智能避障小车(二)之sg90
我对他其中的一些关键信息再说明一下:
1,接线
橙色信号线
红色正极
棕褐色负极
2,舵机控制对pwm的要求
舵机的控制需要一个20ms的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分:
t = 0.5ms——————-舵机会转动 0 °
t = 1.0ms——————-舵机会转动 45°
t = 1.5ms——————-舵机会转动 90°
t = 2.0ms——————-舵机会转动 135°
t = 2.5ms——————-舵机会转动180°
我设置的是在转90度的时候为舵机的正前方,这样就能让舵机左右转了。
好了,经过上面的分析我们可以开始写程序了,思路如下:
利用定时器输出一个占空比可调的pwm,且这个pwm的周期为20ms。
下面看一下我的sg90.c文件:
#include "sg90.h" void SG90_pwm_init(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_OCInitTypeDef TIM_OCInitStructure; /* 开启时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); /* 配置GPIO的模式和IO口 */ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;// PA1 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出 GPIO_Init(GPIOA,&GPIO_InitStructure); //TIM3定时器初始化 TIM_TimeBaseInitStructure.TIM_Period = 199; //PWM 频率=72000/(199+1)=36Khz//设置自动重装载寄存器周期的值 TIM_TimeBaseInitStructure.TIM_Prescaler = 7199;//设置用来作为TIMx时钟频率预分频值 TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;//设置时钟分割:TDTS = Tck_tim TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM2, & TIM_TimeBaseInitStructure); //PWM初始化 //根据TIM_OCInitStruct中指定的参数初始化外设TIMx TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//PWM输出使能 TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low; TIM_OC2Init(TIM2,&TIM_OCInitStructure); //注意此处初始化时TIM_OC1Init而不是TIM_OCInit,否则会出错。因为固件库的版本不一样。 TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);//使能或者失能TIMx在CCR1上的预装载寄存器 TIM_Cmd(TIM2,ENABLE);//使能或者失能TIMx外设 }
下面是sg90.h文件内容:
#ifndef __SG90_H
#define __SG90_H
#include "stm32f10x.h"
#include "delay.h"
#define SG90_Right_90 TIM_SetCompare2(TIM2, 195) //右转90度
#define SG90_Right_45 TIM_SetCompare2(TIM2, 190)
#define SG90_Front TIM_SetCompare2(TIM2, 185) //舵机摆正
#define SG90_Left_45 TIM_SetCompare2(TIM2, 180) //左转45度
#define SG90_Left_90 TIM_SetCompare2(TIM2, 175)
void SG90_pwm_init(void); //舵机pwm初始化
#endif
我来解释一下舵机代码比较关键的几个参数设置:
1,引脚怎么接?
PA1接舵机橙色线。
2,设置周期为20ms
TIM_TimeBaseInitStructure.TIM_Period = 199;
TIM_TimeBaseInitStructure.TIM_Prescaler = 7199;
通过这两句话,根据周期计算公式:
PW
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。