7328浏览
查看: 7328|回复: 12

[常见问题] flymaple 电机 控制 程序 有好多不明白 的

[复制链接]



这个 是 测试程序  电机 那块的
好多 的 都是六个 电机 我已经 改了一部分了



///////////////////////////////电机控制方法//////////////////////////////////
//KK四轴电机控制发出信号:
//周期:2.08MS
//在油门最小位置高电平:1.02ms
//中间位置:1.46ms
//最高位置:1.96MS
//当开电的时候给电调的信号是常低电平,当通过遥控器开启后,给电机控制的信号是1040US
//这时电机不转动
/////////////////////////////////////////////////////////////////////////////

///////////////////////电机控制端口定义/////////////////////////////////////////
#define     MOTOR0PIN  D28  //电机0控制端口 数字口D28
#define     MOTOR1PIN  D27  //电机1控制端口 数字口D27
#define     MOTOR2PIN  D11  //电机2控制端口 数字口D11
#define     MOTOR3PIN  D12  //电机3控制端口 数字口D12



//6个电机的控制信号量,值范围:1-999us代表电机转速最小到最大速度
//当设置为0时将PWM占空比调整到0%,接口常低电平,当为1000时PWM占空比100%,接口常高电平。
uint16 MotorData[4] = {0,0,0,0};

////////////////////////////////////////////////////////////////////////////////////
//函数原型:  void motorCcontrol(void)                             
//参数说明:  无                                       
//返回值:    无                                                               
//说明:      电机控制函数将电机控制值量计算出PWM控制信号
///////////////////////////////////////////////////////////////////////////////////
void motorCcontrol(void)   
{
uint16 PWMData[4] = {0,0,0,0};  
uint8 i;
for(i=0;i<4;i++)
  {
   if(MotorData <= 0) PWMData = 0;  //PWM占空比调整到0%,接口常低电平。
     else if(MotorData  >= 1000)PWMData = 50000;  //PWM占空比100%,接口常高电平。
       else  PWMData = (1000 +MotorData)*24;
}   
//PWM最小1,最大499921,每24个数值对应1US,单值为0时为占空比为0%,当大于499920时为占空比100%
pwmWrite(MOTOR0PIN,PWMData[0] );
pwmWrite(MOTOR1PIN,PWMData[1] );
pwmWrite(MOTOR2PIN,PWMData[2] );
pwmWrite(MOTOR3PIN,PWMData[3] );

}
////////////////////////////////////////////////////////////////////////////////////
//函数原型:  void motorInit(void)                                                
//参数说明:  无                                       
//返回值:    无                                                              
//说明:      初始化电机控制
///////////////////////////////////////////////////////////////////////////////////
void motorInit(void)      

  //将6个电机控制管脚都设置为推挽输出IO
pinMode(MOTOR0PIN, PWM);
pinMode(MOTOR1PIN, PWM);
pinMode(MOTOR2PIN, PWM);
pinMode(MOTOR3PIN, PWM);

Timer3.setPeriod(2080);  //数字口D28,D27,D11,D12是Timer3的4个比较输出口,将Timer3的周期设置为2080us,电机更新频率为500HZ
Timer4.setPeriod(2080);  //数字口D24,D14是Timer4的2个比较输出口,将Timer4的周期设置为2080us,电机更新频率为500HZ
MotorData[0] = 0;
MotorData[1] = 0;
MotorData[2] = 0;
MotorData[3] = 0;

motorCcontrol();   //计算各个电机控制量之差,将这个值用于定时器产生中断改变相应电机脉冲高电平时间
}  

///我已经 把 前面的 所有 是 六个 电机 的 改了 但是 这块 尤其 是
Timer4.setPeriod(2080);  //数字口D24,D14是Timer4的2个比较输出口,将Timer4的周期设置为2080us,电机更新频率为500HZ

这个就 不知道了 不用 那个口


、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

这个是主函数 里面 电机 相关的
#include <stdio.h>
#include "wirish.h"
#include "i2c.h"
extern uint16 MotorData[4];  //电机控制寄存器

之前 在
void setup()
{
motorInit();       //电机控制初始化

}

有个 初始化
在 loop 里面 电机的
//***************************************************************************/
/*************************电机驱动测试***************************************************************
MotorData[0] = 1;  //首先将PWM设置为最低以开启电调
MotorData[1] = 1;
MotorData[2] = 1;
MotorData[3] = 1;

motorCcontrol();   //计算各个电机控制量之差,将这个值用于定时器产生中断改变相应电机脉冲高电平时间
delay(1000);
MotorData[0] = 500;  //控制6个电调使电机按照一半速度运行
MotorData[1] = 500;
MotorData[2] = 500;
MotorData[3] = 500;

motorCcontrol();   //计算各个电机控制量之差,将这个值用于定时器产生中断改变相应电机脉冲高电平时间
  while(1);  
*********************************************************************************************************/




按照这么写 就应该 能 转了吧 但是 还是不能  (说明 我现在 只买了 一个 电调 和 电机 )

怪怪金小鱼  中级技师
 楼主|

发表于 2012-9-13 13:13:16

注。。。。我  测试程序 没改的时候 插上 一个 电机 也 没 转过。。。
回复

使用道具 举报

怪怪金小鱼  中级技师
 楼主|
来自手机

发表于 2012-9-13 14:08:34

我买的 电调是 中特威的 那个周期 应该是16-20ms  咱们程序是 2ms? 我查普通电调是 航模的控制信号标准是:
周期15ms~20ms(严格的是20ms),高电平脉宽在0.9ms~2.1ms间变化;

我应该怎么改呀
回复

使用道具 举报

bobo  NPC

发表于 2012-9-13 15:05:52

电机的驱动程序不用改,定义了6个电机接口,你用哪个就给哪个控制量就行。

你只需要给电机控制变量赋值,
MotorData[0] = 500;  

然后在调用控制函数就可以了
motorCcontrol();   //计算各个电机控制量之差,将这个值用于定时器产生中断改变相应电机脉冲高电平时间

电调和舵机的RC信号是20MS,飞行器为了控制刷新更快一般使用500HZ。RC信号实际是看高电平脉冲宽度,低电平没有严格要求。这方面你不用改。

每款电调控制方式不一样,需要看你的说明书。  FlyMaple 使用好赢电调控制方式,

电调首先要设置控制范围,最低最高只,一般在电调开电时记录脉冲宽度,

另外为了防止误触发,桨伤人,在开机后需要将脉冲设置为最低,也就是油门最低。然后电调才能解锁。

我不知道是不是每个电调控制方式都不同,你需要看看电调说明书。


回复

使用道具 举报

怪怪金小鱼  中级技师
 楼主|

发表于 2012-9-13 17:07:20

bobo 发表于 2012-9-13 15:05
电机的驱动程序不用改,定义了6个电机接口,你用哪个就给哪个控制量就行。

你只需要给电机控制变量赋值,

这说明书 没写 什么

中特威AL系列无刷电子调速器说明书V02
尊敬的用户:感谢您使用中特威科技有限公司设计、制造的无刷电子调速器(ESC)。我们强烈建议您在使用之前阅读本使用手册。
一、中特威AL系列无刷电子调速器可编程功能:
1.        刹车设置
2.        电池类型(LiPo或 NiMh/NiCd)
3.        低压中止点设置
4.        出厂默认设置恢复
5.        马达进角设置(提高电调的效率和平稳性)
6.        加速启动设置(针对精密变速箱和直升机应用)
7.        直升机模式(针对直升机应用)
8.        马达转向(顺时针/逆时针)
9.        工作频率
10.低压中止类型(降低功率或立即关机)
二、调速器连接线说明:
    调速器与马达连接可通过直接焊接或者高质量的接头。使用新的接头时,应该仔细地焊接并且用热缩管收缩使其绝缘,避免短路烧毁调速器。电源线的最大长度应该在6英寸以内。

●        第一次接通电调并设置油门行程
中特威电调的特点是根据不同的发射机可设置最佳油门行程,电调能够通过发射机的整个油门行程来获取最平稳的油门线性。此操作只进行一次,目的是让电调获取并记忆发射机的油门输出信号,只有在您更换发射机时才需重复此操作
1.        打开发射机并将油门拉杆推到最大位置
2.        连接电池,接收机,马达与电调,等待2秒左右,马达会“滴滴”两声响,这时把油门拉杆拉到最小,马达也会“滴滴”两声响;这时表明电调已获取您的发射机油门信号范围
    油门行程现在已被校准,您的电调现已准备好可操作了
三、无刷电机电子调速器编程设置模式:
首先将遥控器油门拉杆推至最高位置,打开遥控器电源;(遥控器油门拉杆推至最高位置电调进入设置模式;遥控器油门拉杆推至最低位置电调进入工作模式)
1)        将电池组连接到调速器,2秒后电机“ 滴滴”声响,表示电调进入设置模式,设置菜单是循环模式,即每一种功能对应一种音乐声调,每一种音乐声调连续奏响4次,在音乐奏响4次时间内将遥控器油门拉杆推至最低位置,这时电机会发出“ 滴” 一声响,表示对应参数已存储,起动电机开始工作
2)        重复以上操作,设置您所需要的各种功能
可用编程卡设定(注,可选配件);设置方法见编程卡说明书







四、编程菜单顺序、与说明
油门行程设置       
       

●●  ●●  ●●  ●●                全油门行程        OK
刹车(开.关)
_*     _*     _*     _*                开←→关        OK
电池类型
~   ~   ~   ~                NiCad        OK
~~  ~~  ~~  ~~                LiPo        OK
电池低压保护
*--*    *--*     *--*     *--*                低(2.8V/50%)        OK
*---*        *---*                *---*    *---*                中(3.0V/60%)        OK
*----*   *----*    *----*   *----*                高(3.2V/65%)        OK
恢复出厂默认设置
—     —        —     —                出厂默认        OK
进角
-      -       -        -                自动(7°—30°)        OK
--        --       --        --                低(7°--22°)        OK
---    ---      ---       ---                高(22°--30°)        OK
马达启动(加速度)
VV  VV  VV    VV                超柔和启动        OK
∨  ∨   ∨    ∨                柔和启动        OK
VVV VVV VVV  VVV                加速启动        OK
直升机模式
-★-     -★-    -★-   -★-                直升机(关)        OK
-★★-  -★★-  -★★-  -★★-                直升机(1)        OK
-★★★- -★★★- -★★★- -★★★-                直升机(2)        OK
马达转向(正.反)
W      W      W      W                正←→反        OK
工作频率
∥   ∥  ∥   ∥                频率(8K)        OK
\\       \\     \\       \\                频率(16K)        OK
马达低压停止方式
_ ̄  _ ̄  _ ̄  _ ̄                降低功率        OK
 ̄_   ̄_   ̄_   ̄_                关断功率        OK

五、使用您的新电子调速器
错误的极性或短路都会损坏您的新电子调速器,所以您必须在连接电池组之前仔细地检查所有插头的极性是否正确,以及安装是否牢固(参考附图)

●问题解答

出现的问题        可能的原因        解决方法
接通ESC后没有任何提示音,马达不工作,伺服系统正常运行        ESC没有油门行程设置        对ESC进行油门行程设置
马达不工作,连接电池后马达未发音乐声,伺服系统也未运行        电池组与ESC之间接触不良
没接通电源
焊接不牢固(接头易断)
电池电缆极性错误
ESC信号线与接收机连接极位相反
ESC有问题        清理连接器终端或替换连接器
用刚充满电的电池组替换
再次焊接电缆连接
检查并确认电缆极性
检查连接在ESC上的信号线以确保处于正确极性
更换ESC
马达不工作,连接电池后马达未发出音乐声,但伺服系统在运行
接通ESC后马达不工作,发出警报音(两声滴滴响后有短暂停顿)        ESC与马达之间接触不良
马达线圈被烧
焊接不牢固(接头易断)
电池组电压超出正常范围        检查连接器终端或替换连接器
替换马达
再次焊接电缆联接
更换为刚充满电的电池组
检查电池组电压
接通ESC后马达不工作,发出警报音(持续地滴滴响)        通电后油门拉杆不在最小位置        将油门拉杆移至最小位置
接通ESC后马达不工作,ESC发出两声长响之后,有两声更长点的滴滴响        被颠倒的油门通道导致ESC进入程序设计模式        进入发射器上的伺服系统
倒转菜单并倒转油门通道
马达反向运行        ESC与马达之间错误的电缆连接        交换ESC与马达之间三条电缆连接中的任意两条或者通过ESC程序设计模式进入马达旋转功能并改变预设参数。
飞行过程中,马达停止运行        丢失了油门信号        检查无线电接收装置是否操作得当。
检查ESC和接收机信号线路及发送频道和ESC信号线之间确保有足够的隔离来防止干扰
在ESC的信号线上安装一个磁环
       
注意:在飞行过程中若电机突然停转,请立即将油门拉杆推到最低位置,再推起油门,电机将重新启动,将油门控制在较小位置,立即降落您的模型。
1)        使用充满的电池飞行;正确设置低压保护电压;低压保护方式设为降低功率方式(目前出厂设定模式)。若在飞行中发现功率降低,请降落您的模型
2)        请勿在电调外包裹任何物品;将电调安装在可通风降温的位置
3)        控制您的模型在遥控器遥控范围内飞行;注意遥控器电池电压,若电压降低较多,请降落您的模型
回复

使用道具 举报

bobo  NPC

发表于 2012-9-13 18:44:46

●        第一次接通电调并设置油门行程
中特威电调的特点是根据不同的发射机可设置最佳油门行程,电调能够通过发射机的整个油门行程来获取最平稳的油门线性。此操作只进行一次,目的是让电调获取并记忆发射机的油门输出信号,只有在您更换发射机时才需重复此操作
1.        打开发射机并将油门拉杆推到最大位置
2.        连接电池,接收机,马达与电调,等待2秒左右,马达会“滴滴”两声响,这时把油门拉杆拉到最小,马达也会“滴滴”两声响;这时表明电调已获取您的发射机油门信号范围
在初始化里面加上这句话,将最低油门设置好
MotorData[0] = 990;  //设置油门行程 首先将PWM设置最大,类似 将油门拉杆推到最大位置
MotorData[1] = 990;
MotorData[2] = 990;
MotorData[3] = 990;

motorCcontrol();   //计算各个电机控制量之差,将这个值用于定时器产生中断改变相应电机脉冲高电平时间
delay(3000);  //等待2秒以上

MotorData[0] = 10;  //控制6个电调使电机,将油门打到最小,设置油门行程
MotorData[1] = 10;
MotorData[2] = 10;
MotorData[3] = 10;

motorCcontrol();   //计算各个电机控制量之差,将这个值用于定时器产生中断改变相应电机脉冲高电平时间

delay(3000);  //等待2秒以上


这个说明书没有看到如何解锁,有可能他没有解锁,



回复

使用道具 举报

bobo  NPC

发表于 2012-9-13 18:46:48

然后再加一个开启命令

在 loop 里面 电机的
//***************************************************************************/
/*************************电机驱动测试***************************************************************
MotorData[0] = 1;  //   1 低于刚才我们设置的最小油门数10,应该可以开启电调了
MotorData[1] = 1;
MotorData[2] = 1;
MotorData[3] = 1;

motorCcontrol();   //计算各个电机控制量之差,将这个值用于定时器产生中断改变相应电机脉冲高电平时间
delay(1000);
MotorData[0] = 500;  //控制6个电调使电机按照一半速度运行
MotorData[1] = 500;
MotorData[2] = 500;
MotorData[3] = 500;

motorCcontrol();   //计算各个电机控制量之差,将这个值用于定时器产生中断改变相应电机脉冲高电平时间
  while(1);  
*********************************************************************************************************/
回复

使用道具 举报

怪怪金小鱼  中级技师
 楼主|

发表于 2012-9-14 10:51:33

bobo 发表于 2012-9-13 18:44
●        第一次接通电调并设置油门行程
中特威电调的特点是根据不同的发射机可设置最佳油门行程,电调能 ...

我刚明白过来 这个 操作 就是 校准 油门  变成 咱们板子 的 吧。。
回复

使用道具 举报

怪怪金小鱼  中级技师
 楼主|

发表于 2012-9-14 10:54:47

bobo 发表于 2012-9-13 18:46
然后再加一个开启命令

在 loop 里面 电机的

map.jpg
这个 我用示波器  测了  几个口 都是 一条直线  不是 最高 的 在中间
回复

使用道具 举报

怪怪金小鱼  中级技师
 楼主|

发表于 2012-9-17 20:09:33

我 把能 省略 的 都 省略了  void 里面 的 loop  里面的   但是 就是 没有  波形呀   示波器 是没问题的
回复

使用道具 举报

bobo  NPC

发表于 2012-9-20 15:56:13

在前面加入电调行程校准程序


void setup()
{
  motorInit();       //电机控制初始化
///////////////电调初始化设置行程,此时脉冲发出和电调电源一定要同时发生,设置最高行程///////////////////
  MotorData[0] = 999;  //首先将PWM设置为最高,设置电调最高行程数字
  MotorData[1] = 999;
  MotorData[2] = 999;
  MotorData[3] = 999;
  MotorData[4] = 999;
  MotorData[5] = 999;
  motorCcontrol();   //计算各个电机控制量之差,将这个值用于定时器产生中断改变相应电机脉冲高电平时间
  delay(3000);       //延迟至少3秒等待电调记住,需要根据实际的电调手册更改
  MotorData[0] = 10;  //将PWM设置为10,设置电调最低行程数字,解锁的时候只需要等于或者低于10就可以解锁
  MotorData[1] = 10;
  MotorData[2] = 10;
  MotorData[3] = 10;
  MotorData[4] = 10;
  MotorData[5] = 10;
  motorCcontrol();  //计算各个电机控制量之差,将这个值用于定时器产生中断改变相应电机脉冲高电平时间
  delay(3000);      //延迟至少3秒等待电调记住,需要根据实际的电调手册更改
  
  //////////////////////////解锁电调,发出低于设置的最小行程就可以这里小于/////////////////////////////
  MotorData[0] = 8;  //将PWM设置为10,设置电调最低行程数字,解锁的时候只需要等于或者低于10就可以解锁
  MotorData[1] = 8;
  MotorData[2] = 8;
  MotorData[3] = 8;
  MotorData[4] = 8;
  MotorData[5] = 8;
  motorCcontrol();  //计算各个电机控制量之差,将这个值用于定时器产生中断改变相应电机脉冲高电平时间
  delay(2000);      //延迟至少2秒等待电调记住,需要根据实际的电调手册更改
回复

使用道具 举报

怪怪金小鱼  中级技师
 楼主|

发表于 2012-9-23 09:31:32

bobo 发表于 2012-9-20 15:56
在前面加入电调行程校准程序

拿回来  没问题了  但是 我 把您给我 的 程序 又下了一次  有不能用了。。。我都觉得 见鬼了   
回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2022 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail