基于STM32F103C8T6的循迹避障小车完整制作过程(详细)----下篇(第789点)

接中篇

基于STM32F103C8T6的循迹避障小车完整制作过程(详细)----中篇(第456点)

上篇主要是讲一些基础的东西,中篇讲了如何制作循迹,本篇讲一下制作避障小车。

七,如何用使用pwm让舵机旋转到相应的角度

这位博主讲的很详细:
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;
通过这两句话,根据周期计算公式:
PWM周期为 (7200*200)/72000000=0.02=20ms

  • 221
    点赞
  • 1363
    收藏
    觉得还不错? 一键收藏
  • 165
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 165
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值