STM32单线串口对总线舵机的控制
1 总线舵机的介绍 总线伺服舵机即串行总线智能舵机,实际上可以理解为数字舵机的衍生品,数字舵机与模拟舵机相比而言是控制系统设计上的颠覆,而总线伺服舵机对于舵机而言则是在功能和运用上的颠覆。舵机的运用方式实际上只能发挥出总线伺服舵机非常小的一部分功能。这款TS-315是通过单线的串口通信对旋转进行控制的,控制字符串协议如下:
字符串协议:
#1P1500T100 控制舵机旋转,无返回
(1P是ID为1的舵机,中间的1500是参数,范围是500-2500,控制舵机范围,后面的参数100,表示舵机旋转的时间参数,也就是速度,意思是舵机从当前角度达到命令中的1500的位置,所需要的时间为100ms,时间的范围是1-50000,时间越大速度越慢,但是舵机的最快速度以实际舵机的参数而定)
#1PRAD 读取角度,返回格式 #001P1467
#1PULK 释放扭力,无返回
#1PID002 改变ID (将1改成2,后面的参数必须为3位数,不够补0),返回格式 #002P
#1PBD1 返回 #OK!
改变波特率(9600,19200,38400,115200,128000) (舵机重启之后才会生效)
//1:9600 , 2:19200 , 3:38400 , 4:57600 , 5:115200 , 6:128000
#1PCSD 将当前位置设置舵机的初始位置,返回 #OK! (设置之后舵机上电之后会旋转到设置的位置)
#1PCLE (恢复出厂设置)(舵机重启之后才会生效),返回 #OK!
#1PMOD1 ,返回 #OK!
(最后的参数1表示工作模式,0:270度逆向,1:270度顺向,2:180度逆向,3:180度顺向,4:连续旋转)
逆向和顺向表示舵机的旋转方向。逆向:脉冲信号从500到2500,舵机逆时针旋转。顺向:脉冲信号从500到2500,舵机顺时针旋转。
连续旋转模式就是普通的360度舵机,连续旋转的,无法控制角度,这个模式下控制舵机的命令#1P1500T100这样的命令的作用就改变了,这个命令在这个模式下面的作用是:
中间的参数1500,范围为500-2500,其中500-1500控制舵机的正转,1500-2500控制舵机的反转。越接近1500速度越慢,越远离1500速度越快(即500和2500速度都是最快的,1500是停止)
最后的参数100,表示舵机旋转的圈数,100就是100圈(存在一两圈的误差,正常!),如果这个参数改成50000,那就是无限旋转。如果参数是49999,那就只会转49999圈
上面的1P 表示编号为1的舵机,上面所有的命令最后都要带回车换行符(0x0d 和 0x0a)
舵机的ID默认是1,ID为255是广播,广播命令对所有舵机都有效。默认波特率128000
2 STM32单线串口通信
参考手册里面是这样描述的,非常简单单线半双方模式通过设置USART_CR3寄存器的HDSEL位选择。在这个模式里,下面的位必须保持清零状态:
● USART_CR2寄存器的LINEN和CLKEN位 ● USART_CR3寄存器的SCEN和IREN位 USART可以配置成遵循单线半双工协议。在单线半双工模式下,TX和RX引脚在芯片内部互连。使用控制位”HALF DUPLEX SEL”(USART_CR3中的HDSEL位)选择半双工和全双工通信。 当HDSEL为’1’时 ● RX不再被使用 ● 当没有数据传输时,TX总是被释放。因此,它在空闲状态的或接收状态时表现为一个标准I/O口。这就意味该I/O在不被USART驱动时,必须配置成悬空输入(或开漏的输出高)。 除此以外,通信与正常USART模式类似。由软件来管理线上的冲突(例如通过使用一个中央仲裁器)。特别的是,发送从不会被硬件所阻碍。当TE位被设置时,只要数据一写到数据寄存器上,发送就继续。
参考初始化源码如下
//初始化IO 串口2
//pclk2CLK2时钟频率(Mhz)
//bound:波特率
void uart2_init(u32 pclk2,u32 bound)
{
u32 temp;
temp=(pclk2*1000000+bound/2)/bound; //得到USARTDIV@OVER8=0,采用四舍五入计算
RCC->AHB1ENR|=1<<0; //使能PORTA口时钟
RCC->APB1ENR|=1<<17; //使能串口2时钟
GPIO_Set(GPIOA,PIN2|PIN3,GPIO_MODE_AF,GPIO_OTYPE_OD,GPIO_SPEED_50M,GPIO_PUPD_PU);//PA2,PA3,复用功能,上拉输出
GPIO_AF_Set(GPIOA,2,7); //PA2,AF7
GPIO_AF_Set(GPIOA,3,7);//PA3,AF7
USART2->CR1=0; //清零CR1寄存器
USART2->BRR=temp/2; //波特率设置@OVER8=0
//下面5行代码是根据参考手册设置寄存器,注意使能HDSEL放到最后
USART2->CR3&=0<<5; //清SCEN
USART2->CR3&=0<<1; //清IREN
USART2->CR2&=0<<11; //清CLKEN
USART2->CR2&=0<<14; //清LINEN
USART2->CR3|=1<<3; //使能HDSEL
USART2->CR1|=0<<28; //设置M1=0
USART2->CR1|=0<<12; //设置M0=0&M1=0,选择8位字长
USART2->CR1|=0<<15; //设置OVER8=0,16倍过采样
USART2->CR1|=1<<3; //串口发送使能
#if EN_USART2_RX //如果使能了接收
//使能接收中断
USART2->CR1|=1<<2; //串口接收使能
USART2->CR1|=1<<5; //接收缓冲区非空中断使能
MY_NVIC_Init(0,0,USART2_IRQn,2);//组2,最低优先级
#endif
USART2->CR1|=1<<0; //串口使能
}
3数据读取时的注意点
通过逻辑分析仪分析,命令传送至舵机后,舵机给出了正确的反馈,但是由于舵机回馈数据的速度非常快,造成了丢包问题,数据总是无法正确传送至单片机,由于在单线模式,RXD一直接收TXD发送的数据,致使真正需要的数据丢包,因而只需要修改程序即可修正,更改的程序只是判断下是否是自己发送的命令即可,若是,则不在接收,最后验证,已经可以正确读取舵机反馈值
u16 USART2_RX_STA=0; //接收状态标记
void USART2_IRQHandler(void)
{
u8 res;
#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
OSIntEnter();
#endif
if(USART2->ISR&(1<<5))//接收到数据
{
res=USART2->RDR;
//if(USART2->RDR!=USART2->TDR)
{
if((USART2_RX_STA&0x8000)==0)//接收未完成
{
if(USART2_RX_STA&0x4000)//接收到了0x0d
{
if(res!=0x0a)USART2_RX_STA=0;//接收错误,重新开始
else if (USART2_RX_BUF[5]==0x44)USART2_RX_STA=0; //防止丢包,禁止接收自己发送出去的命名
else
{
USART2_RX_STA|=0x8000; //接收完成了
}
}
else //还没收到0X0D
{
if(res==0x0d)USART2_RX_STA|=0x4000;
else
{
USART2_RX_BUF[USART2_RX_STA&0X3FFF]=res;
USART2_RX_STA++;
if(USART2_RX_STA>(USART2_REC_LEN-1))USART2_RX_STA=0;//接收数据错误,重新开始接收
}
}
}
}
}
|
-
QQ截图20170306203104.jpg (53 KB, 下载次数: 0)
逻辑分析仪数据抓取
-
QQ截图20170307160119.jpg (67.46 KB, 下载次数: 0)
STM32单线串口对总线舵机的控制相关推荐
- STM32 基础系列教程 10 - 单线串口(半双工)
前言 在工程应用中,很多时间为了方便走线会采用单线串口方案,本节将学习stm32 usart单线串口的使用,学会用使用单线串口收发数据. 示例详解 基于硬件平台: STM32F10C8T6最小系统板, ...
- 舵机任意角度程序_真香!!!飞特发布性价比超高的19kg磁编码360°双轴串口总线舵机STS3215...
2020年4月6日,深圳飞特模型有限公司发布了2020年新款磁编码版本的TTL串口总线舵机.这款舵机是基于SCS215电位器版本开发的更高性能的磁编码版本,不仅具备了飞特SM高端系列的高性价比功能,又 ...
- 串口总线舵机之socket网络指令
我们如何通过外部去控制树莓派串口总线舵机和PWM舵机. 网络无疑是一个很好的选择. 这一部分是在lsc.py文件中 关于socketserver部分参考 socketserver 文章目录 调试工具 ...
- stm32的语音识别_免费开源基于STM32的智能垃圾桶之舵机控制(HAL库)
大家好,我是『芯知识学堂』的SingleYork,前面给大家简单介绍了<基于STM32的智能垃圾桶之成员简介>.<基于STM32的智能垃圾桶之语音识别>和<基于STM32 ...
- STM32驱动串口屏,STM32F103C8T6串口发送指令控制HMI串口屏
STM32驱动串口屏,STM32F103C8T6串口发送指令控制HMI串口屏 串口屏 基础指令集 硬件和接线 接线 实验前准备 STM32程序 串口程序 主函数 实验现象 总结 串口屏 串口屏是一个集 ...
- STM32通过串口控制LED闪烁或者呼吸效果
STM32通过串口控制LED闪烁或者呼吸效果 目录 STM32通过串口控制LED闪烁或者呼吸效果 1.准备工作 2.思路分析 3.实际操作 4.小结 1.准备工作 1.首先我们需要准备32的最小系统板 ...
- STM32入门笔记(02):F103C8T6 舵机PWM控制实验(SPL库函数版)
舵机的结构 舵机简单的说就是集成了直流电机. 电机控制器和减速器等, 并封装在一个便于安装的外壳里的伺服单元. 能够利用简单的输入信号比较精确的转动给定角度的电机系统. 舵机安装了一个电位器(或其它角 ...
- 4、Proteus仿真STM32串口通信,发送数据控制LED流水灯的启动和停止
一.实验说明 本次实验建立在第三个实验基础上,稍加修改,通过串口调试助手发送数据到Proteus来实现对流水灯的启动和停止,所以实验采用2个通信串口,实验原理非常简单,只要熟悉第三次实验的过程,就非常 ...
- uart接口_UART串行总线舵机转接板规格、接线说明 amp; 驱动安装
摘要 UART串行总线舵机需要配合UART串行总线舵机转接板使用,它的作用是将舵机的单线转换为双线TTL接口(Rx接收端,Tx发送端),通过双线TTL串口接口与单片机进行通信.或者通过转接板上的US ...
- STM32 —— STM32 的串口通信
STM32 -- STM32 的串口通信 STM32的串口通信接口有两种,分别是:UART(通用异步收发器).USART(通用同步异步收发器).而对于大容量 STM32F10x 系列芯片,分别有 3 ...
最新文章
- 权限表管理之获取用户权限表列表数据
- BZOJ 2134 单选错位(数学期望)【BZOJ 修复工程】
- 关于JVM 内存的 N 个高频面试问题!
- Mac环境下Redis的安装与配置
- flutter --- Windows下环境配置
- C++:15---异常机制
- unity3d 动态合批设置_Unity3D SkinnedMeshRenderer合批优化
- 远程断点调试不需要跟时间赛跑
- js放到head中失效的原因与解决方法
- 转载文章:Microsoft 将僵尸网络威胁智能分析程序引入云中以提供近实时数据
- centos7安装(二进制包)mysql8
- 如何确定windows启动类型是bios还是uefi
- 河北工业大学 高等数学学习资料分享(课件,录屏,教材,答案)
- 2018最新麻瓜编程实用主义学Python课程
- 【scipy】scipy.linalg.slove 求解线性方程组 python
- 300份奖品待领取 | 你的烦恼值钱啦!华为云 DevCloud 年度开发者的烦恼有奖征集火爆开启!...
- 【CO2二氧化碳传感器】senseair S8 LP
- 一篇文章带你了解,App 测试工具
- notify()会立刻释放锁么?
- 美好的人生,从良好的人际关系开始。