ionicons-v5-f

基于自制数字舵机的运动控制实验

课程名称:单片机原理及应用实验

实验题目:基于自制数字舵机的运动控制实验

课程简要信息

单片机原理及应用实验,32/24学时,电类专业2年级

实验内容与任务(限500字)

实验中使用自主研发的数字舵机模块。此模块结构件全部由电路板材料制作,直接在结构件上集成STM8单片机,按键,LED指示灯,直流电机及驱动芯片,增量编码器,反射光电开关等。

实验内容引导学生编写控制程序,由简单的按键控制、协议控制逐步升级为具有恒速、定位停止功能的数字舵机。实验分为多个层次供不同水平和学时的学生选作:

  1. 层次一:编写按键控制与LED显示构成的人机界面,完成按键对舵机转动方向的控制;

  2. 层次二:编写通讯协议,通过SPI/UART口控制舵机转动方向、角度的控制,测速;

  3. 层次三:编写一阶PID控制算法,实现在变化负载下的匀速转动;

  4. 层次四:使用多个舵机组成机械臂、机械人等,通过蓝牙/wifi/zigbee等方式遥控动作;

图1 自主研发的数字舵机模块和连接构件

实验过程及要求(限300字)

  1. 学习了解STM8单片机开发工具,数字舵机模块的机械和电路设计;

  2. 编写LED控制程序,用计时器实现秒闪烁;

  3. 编写按键查询程序,用按键情况LED灯,再将程序改为中断模式;

  4. 编写PWM输出程序,实现按键控制的电机起停,换向;(层次一)

  5. 编写串口/SPI通讯程序,控制电机起停;

  6. 设计指令集,实现驱动功率(PWM占空比)、停止位置的控制;(层次二)

  7. 编写编码器脉冲中断和计时程序,通过串口/spi口输出计时值;

  8. 编写一阶PID控制算法,实时计算PWM值,将转速控制在指定值;(层次三)

  9. 验证蓝牙透传/wifi透传/zigbee透传模块的通讯功能;

  10. 自由设计,组合控制多个舵机(层次四)

相关知识及背景(限150字)

实验综合运用单片机和传感器技术,提供解决运动控制问题的实际案例。覆盖单片机的GPIO、中断、计数器、定时器、UART/SPI、PWM输出等基础知识,以及通讯协议设计、PID反馈控制等综合知识。进阶设计中提供一个汇编语言优化案例,将112机器周期的C程序优化为14个机器周期的汇编程序,加强学生对汇编语言执行效率的认识。

教学目标与目的(限100字)

以一个完整的、实用的、具有扩展性的数字舵机控制程序开发为例,学习单片机的基础知识,并以通讯协议设计、PID反馈控制等扩展学生综合能力。汇编优化案例将112周期C程序优化为14个周期汇编程序,提升学生兴趣。

教学设计与引导

本实验的教学设计,以及配套的教学设备——自制数字舵机,开发初衷来源于教学中遇到的两个问题:

  1. 教学中常见的执行器,如LED灯、蜂鸣器等,被广泛应用于各种课程的实验教学中。学生从电路、模电、数电等基础实验开始,到微机原理、单片机、FPGA、DSP等实验,都在控制相同的、简单的执行器,容易出现厌倦心理。需要设计一种具有一定复杂性,具有科 技感、时代感的可控执行器,以提升学生新鲜感、刺激提高其学习兴趣。

  2. 基于研究型大学的教学理念,我们认为汇编语言对掌握处理器设计原理,理解计算机语言层次架构的作用是无法用高级语言替代的。但是在实践教学中确实面临汇编语言编程效率低下,学生在掌握C语言后对学习汇编的意义认识不足等问题。

试图解决以上问题的努力产生了电路板材料构件拼接构成的数字舵机系统。此系统涉及单片机的GPIO、中断、计数器、定时器、UART/SPI、PWM输出等基础知识,以及通讯协议设计、PID反馈控制等综合知识。在单个模块程序设计完成后,还可以组合成机械臂、机器人等运动机构,足以引发学生的学习兴趣,达到教师期望营造的科技感、时代感。

本套数字舵机系统创新性地使用电路板材料设计全部机械构件,电子线路可以直接焊接在构件上,拼接成控制电路和运动结构融于一体的舵机、机械臂、机器人等。不需要通常的模具加工或3D打印等技术支持,便于在实验室条件下方便地设计、制作、组装。

图2 舵机构件和组成的4足机器人

本系统中采用STM8S103K单片机而不是更高级的16位或32位控制器,除了成本考虑以外,也刻意制造了一种性能受限的环境,迫使、引导学生使用汇编语言优化程序。进阶设计中提供一个汇编语言优化案例,将112机器周期的C程序优化为14个机器周期的汇编程序,教学中学生的反应可以用震惊形容,极大提高了学生对汇编语言执行效率的认识和学习兴趣。

以通过SPI总线接收、执行上位机指令为例,首先使用C语言进行编程。程序采用环形缓冲区保存接收到的指令,每个指令帧包含ID,CMD和4字节参数。指令帧结构定义如下:

***************************************************************************

typedef struct frame_struct

{

uint8_t ID;

cmd_TypeDef CMD;

uint8_t P1;

uint8_t P2;

uint8_t P3;

uint8_t P4;

}frame_TypeDef;

***************************************************************************

首先用C语言完成读取特定参数的程序,然后通过不同优化方法逐步提高程序执行效率。

1.无优化,112机器周期

不考虑stm8的特点,按照标准8位单片机的风格,C程序为:

******************************************************************

*((uint8_t*)(&angle_desire)) = frame_buff[frame_bottom].P1;

*((uint8_t*)(&angle_desire)+1) = frame_buff[frame_bottom].P2;

******************************************************************

frame_bottom类型为8位有符号数,作为缓冲区的读取下标。此段程序进行两次8位数组操作,仿真运行需要112机器周期

2.通过了解处理器特点初步优化,75机器周期

考虑到stm8的特点,它具有一个16位的X寄存器,可以一次完成两个字节的读写,因此可以将两个8位操作合并为一个16位操作。c程序为:

****************************************************************************

angle_desire = *(int16_t*)(&frame_buff[frame_bottom].P1);

****************************************************************************

此段程序将P1参数的地址(8位无符号数指针)转换为16位有符号数指针,编译器会自动使用16位X寄存器搬移数据。对于纯粹的8位单片机,这种写法的效果与前面分为两个8位读写的效果是一样的,而通过预先了解stm8的寄存器设置等底层硬件信息,获得了初步的优化效果,仿真运行需要75机器周期

3.通过观察编译生成的汇编语言,进行C语言优化,58机械周期:

观察编译结果,发现编译器会调用内联函数?sext16_x_a,将8位有符号数的数组下标统一扩展为16位有符号数。通过强制将frame_bottom转化为8位无符号数类型(最初用8位有符号数定义frame_bottom是因为环形缓冲区下标越界判断过程中会出现负数,而在这里已经可以保证引用的下标为正数)。优化后的C语句为:

************************************************************************

angle_desire = *(int16_t*)(&frame_buff[***(uint8_t)***frame_bottom].P1);

************************************************************************

可以看到汇编代码没有调用?sext16_x_a函数,只是简单地把数组下标放入了YL寄存器就满足了后续乘法函数?mul16_x_x_w0的入口参数。模拟运行结果需要58机械周期

4.直接使用汇编语言优化,14机械周期

通过观察以上C语句和汇编代码可以发现,编译器调用了?mul16_x_x_w0函数,以16位乘法的方式将数组下标转换为实际地址。这是为了提高C程序的通用性,提高能处理的数组/矩阵的规模,理论上最大寻址空间可达2^32^字节。但在此处的应用中,数组远小于2^8^字节,计算下标时利用8位乘法指令就可以满足要求。因此利用编译器的嵌入汇编宏命令,在C程序中嵌入以下汇编代码完整实现数组寻址和数据搬移任务:

****************************************************************************

asm("ldw x,frame_bottom"); //读数组下标

asm("ld a,#6"); //指令帧长度为6

asm("mul x,a"); //下标乘以6得到帧起始地址

asm("addw x,#frame_buff+2"); //加上缓冲区基地址和P1参数的偏移量2

asm("ldw x,(x)"); //利用X寄存器间接寻址取得16位参数

asm("ldw angle_desire,x"); //赋值给angle_desire

****************************************************************************

经过汇编语言优化,仿真运行结果仅为14机械周期

至此,教学中循序渐进地引导学生完成了一次具有实际工程意义的执行效率优化过程,将原程序由112机器周期缩短为14机器周期,基本避免了接收处理指令对电机转速控制算法的实时性的影响。在教学中发现学生对这个优化结果感到震惊,并增强了对汇编语言的兴趣。

实验原理及方案

如图3所示,每个舵机包括一个STM8S103K单片机作为控制器,可通过双键双灯组成的简易人机界面完成ID设置,状态设置和查询等功能。

STM8S103K单片机的PWM输出通过L9110S芯片驱动一个减速比为100:1的N20减速电机,可以实现正反转、功率控制的基本功能。N20输出轴上安装了100线编码盘,可通过对射光电开关对转速进行测量。此电机通过减速比为20:1的蜗齿蜗杆结构驱动输出轴,不考虑摩擦损耗的输出扭矩约为20Kg∙cm(蜗齿蜗杆结构机械效率较低,实际扭矩小于此值)。采用蜗齿蜗杆结构的原因是便于布置机械和电路,并且其自锁特性可以在电机断电时保持位置,具有省电、发热低的优势。

舵机上还配置一个反射式光电开关,可用于测量主轴的零点位置,配合100线编码盘实现绝对位置测量,定位精度理论值为0.18度(由于加工误差实际精度较差)。

为控制成本和缩小体积,STM8S103K单片机使用了内部RC振荡器,工作在16MHz。系统使用TIM1的3、4通道做PWM输出,TIM1->ARR寄存器设置为10000,因此PWM频率为1.6KHz。舵机单元电路板图如图2,面积为65mmx40mm。

通常测量转速的方法是通过计数器统计单位时间内编码器产生的脉冲数。由于此系统中编码盘安装在减速100倍后的轴上,采用这种方法或因为计数时间过长影响控制频率,或因为计数时间短脉冲数太少影响测速精度。因此改为测量编码盘产生的脉冲宽度(时间),其倒数即表示速度。空载条件下PWM占空比与电机速度(脉宽计数值)的关系如图4。电机驱动电压为12V,图中可见TIM1->CCR寄存器至少为3000,对应占空比为30%时电机开始转动。空载最高转速约为60度/秒。

通过各种机械结构可将多个舵机拼装为更加复杂的运动机构,如机械臂,多足机器人等。

图3 舵机单元系统框图

图4空载条件下驱动PWM值与脉宽/速度对应关系图

本套数字舵机系统创新性地使用电路板材料设计全部机械构件,电子线路可以直接焊接在构件上,采用传统木工中的榫卯结构,拼接成控制电路和运动结构融于一体的舵机、机械臂、机器人等。由于不需要通常的模具加工或3D打印等技术支持,本系统可在实验室条件下方便地设计、制作、组装。全套机械零件中只有舵机主轴为非标订制件,其他机械零件均为量产标准件,成本较低。具有电路板设计制作能力的实验室可以方便地根据原电路版图扩充自己的机器构件,设计新机械结构。

教学实施进程

目前本实验题目主要用于课程中的综合设计环节,学生对单片机的基础知识已经有一定了解,教学的主要目的是以具有科技感、时代感的可控执行器,提升学生新鲜感、刺激提高其学习兴趣,提升综合设计的完成质量。

任务安排阶段,教师应首先演示数字舵机参考设计程序的执行效果,实现两个以上数字舵机组合运动控制等效果,让学生对任务目标有准确认识,提升学习兴趣。

在现场教学中以自由编程为主,开放学生讨论,教师可以提供编程思路、参考程序,辅助调试等方法加快任务完成进度。由于实验器材小巧,集成度高,辅助电路简单价格便宜,可以发放给学生课下调试。

在结果验收中,因为最后实现效果相似,要注意鉴别学生是否有抄袭行为。因此需要以现场问答方式就器件原理、程序段落功能进行考核。

对于实现效果良好,学习兴趣较高的学生,可引导其自己设计运动机构,用舵机驱动,实现更丰富的功能。注意保存程序代码、录像等资料,作为样例,给下届学生演示使用。

实验报告要求

实验报告需要反映以下工作:

  1. 实验目的,预期效果

  2. 实验所用器件原理、电路设计

  3. 程序流程图

  4. 程序源代码和详细注释

  5. 程序调试过程中遇到的问题和解决方法

  6. 实验结果总结

考核要求与方法(限300字)

目前本实验题目主要用于课程中的综合设计环节,以实物演示、程序问答、实验报告方式考核。实际教学中可根据学时、学生水平等因素,调整学生自编程序和参考程序的比例,产生合适难度的教学实验题目。

  1. 第一层次,完成基本的按键控制LED,计时器实现秒闪烁,按键控制的电机起停,换向;

  2. 第二层次,能够以SPI/UART等方式控制电机起停、驱动功率、停止位置等;

  3. 第三层次,能够以算法计算PWM值,在负载变化时将转速控制在指定值;

  4. 第四层次,能够以上位机控制两个以上的模块完成组合动作;

项目特色或创新(可空缺,限150字)

1.创新使用电路板材料,榫卯拼接3维机械构件,元件焊接在构件上,实验室可制作;

2.一个实际工程应用,覆盖单片机基础知识,以及协议设计、PID控制等综合知识;

3.一个优化例程,提升学生对汇编语言兴趣;

参赛选手信息表

案例提供单位 大连理工大学 相关专业 电类专业
设计者姓名 巢明 电子邮箱 chaoming@dlut.edu.cn
移动电话 13591326497

通讯地址

(含邮编)

辽宁省大连市高新园区凌工路2号 大连理工大学 116024
设计者姓名 秦晓梅 电子邮箱 qinxm@dlut.edu.cn
移动电话 13889530359

通讯地址

(含邮编)

辽宁省大连市高新园区凌工路2号 大连理工大学 116024
设计者姓名 王开宇 电子邮箱 wkaiyu@dlut.edu.cn
移动电话 18041169018

通讯地址

(含邮编)

辽宁省大连市高新园区凌工路2号 大连理工大学 116024
相关x课程名称 单片机原理及应用实验 学生年级 2年级 学时(课内+课外) 32/24

支撑

条件

仪器设备 自研数字舵机,ST-LINK编程调试器
软件工具 IAR集成开发环境
主要器件 STM8S103K,L9110S,增量编码器,反射、对射光电开关等

获奖信息

获奖等级 一等奖
年份 2018

作品信息

作者信息

作者
巢明,秦晓梅,王开宇
学校
大连理工大学

电工电子实验教学资源平台 苏ICP备09069895号-19