大家好动态图片哪位高手能帮我解决一下谢谢。我想接个控制箱24伏直流,控制两组电机、可以自动反正转,是不是要

哪位大神能帮我写一个arduino 控制两个直流电机正反转,加减速和拐弯的程序啊?arduino程序,非常感谢。_百度知道
哪位大神能帮我写一个arduino 控制两个直流电机正反转,加减速和拐弯的程序啊?arduino程序,非常感谢。
我正在做遥控小车,这个程序编写还不太会,谢谢了。
& & & &假设您使用无线串口控制小车,那么你需要设计一个串口指令协议,一般来说,通信协议的数据帧包括3部分,一是指令头,又叫做帧同步字;二是指令内容,也叫帧内容;三是校验码。& & & &同步字是为了便于程序分析连续传输的数据中,帧与帧之间的间隔,帧内容包含了所有经过16进制编码的各种控制指令和数据,校验码通常采用累加和与异或算法,为了计算本数据帧是否正确。(工业环境中,所有数据传输系统都存在一定的误码干扰,校验字能有效判别数据传输是否正确,进而通过错误处理机制,有效避免错误动作)。& & & &刚好前段时间写了个小车的控制程序,使用的是双路H桥来驱动电机的,不过不是控制履带式的,稍微改动了下。& & (注意,本程序仅适用于履带式小车,即左右电机正反转实现前后及转向,程序支持前后左右混控)//********************************// 遥控帧协议和结构// FB|80|51|AA|FF|BB|FF|BY|BY|BY|BY|BY|BY|CR// 00|01|02|03|04|05|06|07|08|09|10|11|12|13// 14 byte//FB 80 51 遥控帧同步字 & & & & & & & & 00-02//AA 前后控制量 128为中立位 & & & & & & 03//FF 恒定为0xFF & & & & & & & & & & & & 04//BB 左右控制量 128为中立位 & & & & & & 05//FF 恒定为0xFF & & & & & & & & & & & & 06//BY 备用控制指令 本程序为空 & & & & & &07-12//CR 校验码,从00至12字节逐字节位异或 & 13//********************************// 遥测帧协议结构// FB|80|61|AA|FF|BB|FF|BY|BY|BY|BY|BY|BY|CR// 00|01|02|03|04|05|06|07|08|09|10|11|12|13// 14 byte// 重复遥控指令,除帧头外,其定义与遥控指令相同#define BR 9600 & & & //定义串口波特率//遥控指令接收处理相关定义#define TCDL 14 & & & //定义遥控数据帧长度字节数#define BUFF_LONG 30 &//定义串口接收缓存的长度byte BUFF[BUFF_LONG]; //定义串口数据接收存储缓存int BUFF_IDX = 0; & & //定义串口数据接收存储缓存的指针//遥测指令发送处理相关定义#define TMFQ 80 & & & & //定义遥测数据帧发送间隔为80ms#define TMDL 14 & & & & //定义遥测数据帧长度字节数byte TM_Data[TMDL]; & & //定义遥测数据缓存int TM_Index = 0; & & & //定义遥测数据指针unsigned long Time = 0; //定义遥测发送计时器为0//定义左、右电机与Arduino的驱动信号接口//注意,这里用了4个PWM输出,部分Arduino板可能不支持,请查看手册int Moto_Right_A = 3;int Moto_Right_B = 5;int Moto_Left_A = 6;int Moto_Left_B = 9;//数据接收指示灯相关定义boolean IS_Blink = & & //定义是否闪烁LED灯的变量int LED = 13; & & & & //定义LED灯接口为13//指令变量定义byte RunPWM = 128; & //定义前进、后退控制PWM指令变量byte TurnPWM = 128; &//定义左转、右转控制PWM指令变量void setup(){& pinMode(Moto_Right_A, OUTPUT); //定义输出& pinMode(Moto_Right_B, OUTPUT); //定义输出& pinMode(Moto_Left_A, OUTPUT); //定义输出& pinMode(Moto_Left_B, OUTPUT); //定义输出& pinMode(LED, OUTPUT); //定义LED管脚为数字输出& Port_Init(); &//初始化串口& Blink_LED(false); //关闭指示灯}void loop(){&& if (Serial.available() & 0) &//如果接收到串口数据& {& & c = Serial.read(); & //读一个字节& & Buff_AddChar(c); & & //塞进缓存进行存储、校验和解码& }& TM_Freq(); & & & & & & //尝试按要求逐字节发送遥测数据& Driver_CAR(RunPWM, TurnPWM); //驱动左右电机正反转,实现运动控制}//驱动左右电机调速运行,实现左右正反转组合,实现控制//前后、左右混控void Driver_CAR(byte Run, byte Turn){& byte Run_L, Run_R; &//定义左右前进混合值& byte PWM_R_A, PWM_R_B, PWM_L_A, PWM_L_B; // 定义4个信号的独立PWM& Run_L = Run - (128 - Turn); &//将转向PWM混合到左路& Run_R = Run - (Turn - 128); &//将转向PWM混合到右路& PWM_L_A = (255 / 128) * Run_L - 255; & & & & //左路混合值结算为左路A信号PWM& PWM_L_B = (-1 * 255 / 128) * Run_L + 255; & &//左路混合值结算为左路B信号PWM& PWM_R_A = (255 / 128) * Run_R - 255; & & & & //右路混合值结算为右路A信号PWM& PWM_R_B = (-1 * 255 / 128) * Run_R + 255; & &//右路混合值结算为右路B信号PWM& analogWrite(Moto_Right_A, PWM_R_A); & &//输出右路A信号& analogWrite(Moto_Right_B, PWM_R_B); & &//输出右路B信号& analogWrite(Moto_Left_A, PWM_L_A); & & //输出左路A信号& analogWrite(Moto_Left_B, PWM_L_B); & & //输出左路B信号}//********************************//子程序 Port_Init()//功能:初始化串口通信void Port_Init(){& BUFF_IDX = 0; &//初始化串口缓存指针为0& TM_Data[0] = 0xFB; &//初始化遥测数据帧头& TM_Data[1] = 0x80; &//初始化遥测数据帧头& TM_Data[2] = 0x61; &//初始化遥测数据帧头& Serial.begin(BR); &//定义波特率并启动串口}//********************************// 子程序 Buff_AddChar(byte b)// 功能:串口接收字节加入缓存// 1、加入字节到缓存;// 2、检测到帧头则尝试检测遥控帧;// 3、管理缓存指针void Buff_AddChar(byte b){& BUFF[BUFF_IDX] = &// &缓存[缓存指针] = 接收字节& if (BUFF_IDX &= 2)& {& & if (BUFF[BUFF_IDX] == 0x51 && BUFF[BUFF_IDX - 1] == 0x80 && BUFF[BUFF_IDX - 2] == 0xFB) // &检测遥控帧头& & {& & & if (BUFF_IDX == (TCDL - 1))& & & {& & & & Buff_DCHK(); &// &检测校验码& & & }& & & BUFF_IDX = 0; &// &缓存指针归零& & && & }& }& BUFF_IDX++;& if (BUFF_I订鼎斥刮俪钙筹水船惊DX & (BUFF_LONG - 1)) // &缓存指针越界& {& & BUFF_IDX = 0; &// &缓存指针归零& }}//********************************//子程序 Buff_DCHK()//功能:校验遥控帧校验字是否正确void Buff_DCHK(){& byte DCHK = 0x00;& // 0xFB XOR 0x80 XOR 0x51& DCHK = BUFF[0];& DCHK = DCHK ^ BUFF[1];& DCHK = DCHK ^ BUFF[2];&& for (i = 0; i & (TCDL - 4); i++)& {& & DCHK = DCHK ^ BUFF[i];& }& if (DCHK == BUFF[TCDL - 4])& {& & //校验字正确& & Blink_LED(true); //闪烁LED& & Get_CMD(); & & & //解码指令& }}//********************************// 子程序 Get_CMD()// 功能:解码遥控指令void Get_CMD(){& RunPWM = BUFF[0];& TurnPWM = BUFF[2];& //后面可以自己添加关于BY指令的解码处理}//********************************//子程序 TM_Freq()//功能:遥测数据发送帧率控制void TM_Freq(){&& if (TM_Index & TMDL) //如果一帧数据还没有发完& {& & Serial.write(TM_Data[TM_Index]); //继续发数据& & TM_Index++; &//指针累加& }& else &//如果发完& {& & if (Time == 0) &//检测计时器是否为0& & {& & & Time = millis(); //是则赋予计时器初始值& & }& & else &//不是& & {& & & t = millis();& & & if (t - Time &= TMFQ) //检测计时器是否到达帧率控制的时间& & & {& & & & Time =& & & & TM_Make_Data(); & &//到达发送时间,则组一帧遥测数据,并开始发送& & & }& & }& }}//********************************// 子程序 TM_Make_Data()// 功能:发送遥测数据void TM_Make_Data(){& // 遥测帧协议结构& //FB|80|61|AA|FF|BB|FF|BY|BY|BY|BY|BY|BY|CR& //00|01|02|03|04|05|06|07|08|09|10|11|12|13& byte CHK = 0xFB; &//赋值帧头& CHK = CHK ^ 0x80; //赋值帧头& CHK = CHK ^ 0x61; //赋值帧头& TM_Data[3] = RunPWM; & &//回写前后指令& TM_Data[4] = 0xFF;& CHK = CHK ^ TM_Data[3]; //计算校验码& CHK = CHK ^ TM_Data[4]; //计算校验码& TM_Data[5] = TurnPWM; & //回写转向指令& TM_Data[6] = 0xFF;& CHK = CHK ^ TM_Data[5]; //计算校验码& CHK = CHK ^ TM_Data[6]; //计算校验码& CHK = CHK ^ TM_Data[7]; //计算校验码& CHK = CHK ^ TM_Data[8]; //计算校验码& CHK = CHK ^ TM_Data[9]; //计算校验码& CHK = CHK ^ TM_Data[10]; //计算校验码& CHK = CHK ^ TM_Data[11]; //计算校验码& CHK = CHK ^ TM_Data[12]; //计算校验码& TM_Data[13] = CHK; //计算校验码& TM_Index = 0; //清除遥测发送指针位置}//********************************//子程序 Blink_LED()//功能:闪烁内置LED灯void Blink_LED(boolean Blink){& if (Blink == false)& {& & IS_Blink =& }& else& {& & IS_Blink = !IS_B& }& digitalWrite(LED, IS_Blink);}
其他类似问题
为您推荐:
直流电机的相关知识
其他1条回答
我做电子设计的会
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁想用c语言编一个用单片机定时器控制直流电机转动时间的程序,求高手帮忙!_百度知道
想用c语言编一个用单片机定时器控制直流电机转动时间的程序,求高手帮忙!
按键kai按下时(即P2.2=0)电机正转(P2.0=1,P2.1=0),按键guan按下时(即P2.2=0)电机反转(P2.0=0,P22.1=1),正反转有一定时间,这段时间用畅龚扳夹殖蝗帮伟爆连单片机定时器怎么控制,求c语言的编程!主要是怎么反复使用。
提问者采纳
#include&stc.h&#define uchr unsigned char#define uint unsigned intsbit zh0 = P2^0;sbit zh1 = P2^1; //定义两个端口
//变量Tvoid main(){
TMOD = 0x01;
THO = ()/256;
TL0 = ()%256;
//启动中断while(1)
畅龚扳夹殖蝗帮伟爆连
//程序近来后开始正传
if(t==200)
//当中断进入200次,也就是10后电机反转,20次是一秒 {
t=0; //把T清零
}}/*中断程序*/void timer0 () interrupt 1{
TH0 = ()/256;
TL0 = ()%256;
如果加上两个按键kai和guan呢?怎么反复使用?中断后要怎么调整?
这可是两个问题一定要加分#include&stc.h&#define uchr unsigned char#define uint unsigned intsbit zh0 = P2^0;sbit zh1 = P2^1; //定义两个端口\sbit kai=P3^0; //开sbit guan=P3^1; //关uint t,a;
//变量T和Avoid main(){
TMOD = 0x01;
THO = ()/256;
TL0 = ()%256;
//启动中断
a=10000; //变量A赋值
if(kai==0)
//判断开关是否按下,开启 {
while(a--);//简单延时,用于销抖
if(kai=0) //再次判断是否按下,如果按下执行下面的程序
//程序近来后开始正传
if(t==200)
//当中断进入200次,也就是10秒后电机反转
t=0; //把T清零
if(guan==0) //关闭
while(a--);
if(guan==0)
}}/*中断程序*/void timer0 () interrupt 1{
TH0 = ()/256;
TL0 = ()%256;
提问者评价
谢了,不过就这么多分了。
其他类似问题
为您推荐:
直流电机的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁大哥,可否将《常用电机控制电路图》图集发一份给我?十分感谢!学习用!santianyixiang 1 2 6 的you 箱_百度知道
大哥,可否将《常用电机控制电路图》图集发一份给我?十分感谢!学习用!santianyixiang 1 2 6 的you 箱
提问者采纳
  三相异步电动机基本控制电路来自百度文库
提问者评价
来自团队:
其他类似问题
为您推荐:
电机控制的相关知识
其他1条回答
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁17V的微型直流电机怎样可以接入220V交流电,并起可以用电位器控制它的转速,请高手帮帮忙,急!谢谢!_百度知道
17V的微型直流电机怎样可以接入220V交流电,并起可以用电位器控制它的转速,请高手帮帮忙,急!谢谢!
提问者采纳
变压器,把220v降下来。或者搭个电源电路。
提问者评价
其他类似问题
为您推荐:
微型直流电机的相关知识
其他2条回答
较稳妥的方法。采用电机功率2-3倍的变压器;18v变压器→整流滤波→LM317调压→电机,可选用5A整流全桥,调压电位器可直接控制电机电压在3v-26v之间;50v的电解电容,17v的微型直流电机电流不大于5A,LM317采用金属壳封装两只直接并联,滤波采用2200μF&#47:220v&#47
去买个0-24伏可调开关电源
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁}

我要回帖

更多关于 大家好才是真的好 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信