# 过往分享
[【iMOTION2go套件】1. 开箱](https://bbs.eeworld.com.cn/thread-1229533-1-1.html)
[【iMOTION2go套件】2. MCEWizard工具使用+控制脚本分析](https://bbs.eeworld.com.cn/thread-1230537-1-1.html)
[【iMOTION2go套件】3. MCEDesigner工具使用](https://bbs.eeworld.com.cn/thread-1231098-1-1.html)
[【iMOTION2go套件】4. 控制脚本编写之LED控制](https://bbs.eeworld.com.cn/thread-1231101-1-1.html)
[【iMOTION2go套件】5. 更新脚本导致版本不兼容问题绕过方法](https://bbs.eeworld.com.cn/thread-1232011-1-1.html)
[【iMOTION2go套件】6. MCEDesigner工具实现电机控制应用](https://bbs.eeworld.com.cn/thread-1232019-1-1.html)
# 前言
本文将使用控制脚本来操作电机。
IMOTIONGo没有外接输入引脚以及扩展,为了能够使用外部输入来控制脚本动作,可以通过MCUDesigner结合全局变量的方式来控制,但是由于脚本工具的问题(参考[【iMOTION2go套件】5. 更新脚本导致版本不兼容问题绕过方法](https://bbs.eeworld.com.cn/thread-1232011-1-1.html)),我不能新增加全局变量,所以使用了全局变量sVar0以及led来对脚本工作进行控制。
> 这里也有一个问题,既然MCEDesigner可以直接对IMOTIONGo进行标定控制,为什么还需要使用一个脚本来进行控制呢?
> 因为:
> 1.脚本控制是设定的程序,上电之后会自动执行,而MCEDesigner设定的应用功能,只有在调试的时候才能运行;
> 2. MCEDesigner编写的应用功能,在运行的时候,不能使用System窗口下的Monitor Group来监控,二脚本编写的控制代码可以被监控;
> 3. 脚本代码是定死了的,不能动态进行修改,所以我期望能够通过外部输入对电机的运动状态进行切换,可以在电机运动过程中对状态进行修改,这里就需要使用到MCEDesigner,通过修改全局变量寄存器的值来实现对电机控制状态的改变,本文将实现该方法。
# 脚本代码实现
> 脚本语法识别不了else if或者elif,只能使用if else的结构,所以写逻辑会比较复杂。
控制思路:
1. 变量sVar0作为控制变量,脚本只会读取,不会写入,写入通过MCEDesigner来完成;
2. 如果sVar0为1,则电机逆时针转动,并且LED每200ms翻转一次;
3. 如果sVar0为2,则电机顺时针转动,并且LED每500ms翻转一次;
4. 如果sVar0不为1或者2,则电机停止转动,LED每1s翻转一次。
代码实现:
Task0,周期为50ms,Task1周期为100ms;
源代码:
```C
#SET SCRIPT_USER_VERSION (1.00)/*Script version value should be 255.255*/
#SET SCRIPT_TASK0_EXECUTION_PERIOD (50)/*Script execution time for Task0 in 50mS, maximum value 65535*/
#SET SCRIPT_TASK1_EXECUTION_PERIOD (10)/*Script execution time for Task1 in 100mS, maximum value 65535*/
#SET SCRIPT_START_COMMAND (0x3)/* Start command, Task0 : Bit0, Task1 : Bit1; if bit is set, script executes after init */
#SET SCRIPT_TASK0_EXECUTION_STEP (10)/* Script Task0step, This defines number of lines to be executed every 1mS*/
#SET SCRIPT_TASK1_EXECUTION_STEP (10) /* Script Task1step, This defines number of lines to be executed every 10mS*/
/*********************************************************************************************************************/
int sVar0, led;
/*********************************************************************************************************************/
/*Task0 init function*/
Script_Task0_init()
{
int volt, limit;
limit=16000;
}
/******************************************************************************************************************/
/*Task0 script function*/
Script_Task0()
{
if (ADC_Result0 > 100)/*(AIN0)*/
{
volt = ADC_Result0<<2;//max=4096X4=16383, min=100x4=400
if (volt > limit)
{
volt=limit;
}
/* Control Motor running */
if (sVar0 == 1)
{
/* Motor CCW */
TargetSpeed = (-1)*volt;
Command=1;
led = 2;
}
else
{
if (sVar0 == 2)
{
/* Motor CW */
TargetSpeed = volt;
Command=1;
led = 1;
}
else
{
/* Motor Stop */
Command = 0;
led = 0;
}
}
}
else
{
Command=0;
}
}
/******************************************************************************************************************/
/*Task1 init function*/
Script_Task1_init()
{
int led_cnt;
GPIO7_OUT=1;
led_cnt = 0;
}
/******************************************************************************************************************/
/*Task1 script function*/
Script_Task1()
{
if (led == 1)
{
/* Motor CW, LED toggle every 500ms */
if (led_cnt > 5)
{
led_cnt = 0;
GPIO7_OUT=~GPIO7_OUT;
}
}
else
{
if (led == 2)
{
/* Motor CW, LED toggle every 200ms */
if (led_cnt > 2)
{
led_cnt = 0;
GPIO7_OUT=~GPIO7_OUT;
}
}
else
{
/* Motor stop, LED toggle every 1s */
if (led_cnt > 10)
{
led_cnt = 0;
GPIO7_OUT=~GPIO7_OUT;
}
}
}
led_cnt = led_cnt + 1;
}
```
使用工具MCEWizard编译脚本,然后使用MCEDesigner下载脚本,其方法不再赘述,可以参考我之前发布的帖子。
# MCEDesigner操作
电机控制的设计逻辑是通过写入全局变量寄存器sVar0来操作电机,所以需要MCEDesigner来操作,其方法如下:
## 新建Application Function
1. 打开MCEDesigner,打开MOtor控制窗口,新建三个Application Function,分别命名为MotorCCWByScript,MotorCWByScript,MotorStopByScript,表示电机逆时针转动控制,电机顺时针转动控制,电机停止控制;
2. 在每个Application Function中都添加寄存器sVar0_L(变量sVar0寄存器是int类型的,则有32位,而iMOTION2Go的寄存器为16位的,所有sVar0被变成了两个,分别为高位sVar0_H和低位sVar0_L,我们只需要操作低位,所有sVar0_L);
3. 在MotorCCWByScript下的sVar0_L中写入值1;
4. 在MotorCWByScript下的sVar0_L中写入值2;
5. 在MotorStopByScript下的sVar0_L中写入值0;
见下图:
MotorCCWByScript
MotorCWByScript
MotorStopByScript
# 试验效果
通过实际试验,运行不同的Application Function,电机会出现逆时针/顺时针/停止的动作,实现成功。
点击上图查看Gif动图
# 注意事项
在电机逆时针/顺时针转动的时候不会直接切换为顺时针/逆时针转动,会产生故障,板载的Status LED会闪烁,如果出现了故障可以通过ClearFault寄存器清除故障。