stm32通过RS485总线控制云台运动

文章目录

云台控制RS485通信:提升远程监控效率与精度的关键技术

一、RS485通信协议概述

RS485是一种多点、差分信号传输的串行通信协议,广泛应用于工业控制系统和远程监控等领域。该协议采用差分信号传输方式,通过两根数据线(A线和B线)来传输数据,其中一根线为正向传输,另一根线为反向传输,通过电平差来表示信息。这种传输方式能够有效抑制共模干扰,提高通信的稳定性和可靠性。

二、云台控制RS485通信的技术特点

高抗干扰性 :RS485通信协议采用差分信号传输,能够有效抵御外界电磁干扰,确保在复杂工业环境中数据传输的稳定性和准确性。
远距离传输 :RS485支持长达1200米的通信距离,非常适合于需要远程监控的应用场景,如大型工厂、户外监控等。
多点通讯 :RS485通信协议允许多个设备在同一总线上进行通信,每个设备都有唯一的地址,可以实现多点通讯,满足复杂网络结构的需求。
高灵活性:RS485支持多种连接方式,包括总线式、点对点等,能够根据不同应用场景的需求进行灵活配置。

三、云台控制RS485通信的实现方式

在云台控制系统中,RS485通信协议通常与云台控制器相结合,通过发送指令来控制云台的运动方向和角度。具体实现步骤如下:

硬件连接

将云台控制器与云台通过RS485接口进行连接,确保电气特性和信号传输方式的一致性。

地址设置

为每个连接到RS485总线的设备分配唯一的地址,以便在通信过程中能够准确识别并控制对应的设备。

指令发送

通过云台控制器发送指令给云台,指令中包含云台的运动方向和角度信息。云台控制器通过RS485通信协议将指令传输到云台上。

//发送pelco_d协议命令

void send_pelco_d_command(u16 command,u8 data1,u8 data2)

{

osMutexWait(turntable_mutex_id,osWaitForever);

osDelay(10);

u8 data[7] = {0};

u16 crc = 0;

data[0] = 0xFF;

data[1] = TURNTABLE_ADDR;

data[2] = command >> 8;

data[3] = command;

data[4] = data1;

data[5] = data2;

crc = (data[1] + data[2] + data[3] + data[4] + data[5]) %256;

data[6] = crc;

Turntable_Rs485_Send(data,7);

osMutexRelease(turntable_mutex_id);

}

//云台向上下移动

void turntable_up_down_speed_move(u16 command,float v)

{

turntable_printf("turntable_up_down_speed_move %d =%f;\n",command,v);

if(v >63)v = 63;

send_pelco_d_command(command,0,v);

}

//云台向左右移动

void turntable_left_right_speed_move(u16 command,float v)

{

turntable_printf("turntable_left_right_speed_move %d =%f;\n",command,v);

if(v >63)v = 63;

send_pelco_d_command(command,v,0);

}

//云台垂直角度移动

void turntable_tilt_angle_move(u8 v,float angle)

{

turntable_printf("turntable_tilt_angle_move =%f;\n",angle);

if(angle > 20 | angle < -70)return;

if(angle < 0){

angle = angle + 360;

}

int16_t angle_int = angle * 100;

send_pelco_d_command(v << 8 | SET_TILT_POSITION,angle_int >> 8,angle_int & 0xff);

}

//云台水平角度移动

void turntable_pan_angle_move(u8 v,float angle)

{

turntable_printf("turntable_pan_angle_move =%f;\n",angle);

if(angle < 0 || angle > 360)return;

int16_t angle_int = angle * 100;

send_pelco_d_command(v << 8 | SET_PAN_POSITION,angle_int >> 8,angle_int);

//send_pelco_d_command(SET_PAN_POSITION,angle_int,angle_int >> 8);

}

//云台停止

void turntable_stop(void)

{

send_pelco_d_command(0,0,0);

}

执行与反馈

云台接收到指令后执行相应的运动,并通过RS485通信协议将执行结果反馈给云台控制器。云台控制器根据反馈信息进行后续处理或调整。

//得到水平位置

float get_turntable_pan_position(void)

{

u8 retry_cnt = 0;

u16 timeout_cnt = 0;

float angle = 0;

retry_cnt++;

Turntable_Act_Comb.read_command = 0;

send_pelco_d_command(QUERY_PAN_POSITION,0,0);

while(Turntable_Act_Comb.read_command != QUERY_PAN_POSITION_RESPONSE){

osDelay(10);

timeout_cnt++;

if(timeout_cnt > 5){

return -256;

}

}

angle = (float)((float)((Turntable_Act_Comb.read_data1 << 8) + Turntable_Act_Comb.read_data2) / 100);

if(angle > 359)angle = 0;

return angle;

}

//得到垂直位置

float get_turntable_tilt_position(void)

{

u8 retry_cnt = 0;

u16 timeout_cnt = 0;

float angle = 0;

retry_cnt++;

Turntable_Act_Comb.read_command = 0;

send_pelco_d_command(QUERY_TILT_POSITION,0,0);

while(Turntable_Act_Comb.read_command != QUERY_TILT_POSITION_RESPONSE){

osDelay(10);

timeout_cnt++;

if(timeout_cnt > 5){//超时直接返回 重复读取操作

return -256;

}

}

angle = (float)((float)((Turntable_Act_Comb.read_data1 << 8) + Turntable_Act_Comb.read_data2) / 100);

if(angle >= 270){

angle = angle - (float)360;

}

return angle;

}

相关推荐
風清掦1 小时前
【江科大STM32学习笔记-05】EXTI外部中断11
笔记·stm32·学习
小龙报1 小时前
【51单片机】从 0 到 1 玩转 51 蜂鸣器:分清有源无源,轻松驱动它奏响新年旋律
c语言·数据结构·c++·stm32·单片机·嵌入式硬件·51单片机
范纹杉想快点毕业1 小时前
嵌入式与单片机开发核心学习指南——从思维转变到第一性原理的深度实践
单片机·嵌入式硬件
Industio_触觉智能1 小时前
瑞芯微RK3566开发板规格书,详细参数配置,型号EVB3566-V1,基于RK3566核心板SOM3566邮票孔封装
嵌入式硬件·开发板·rk3568·rk3566·核心板·瑞芯微
czwxkn1 小时前
4STM32(stdl)TIM定时器
stm32·单片机·嵌入式硬件
Love Song残响1 小时前
NVIDIA显卡终极优化指南
stm32·单片机·嵌入式硬件
qq_672592752 小时前
电源芯片为什么发热
单片机·嵌入式硬件
天天爱吃肉82182 小时前
【跨界封神|周杰伦×王传福(陶晶莹主持):音乐创作与新能源NVH测试,底层逻辑竟完全同源!(新人必看入行指南)】
python·嵌入式硬件·算法·汽车
国科安芯2 小时前
抗辐照MCU在精密时频系统中的单粒子效应评估与可靠性验证
单片机·嵌入式硬件·架构·制造·安全性测试
森焱森2 小时前
嵌入式硬件工程师应知 白银快速分析报告
linux·c语言·arm开发·嵌入式硬件·去中心化