智能小车上通过pwm控制云台和舵机

stm32控制的智能小车源代码核心部分分析,因为程序大量使用了stm32定时器的功能,所以先介绍一下定时的作用。当然,这些软硬件都是完全开放的。你可以深入细节的学习研究。

定时器最基本的功能就是定时处理事情;我们上层应用通常使用cpu循环定时处理事情,这样会浪费cpu资源,使得cpu处于停止状态或者无效状态,也就是空转;有定时器控制的话,就可以通过定时器技术循环或者终端cpu执行事件。打个比方,定时发送USART数据、定时采集AD数据、定时检测IO口电位、还可以通过IO口输出波形等。定时器可以实现非常丰富的功能。定时器是一个很强大的外设,不同行业使用的方式不同,知识面很广。主板是stm32,嵌入式c程序控制智能小车动起来

下面我们来介绍小车的程序实现主要功能模块以及模块之间的关系,最后梳理一下程序流程:

1:本车的功能模块介绍:

TIM1:主要启动小车的舵机,也就是转向轮子的驱动,通过TIM1定时器触发io引脚输出PWM波形,控制舵机轮子的转向

TIM2:云台控制,和TIM1的原理一样,控制云台上下左右的转向

TIM3:控制电机驱动,也就是小车的动力驱动,向前向后动起来,原理也是和TIM1一样,输出PWM波形,通过占空比控制小车的转速;

TIM4和TIM8一样:是接收阿克曼电机的反馈编码值,通过PID比例微积分反馈闭环,更加准确的控制电机;

TIM5:定时5ms循环控制逻辑,是各个控制逻辑的入口,比如:调节CCD、读取左右编码器的值并转换成速度、给上位机示波器、普通模式或者蓝牙模式或者ps2手柄模式、巡航模式控制、雷达模式、电磁模式

uart1:一键下载和ros上位机控制接口

uart3:蓝牙控制

uart5:雷达控制

2:上面这些模块之间的关系

智能小车程序框架核心功能关系框图

3:每个核心模块的程序核心实现流程

3个uart的初始化和终端调用流程都一样:MX_UART5_Init();MX_USART1_UART_Init();MX_USART3_UART_Init();初始化波特率、停止位等等。如果串口有数据收到,就会触发回调HAL_UART_RxCpltCallback进行逻辑处理;HAL_UART_RxCpltCallback是在使用STM32 HAL库时,用于处理UART接收数据的中断回调函数。当使用HAL_UART_Receive_IT函数启动UART接收数据中断后,每当接收到一个字符时,该回调函数HAL_UART_RxCpltCallback就会被调用一次。

几个定时器主要有3个不同用法,一个是基本定时器的用法,一个是pwm脉冲波的用法,一个是获取编码器的用法

1):普通定时器在TIM5中:

控制功能放在TIM5定时器中,设置的每5ms调用一次,通过基本定时器HAL_TIM_Base_Init功能进行初始化,psc设置,50分频,Period arr设置的7200,正好就是5ms, 通过基本定时器HAL_TIM_Base_Start_IT启动,触发TIM5_IRQHandler这个终端,然后调用HAL_TIM_IRQHandler,最后调用stm32 定时器提供的基本用户回调函数:HAL_TIM_PeriodElapsedCallback;

这里顺便介绍一下基本定时器的用法和原理:

  1. 信号频率由 TIMx_ARR 寄存器值决定,也叫做重载值为ARR。
  2. 占空比则由 TIMx_CCRx 寄存器值决定,比较值为CRRx。
  3. PSC其实就是缩小频率的功能,一般stm32的时钟频率72MHz

通过以上公式就可以计算出周期或者频率,就是项目中TIM5通过这种办法定时5ms执行控制逻辑,HAL_TIM_Base_*

2):pwm脉冲波在TIM1、TIM2、TIM3中

定时器脉冲PWM输出函数流程功能表

如果让速度或者舵机按照不同的脉冲控制,就需要修改比较值,实时修改比较值:__HAL__TIM__SET__COMPARE(x,x,x)

因为现在实现的是PA8,用的TIM1定时器,所以对应的PA11也是TIM1,所以也可以使用。

有的引脚可以重映射,gpio重映射写法是:

1:首先先使能重映射复用时钟: __HAL__RCC__AFIO__CLK__ENABLE()

2:然后查找手册"通用和复用功能I/O(GPIO/AFIO)里面的复用重映射和调试I/O配置寄存器"找到配置设置:

配置设置: __HAL__AFIO__REMAP__TIM3__PARTIAL() 这个需要寻找宏或者调用。。。稍微需要一些经验,刚开始可以照猫画虎吧

在tim.c中的HAL_TIM_MspPostInit函数中初始化TIM1和TIM3的gpio引脚,TIM1 PA8作为舵机使用,TIM3的PA6、PA7、PB0、PB1 作为电机驱动PWM使用

程序中改变舵机,控制舵机转向角度大小的比较变化值函数:SERVO_TIM_SetCompareX_FUN(&htim1,TIM_CHANNEL_1,Servo_PWM);

//控制触发电机pwm
#define PWMA_IN1 TIM3->CCR1
#define PWMA_IN2 TIM3->CCR2
#define PWMB_IN1 TIM3->CCR3
#define PWMB_IN2 TIM3->CCR4

3):电机霍尔编码器返回的pwm波形数值由下面定义:

TIM4、TIM8这两个处理返回波形的定时器,主要通过这个函数处理HAL_TIM_Encoder_MspInit

顺便了解一下PWM模式1和PWM模式2进行介绍:

时钟器中的PWM模式1:在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平;在向上计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电(OC1REF=1)。

时钟器中的PWM模式2:在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。

最后提供一下ROS测试的字符串:

最后提供2个ROS串口测试数据:

异或校验(BCC校验)在线计算:7B00000000000000007B7D 和 7B010221B6000040802F7D

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
基于STM32的智能小车可以使用PWM控制舵机云台PWM是脉冲宽度调制的缩写,它通过改变脉冲的高电平时间来控制舵机的角度。在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,这个比例被称为占空比。例如,如果舵机需要转动45°,那么占空比就应该为5%。根据PWM周期为20ms,可以计算出对应的TIM_SetCompare1寄存器值为190。通过改变TIM_SetCompare1的值,可以控制舵机云台的角度。\[2\] 舵机是一种用于角度控制的电机,通常用于航模、智能小车、机器人等应用。它由信号线、电位器、内部控制器、电机和传动机构/舵机系统组成。信号线接收来自微控制器的控制信号,电位器用于测量输出轴的位置量,内部控制器处理控制信号和反馈信号,驱动电机并控制位置,电机作为执行机构输出转速、转矩和位置,传动机构/舵机系统将电机输出的行程缩放到最终输出的角度上。\[3\] 因此,要实现STM32控制二维舵机云台,可以使用PWM控制舵机的角度,通过改变占空比来控制舵机的转动。具体的实现可以根据舵机的参数和接线来进行编写代码。 #### 引用[.reference_title] - *1* *2* *3* [基于STM32的智能小车--舵机云台设计](https://blog.csdn.net/qq_34623621/article/details/125732520)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值