• 基于STM32的智能小车--舵机云台设计


    基于STM32的智能小车

    第一章 基于STM32的智能小车方案设计
    第二章 基于STM32的智能小车–电机驱动设计
    第三章 基于STM32的智能小车–循迹设计
    第四章 基于STM32的智能小车–避障设计



    前言

    本篇主要针对某宝上制作智能小车过程中用到的控制舵机设计进行统一阐述,为大家提供参考。


    一、控制舵机是什么?

    舵机(舵机也称伺服电机,servomotor)已经有很长时间的应用了,它的体积很小,作用大,主要用于角度控制,通常使用于航模、智能小车、机器人,在工业上也有应用,比如船舶,导弹姿态变换的俯仰、偏航、滚转运动都是靠舵机相互配合完成的。
    在这里插入图片描述
    ①:信号线:接收来自微控制器的控制信号;
    ②:电位器:可以测量输出轴的位置量,属于整个伺服机构的反馈部分;
    ③:内部控制器:处理来自外部控制的信号,驱动电机以及处理反馈的位置信号,是整个伺服机构的核心;
    ④:电机:作为执行机构,输出多少转速,转矩,位置;
    ⑤:传动机构/舵机系统:该机构根据一定传动比,将电机输出的行程缩放到最终输出的角度上;

    二、舵机SG90

    1、舵机参数

    产品类型:SG90舵机
    产品扭矩:2.0kg/cm(4.8V)2.2kg/cm(6V)
    产品速度:0.09/60°(4.8V)0.08/60°(6V)
    转动角度:180°
    工作电压:4.8 ~ 6V
    齿轮形式:塑料齿轮
    死区设定:7us (微秒)
    产品重量:10.5g
    产品尺寸:22.8mm × 12.2mm × 28.5mm
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2、实物图和接线

    在这里插入图片描述

    舵机上有三根线,分别是GND(棕色线)、VCC(红色线)和SIG(黄色线),也就是地线、电源线和信号线。
    
    • 1

    3、控制原理及PWM配置

    舵机的控制,需要一个20ms的时基脉冲,控制高电平时间为0.5ms~2.5ms范围内即可控制舵机在0 ~ 180°转动。

    PWM周期为20ms = (7200*200)/72000000=0.02
    所以TIM_Period = 199,TIM_Prescaler = 7199

    占空比 = t / T 相关参数如下:

    t = 0.5ms——————-舵机会转动 0 °
    t = 1.0ms——————-舵机会转动 45°
    t = 1.5ms——————-舵机会转动 90°
    t = 2.0ms——————-舵机会转动 135°
    t = 2.5ms——————-舵机会转动180°
    
    • 1
    • 2
    • 3
    • 4
    • 5

    PWM占空比是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,由于PWM周期为20ms,所以(以舵机会转动 45°为例),占空比就应该为1ms/20ms = 5%,所以TIM_SetCompare1的 TIMx 捕获比较 1 寄存器值就为200-200*5% = 190
    在这里插入图片描述

    三、PWM控制

    1、PWM是什么?

    PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,例如方波的占空比就是50%。
    在这里插入图片描述

    2、PWM的频率

    PWM的频率: 是指1秒钟内信号从高电平到低电平再回到高电平的次数(一个周期);

    一秒钟PWM有多少个周期
    单位: Hz
    表示方式: 50Hz 100Hz
    
    • 1
    • 2
    • 3

    3、PWM的周期

    T=1/f
    周期=1/频率
    50Hz = 20ms 一个周期
    
    • 1
    • 2
    • 3

    如果频率为50Hz ,也就是说一个周期是20ms 那么一秒钟就有 50次PWM周期

    四、软件驱动代码编写

    #include "pwm.h"
    
    /*******************************************************************************
    * 函 数 名         : pwm_init
    * 函数功能		   : IO端口及TIM3初始化函数	   
    * 输    入         : 无
    * 输    出         : 无
    *******************************************************************************/
    void pwm_init()
    {
    	GPIO_InitTypeDef GPIO_InitStructure;   //声明一个结构体变量,用来初始化GPIO
    
    	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//声明一个结构体变量,用来初始化定时器
    
    	TIM_OCInitTypeDef TIM_OCInitStructure;//根据TIM_OCInitStruct中指定的参数初始化外设TIMx
    
    	/* 开启时钟 */
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
    
    	/*  配置GPIO的模式和IO口 */
    	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;// PC6
    	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
    	GPIO_Init(GPIOC,&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(TIM3, & TIM_TimeBaseInitStructure);
    
    	GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);//改变指定管脚的映射	//pC6
    
    	//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_OC1Init(TIM3,&TIM_OCInitStructure);
    	//注意此处初始化时TIM_OC1Init而不是TIM_OCInit,否则会出错。因为固件库的版本不一样。
    	TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);//使能或者失能TIMx在CCR1上的预装载寄存器
    	TIM_Cmd(TIM3,ENABLE);//使能或者失能TIMx外设
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    
    #include "public.h"
    #include "pwm.h"
    
    int main()
    {	  
    	pwm_init();	 //PWM初始化
    	while(1)
    	{
    		delay_ms(100);
    		TIM_SetCompare1(TIM3, 195);//0度
    		delay_ms(100);
    		TIM_SetCompare1(TIM3, 190);//45度
    		delay_ms(100);
    		TIM_SetCompare1(TIM3, 185);//90度
    		delay_ms(100);
    		TIM_SetCompare1(TIM3, 180);//135度
    		delay_ms(100);
    		TIM_SetCompare1(TIM3, 175);//180度
    		delay_ms(100);	
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    总结

    基于STM32智能小车的舵机云台控制介绍就到这里

  • 相关阅读:
    『MySQL快速上手』-④-表的操作
    记录 android studio 通过安装NDK 编译C文件,得到需要的so文件
    SVM 超平面计算例题
    opencv c++ 图像噪声及去噪
    【云原生之k8s】k8s安全机制
    动态规划之回文串问题
    Triton推理服务器吞吐量测试
    Seata概述
    OpenCV之摩尔纹
    java计算机毕业设计交通事故档案管理系统源码+数据库+系统+lw文档+mybatis+运行部署
  • 原文地址:https://blog.csdn.net/qq_34623621/article/details/125732520