(整理)基于MSP430G2231实现的多路数据采集器.
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录
第一章作品概述 (2)
第一节作品功能和单片机介绍 (3)
第二节设计方案 (3)
第二章硬件系统设计 (4)
第一节MSP430G2系列Launchpad开发板介绍 (4)
第二节信号调理电路介绍 (5)
第三节显示部分电路 (7)
第四节硬件装配调试说明 (8)
第三章软件系统设计 (10)
第一节程序概述................................................................................. 错误!未定义书签。
第二节子程序介绍 (9)
第三节主程序介绍 (12)
第四节软件注意事项 (13)
第四章总结与思考 (13)
第一章作品概述
第一节作品功能和单片机介绍
运用MSP430G2231型单片机对外部输入的8路电流信号进行顺序采样,并通过12864进行显示。
本作品选用MSP430G2231单片机,该单片机超低功耗,具有5种节电模式,1us内便可
从待机模式唤醒,并具有一个强大的16位RISC CPU、16位寄存器和常数发生器,有助于最
大限度的发挥代码效率。
此单片机还具有丰富的时钟源,包括LF、OSC和VLO。
它可通过串
行口系统编程,无需外部编程电压,具有可编程的保密熔丝代码保护,它具有Spy-Bi-Wire
仿真逻辑接口。
另外它还有10位IO口、8个比较器通道和16位的Timer_A定时器,带2
路捕获和比较寄存器。
此单片机的IO口和Timer_A定时器都具有强大的中断能力。
第二节设计方案
图1.1 系统组成结构框图
如图1.1所示:外部信号通过模拟信号调理电路将外界输入的4~20mA电流转换成0~1.5V 的电压信号用ADC10模块进行采集通过单片机的内部运算将电压信号转换成需要显示的电流信号。
模拟信号调理版由采样电阻,低通滤波以及射极跟随器组成。
采样电阻将输入的电流信号转换成电压信号,低通滤波减少存在于输入端的共模干扰,射极跟随器起到减小输出阻抗以及保护后级电路的作用。
模拟信号调理版将输入的4~20mA电流信号转换成0.3~1.5V 的电压信号通过单片机进行采集。
采集完成后送往点阵液晶进行显示。
该应用充分发挥了MSP430G2231的IO资源:14(总管脚数)=2(电源和地)+2(JTAG)+2(串行点阵)+8(ADC 输入)。
第二章硬件系统设计
第一节 MSP430G2系列Launchpad开发板介绍
基于LaunchPad的MSP-EXP430G2低成本实验板是一款适用于TI最新MSP430G2xx系列产品的完整开发解决方案。
其基于USB的集成型仿真器可提供为全系列MSP430G2xx器件开发应用所必需的所有软、硬件。
LaunchPad具有集成的DIP目标插座,可支持多达20个引脚,从而使MSP430ValueLine器件能够简便地插入LaunchPad电路板中。
此外,还可提供板上Flash仿真工具,以直接连接至PC轻松进行编程、调试和评估。
LaunchPad实验板还能够对eZ430-RF2500T目标板、eZ430-Chronos手表模块或eZ430-F2012T/F2013T目标板进行编程。
此外,它还提供了从MSP430G2xx器件到主机PC或相连目标板的9600波特UART串行连接。
其实物图如图2.1所示。
图2.1 MSP430G2系列Launchpad开发板实物图
MSP-EXP430G2采用IAR EmbeddedWorkbench集成开发环境(IDE)或CodeComposerStudio(CCS)编写、下载和调试应用。
调试器是非侵入式的,这使用户能够借助可用的硬件断点和单步操作全速运行应用,而不耗用任何其他硬件资源。
MSP-EXP430G2LaunchPad特性:
• USB调试与编程接口无需驱动即可安装使用,且具备高达9600波特的UART串行通信速度•支持所有采用PDIP14或PDIP20封装的MSP430G2xx和MSP430F20xx器件
•分别连接至绿光和红光LED的两个通用数字I/O 引脚可提供视觉反馈
•两个按钮可实现用户反馈和芯片复位
•器件引脚可通过插座引出,既可以方便的用于调试,也可用来添加定制的扩展板
•高质量的20引脚DIP插座,可轻松简便地插入目标器件或将其移除
第二节信号调理及电源供电电路介绍
2.1:电源供电电路
图2.2 电源供电原理
如图2.2所示,采用9V适配器供电,1117—5V可产生5V电压。
1117-3.3V可产生3V电压。
5V供液晶使用,3.3V供单片机以及信号调理电路使用。
2.2:信号调理电路
图2.3 信号调理电路原理图
如图2.3所示,4~20mA电流信号经75欧姆采样电阻转换成0.3V~1.5V电压信号,经过低通滤波器后进入运放,通过射极跟随器连接到单片机IO口。
在输入运放之前采用一阶低通滤波来减小高频的共模干扰,射极跟随器起的作用是,保护后级电路和实现阻抗匹配。
2.3系统原理图
图2.4 系统原理图
第三节显示部分电路
本作品选用12864液晶显示器进行显示,器件实物如图2.3所示。
图3.1 12864液晶显示器实物图
12864液晶显示器是一种具有 4 位/8 位并行、2 线或3 线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为 128×64, 内置8192 个 16*16 点汉字,和128个16*8点 ASCII 字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。
可以显示 8×4 行 16×16 点阵的汉字. 也可完成图形显示.低电压低功耗是其又一显著特点。
由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。
本作品选用12864液晶显示器的串行接口方式,仅需2根IO口即可完成。
电路如图3.2
所示
图3.2 12864液晶显示器的串行接口电路连接图
第四节硬件装配图电流采集板
图4.1 模拟信号调理板LaunchPad
图4.2 LaunchPad
底板
图4.3 底板整体装配图
图4.4 整体装配图
装配方法:1.将模拟信号调理版上焊上插针(共16个连接底板),以及两排排座每排10个(连接LaunchPad),20孔的插座(连接LCD)(如图4.1所示)
2.在Launch上焊上两排插针(如图4.2所示)。
3.在万用版上焊上8个2端子,插上16个插针并用排线接出,并打上固定孔(如图
4.3所示)。
4.将信号调理版插在LaunchPad上。
5.将LCD插在信号调理版上
6.将点阵液晶用长铜柱固定在万用版上,接上5~9V的电源适配器即可(如图4.4)
第五节模拟信号调理版PCB图
图5.1 PCB板正面
图5.2 PCB板反面
第三章软件系统设计
第一节程序概述
程序通过AD10模块的采样模式1:顺序采样方式轮询的对八路电流输入信号进行采样,采样间隔通过主循环中的延时设置。
通过IO口串行控制液晶,每次计算完成后,将结果送串行液晶予以显示。
第二节子程序介绍
AD初始化程序:
入口参数:无
出口参数:无
void AD_Init(void)
{
ADC10CTL0 |= SREF_1+REFON+ADC10IE;//将AD10基准设置为1.5V 开启AD允许中断ADC10CTL0 |= ADC10SHT_3+MSC;//打开AD转换,过采样率设置为64个采样周期
ADC10CTL1 |= ADC10SSEL_3+SHS_0;//选择250K的采样时钟,用ADC10SC触发采集ADC10CTL1 |= CONSEQ_1+INCH_7;//连续采样模式,从通道0~7
ADC10CTL0 |= ADC10ON;
ADC10AE0 |= 0xFF;
ADC10CTL0 |= ADC10SC+ENC;
}
时钟初始化程序:
入口参数:无
出口参数:无
void clk_init(void)
{
BCSCTL1 |= CALBC1_1MHZ;
DCOCTL |= CALDCO_1MHZ;//上面两句将内部DCO校准至1MHz
//while(IFG1&OFIFG)
//{
//IFG1 &= ~OFIFG;
//delay_ms(100);
//}
BCSCTL2 |= SELM_0;//MCLK采用1M的内部DCO
BCSCTL2 |= DIVS_2;//SMCLK采用250K的时钟
}
IO初始化程序:
入口参数:无
出口参数:无
void io_init(void)
{
P2SEL &= ~(BIT6+BIT7);// 2231将其初始化为晶振输入端,所以要关掉第二功能选择P2DIR |= BIT6+BIT7;//将其置为输出方向
//P1OUT =0;
P1SEL = 0xFF;//将IO选择为AD输入
//P1SEL|=BIT6;
P1DIR = 0;
}
液晶初始化:
入口参数:无
出口参数:无
void lcd_init (void)
{
wr_lcd (comm,0x30); //30---基本指令动作
wr_lcd (comm,0x01); //清屏,地址指针指向00H
delay_ms(100);
wr_lcd (comm,0x06); //光标的移动方向
wr_lcd (comm,0x0c); //开显示,关游标
}
串行液晶底层驱动:
入口参数:func:功能数据data:数据出口参数:无
void wr_lcd(uchr func,uchr data)
{
uchr i,i1,i3,i2,CF;
SID_H;
for(i=0;i<5;i++)
{
SCK_H;
SCK_L;
}//5起始位
SID_L;
SCK_H;
SCK_L;//写使能
if(func==1) SID_H;
else SID_L;
SCK_H;
SCK_L;//功能位
SID_L;
SCK_H;
SCK_L;//写0
for(i3=0;i3<2;i3++)
{
for(i1=0;i1<4;i1++)
{
CF=data&0x80;
if(CF==0x80) SID_H;
else SID_L;
SCK_H;
SCK_L;
data=data<<1;
}
for(i2=0;i2<4;i2++)
{
SID_L;
SCK_H;
SCK_L;
}
}
}
液晶显示
入口参数:无
出口参数:无
void chn_disp1 (uchr const *chn)
{
uchr i,j;
//wr_lcd (comm,0x30);
wr_lcd (comm,0x80);
for(j=0;j<4;j++)
{
for (i=0;i<16;i++)
wr_lcd (dat,chn[j*16+i]);
}
}
void Write_Num(int addr,int val1,int val2)
{
wr_lcd (comm,addr);
if(val1!=0x2E)
val1=val1+0x30;
val2=val2+0x30;
wr_lcd (dat,val1);
wr_lcd (dat,val2);
}
将采样值转换成电流值
入口参数:无
出口参数:无
void Calculate(void)
{
//_DINT();
int i;
for(i=0;i<8;i++)
{
Disp_Tab[i]=AD_Result[i]*0.195503;
}
//_EINT();
}
第三节主程序介绍
首先关闭看门狗,将10个IO口配置成8路AD输入,两个IO输出(控制液晶)。
运用DCO 将校准至1M的时钟供系统使用。
进行LCD初始化,显示液晶上的“常量数字”。
并对AD10进行初始化,1.5V基准源,250K采样时钟,从通道7至0进行轮询顺序采样。
每当有ADC10SC
触发式进行采集。
采集间隔通过主循环中的delay_ms()控制(这里设置的为50ms)。
采样值计算完成后送液晶显示。
void main()
{
WDTCTL = WDTPW+WDTHOLD;
io_init();
clk_init();
lcd_init();
chn_disp1(tab);
AD_Init();
_EINT();
while(1)
{
delay_ms(50);
ADC10CTL0 |= ENC+ADC10SC;
Calculate();
//Write_Num(0x81,Disp_Tab[0]/100,(Disp_Tab[0]%100)/10);
//Write_Num(0x82,0x2E,((Disp_Tab[0]%100)%10));
Write_Num(0x85,Disp_Tab[1]/100,(Disp_Tab[1]%100)/10);
Write_Num(0x86,0x2E,((Disp_Tab[1]%100)%10));
Write_Num(0x91,Disp_Tab[2]/100,(Disp_Tab[2]%100)/10);
Write_Num(0x86,0x2E,((Disp_Tab[2]%100)%10));
Write_Num(0x95,Disp_Tab[3]/100,(Disp_Tab[3]%100)/10);
Write_Num(0x86,0x2E,((Disp_Tab[3]%100)%10));
Write_Num(0x89,Disp_Tab[4]/100,(Disp_Tab[4]%100)/10);
Write_Num(0x86,0x2E,((Disp_Tab[4]%100)%10));
Write_Num(0x8D,Disp_Tab[5]/100,(Disp_Tab[5]%100)/10);
Write_Num(0x86,0x2E,((Disp_Tab[5]%100)%10));
Write_Num(0x95,Disp_Tab[6]/100,(Disp_Tab[6]%100)/10);
Write_Num(0x86,0x2E,((Disp_Tab[6]%100)%10));
Write_Num(0x9D,Disp_Tab[7]/100,(Disp_Tab[7]%100)/10);
Write_Num(0x86,0x2E,((Disp_Tab[7]%100)%10));
}
}
第四节调试注意事项
1:开启ENC之后任何的初始化语句都无效,也就是说想要成功的完成初始化必须要在关闭ENC的情况下完成。
2:DCO可以较为精准的时钟频率只要用两句语句即可完成:
BCSCTL1 |= CALBC1_1MHZ;
DCOCTL |= CALDCO_1MHZ;//上面两句将内部DCO校准至1MHz
3:不要重复的进行液晶的刷新,要加延时。
4:设置ADC10的IO口时只需设置ADC10AE即可,别的不用管。
5:对于ADC10来说,250K的采样时钟以及64的过采样率能够采集到最为稳定的值。
6:对于G2231有限的内存来说,尽量多使用Statics来完成常量的存储工作。
7:调试过程中如果出现程序跑飞的情况要检查是否使能某模块的中断但并未使用它。
8:在插USB进行调试事最好不要外接电源适配器,避免短路。
9:注意将P1.6和P1.7处的跳线帽摘掉。
第四章总结与思考
通常,在大家使用ADC10是往往只是运用其单次采样模式,而本作品运用AD10,IO 模块让大家学会应用顺序采样模式。
顺序采样用很多优点,比如在并行度要求不高的情况下可考虑用顺序采样代替,本作品最高可达到0.1ms/8路的采样速度,足以应付速度不高的应用。
顺序采样还可以加快采样速度(只需对软件略作修改),当我们通常会对采样值取平均,以降低偶然误差,但这么做也会降低采样速度,如1M的采集速度,采50个数去平均,值只能达到20K但若在此基础上采用8路顺序采样,就可将速度提高到160K,提高了8倍!本作品充分利用了2231的内部资源,完全利用了它的14个IO口,经测试,性能良好。
在本作品基础上,建议读者关于本作品功能的进一步增强进行如下思考:
(1)为了降低8路信号之间的相互干扰,可否在面包板上自己搭建在采集板上能否加入硬件隔离电路?
(2)硬件运用了大量的无源滤波电路,为了实现更好的阻抗匹配是否可使用使用有源滤波?
(3)用取样电阻的方式将电流转换成电压会浪费精度。
Eg:将4~20mA的电流信号用取样电阻进行取样只能转换成0.3~1.5V的电压。
浪费了0.3V以下的电压。
可否设计一种电路使其充分利用精度范围.
(4)程序中运用软件延时控制采集间隔,为了更好地节省CPU资源,可否运用Timer解决延时问题。