图2-10检测电路
2.2.5单片机模块
1.LM3S1138微控制器结构和引脚
单片机的选择主要考虑了单片机自带资源是否满足设计要求,如果能够选择合适的单片机,则可大为简化电路设计的复杂程度,从而提高系统的可靠性。本系统采用LM3S1138微控制器作为核心控制单元。LM3S1138微控制器具有的电池备用的休眠模块,可以有效地使LM3S1138掉电,在长时间的器件停止工作过程中让器件进入一个低功耗的状态,这非常适合要求最大限度降低功耗的应用。LM3S1138微控制器的优势还在于能够方便的运用多种ARM的开发工具和片上系统(SoC)的底层IP应用方案,以及广大的用户群体。另外,该微控制器使用了兼容ARM Thumb的Thumb2指令集来减少存储容量的需求,并以此达到降低成本的目的。最后,LM3S1138微控制器Stellaris系列的所有成员是代码兼容的,这为用户提供了灵活性,能够适应各种精确的需求。
LM3S1138微控制器的相关特性: ? 单输入和微分输入配置
? 用作单终端输入的8个10位通道(输入) ? 灵活、可配置的模数转换
? 可以把输出配置为:驱动输出管脚、产生中断或者ADC采样序列
? 比较两个外部管脚输入或者将外部管脚输入与内部可编程参考电压相比较 ? 片内低压差(LDO)稳压器,具有可编程的输出电压,用户可调节的范围为2.25V
到2.75V
因此采用LM3S1138微控制器可以最大程度提高本系统的准确度。
图2-11 LM3S1138芯片引脚图
2.3系统软件设计
本设计中程序采用C语言进行设计。程序中主要有以下几个主要子程序:主程序,LM3S1138微控制器内部集成的A/D模块初始化、采集、转换数据程序,电机驱动控制程序。程序源代码见附录。
三、总体调试
3.1 软硬件调试
写完成后,在对整个系统调试的过程中,出现了电机不运转等问题。主要通过单独调试各个模块及检查相关硬件电路的焊接,找出问题所在,然后针对问题逐个击破,最后成功完成本设计。
四、设计总结
本系统是点光源随动系统,通过采用lm3s1138单片机作为核心部件,光敏三级管检测到的信号时通过AD转换为数字信号传输给单片机,将处理的结果以脉冲的形式输出给驱动电路uln2003,驱动步进电机运动。使其追踪到点光源的位置。通过老师同学的共同努力,大家相互配合,不断弥补知识的漏洞,基本可以实现点光源随动的功能
五、参考文献
[1]薛建国.基于单片机的太阳能电池自动跟踪系统的设计[J].长春师范学院学报:自然科学版,2005,24(3):26-30.
[2]张兴磊,杨丽丽.一种太阳自动跟踪系统的设计[J].青岛农业大学学报,2008,26(4):315—318.
[3]李敏,刘京城,刘俊,等.一种新型的太阳能自动跟踪装置[J].电子器件,2008,31(5):1702 1703,1708.
[4]侯长来.一种太阳自动跟踪装置的设 JJ.现代机械,2005(1):66—68.
六、附录
1.系统整体电路图
3.程序
#include \#include \#include #include
#define ADCSequEnable ADCSequenceEnable
#define ADCSequDisable ADCSequenceDisable #define ADCSequConfig ADCSequenceConfigure #define ADCSequStepConfig ADCSequenceStepConfigure #define ADCSequDataGet ADCSequenceDataGet
tBoolean ADC_EndFlag = false; // 定义ADC转换结束的标志
// 定义KEY
#define KEY_PERIPH SYSCTL_PERIPH_GPIOG #define KEY_PORT GPIO_PORTG_BASE #define KEY_PIN GPIO_PIN_5
unsigned char FFW[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //四相八拍正转编码 unsigned char REV[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; ////四相八拍反转编码
void motor_ffw() {
unsigned char i; unsigned int j;
for (j=0; j<1; j++) //转1*n圈 {
for (i=0; i<8; i++) //一个周期转45度 {
GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1| GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4| GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7, FFW[i]);
// P1 = FFW[i]; //取数据 SysCtlDelay(1 * (TheSysClock / 3000)); } } }