摘 要
本系统是基于TM4单片机来完成各项功能的,实现了一套简易旋转倒立摆及其控制装置。旋转倒立摆的结构如图 1 所示。电动机 A 固定在支架 B 上,通过转轴 F驱动旋转臂 C 旋转。摆杆 E 通过转轴 D 固定在旋转臂 C 的一端,当旋转臂 C 在电动机 A 驱动下作往复旋转运动时, 带动摆杆 E 在垂直于旋转臂 C 的平面作自由旋转。
其中系统的驱动采用了Mos管电机驱动;姿态获取通过角度传感器; 控制部分采用PID算法,实现题目在角度等的精度要求和及时性;该系统通过串口通信来进行PID各参数的串口调试工作;同时利用按键切换不同的模式。系统供电由12V电源适配器。
图 1 旋转倒立摆结构示意图
关键词:TM4单片机;MOS管电机驱动;角度传感器;PID算法;降压模块
一、系统方案
本系统主要由单片机控制模块、电源模块、电机驱动模块、显示模块、姿态获取模块、串口通信组成,下面分别论证这几个模块的选择。
1、主控制器件的论证与选择
1.1.1控制器选用
单片机比较
方案一:采用传统的STC89C51系列单片机。
方案二:采用TI公司的TM4单片机
通过比较,TM4功能更强大,我们选择方案二。
1.1.2控制系统方案选择
方案一:采用在面包板上搭建简易单片机系统
在面包板上搭建单片机系统可以方便的对硬件做随时修改,也易于搭建,但是系统连线较多,不仅相互干扰,使电路杂乱无章,而且系统可靠性低,不适合本系统使用。
方案二:自制单片机印刷电路板
自制印刷电路实现较为困难,实现周期长,此外也会花费较多的时间,影响整体设计进程。不宜采用该方案。
方案三:采用单片机最小系统。
单片机最小系统包含了显示、矩阵键盘、A/D、D/A等模块,能明显减少外围电路的设计,降低系统设计的难度,非常适合本系统的设计。
综合以上三种方案,选择方案三。
2、电源模块的论证与选择
方案一:自己设计电源电路及降压电路,并在洞洞板上焊接。
方案二:采用电源供电,然后利用降压模块来给传感器供电
综合以上两种方案,选择方案二。
3、电机驱动模块的论证与选择
驱动方案一:H桥驱动
驱动方案二:BTN7971或BTN7970驱动
驱动方案三:Mos 管驱动
综合以上三种方案,选择方案三。
4、其他外设模块的论证与选择
4.1:按键模块
方案一:利用串口发送指令选择不同的模式。
方案二:通过按键切换不同的模式。按键控制比较方便。
综合以上两种方案,选择方案二。
4.2:角度获取
结合成本以及应用于本系统的简易性、可移植性,我们采用了角度传感器模块来获取摆杆在摆动时的具体角度。
二、系统理论分析与计算
1、电机驱动模块的分析
(1)该模块采用7.2V供电,由TM4单片机输入四路PWM波,进而有四路输出来驱动两个电机,控制正反转。
(2)总线驱动芯片采用74LS08,不仅可以提高信号驱动能力,同时可隔离MOS管和单片机,保护单片机芯片,防止mos损坏后将电池电压直接输入到单片机,进而烧坏单片机控制引脚;
(3)采用B0512S来进行12V稳压。
(4)采用IRL7843与IR2104S作为驱动芯片
2、转向角度理论分析
通过角度传感器来实现,定1ms的中断,然后通判断是否达到目标角度。
3、PID达到目标速度的计算
利用PID算法来既快又稳地达到目标要求,其中P为比例,I为积分,D为微分。由于有两个电机,故计uo_a为一号电机,uo_b为二号电机,PID公式为uo_a=d_kp_ad_error_a+d_ki_aerror1_a+d_kd_a*dd_error_a,error表示差值,uo_a表示要加或减的占空比。
三、电路与程序设计
1、电路的设计
(1)系统总体框图
系统总体框图如图1所示
图1 系统总体框图
(2)电机驱动系统框图与电路原理图
电机驱动系统框图
图2 电机驱动系统框图
(3)电源
电源由电池、降压模块组成。为整个系统提供 5V与 12V电压,确保电路的正常稳定工作。
2、程序的设计
(1)程序功能描述与设计思路
1、程序功能描述
根据题目要求软件部分主要实现对系统的控制,通过角度传感器获取角度信息; 控制部分采用PID算法,来实现题目在转向角度精度要求和及时性;指令通过zigbee来进行串口通信;整车供电由12V电池与降压电路构成。
(2)程序流程图
图3 程序流程图
四、测试方案与测试结果
1、测试方案
(1)硬件测试
(2)软件仿真测试
(3)硬件软件联调
2、测试条件与仪器
测试条件:检查多次,仿真电路和硬件电路必须与系统原理图完全相同,并且检查无误,硬件电路保证无虚焊。
测试仪器:高精度的数字毫伏表,模拟示波器,数字示波器,数字万用表,指针式万用表。
3、测试结果及分析
经测试,该简易倒立摆系统能达到目标要求
五、参考文献
[1] 谭浩强.C语言程序设计[M].北京:清华大学出版社,2012
[2] 算法竞赛入门经典.清华大学出版社
[3] 数据结构.清华大学出版社
附录1:电机驱动原理图
附录2:源程序
电机PID函数:
void dianji_pid(int target)
{
error1_a = abs(target)-wheel_1;
error1_b = abs(target)-wheel_2;
d_error_a = error1_a - PreError_a;
dd_error_a = d_error_a - PreDerror_a;
PreError_a = error1_a;
PreDerror_a = d_error_a;
d_error_b = error1_b - PreError_b;
dd_error_b = d_error_b - PreDerror_b;
PreError_b = error1_b;
PreDerror_b = d_error_b;
uo_a=d_kp_a*d_error_a+d_ki_a*error1_a+d_kd_a*dd_error_a;
pwm_add_a=(int)uo_a;
dianji_value_a+=pwm_add_a;
uo_b=d_kp_b*d_error_b+d_ki_b*error1_b+d_kd_b*dd_error_b;
pwm_add_b=(int)uo_b;
dianji_value_b+=pwm_add_b;
if(error1_a<=1 || error1_b<=1)
{
wheel_1=0;
wheel_2=0;
tt=0;ttt=0;
dianji_value_a=0;
dianji_value_b=0;
IntDisable(INT_TIMER0B);
TimerDisable(TIMER0_BASE, TIMER_B);
// PWMOUTSet(0,0);
PWMOUTSet(-100,-100);
return 0;
}
if(target>=0)
{
PWMOUTSet(dianji_value_b,dianji_value_a);//占空比
}
if(target<0)
{
PWMOUTSet_Back(dianji_value_b,dianji_value_a);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/36916.html