MSP430F149定时数据采集程序[调试通过 该程序是用于过程控制的,改一下采样时间,就可以用于运动控制,里面没有添加如PID控制算法,自己添加自己的控制算法就可以了,希望对大家有用!
#include <msp430x14x.h>
#define RS_H P5OUT |=BIT3 //Data Register is selected
#define RS_L P5OUT &=~BIT3 //Instruction Register is selected
#define READ P5OUT |= BIT2 //读LCD
#define WRITE P5OUT &= ~BIT2 //写LCD
#define EN_H P5OUT |= BIT1 //Enable Read/Write Operation
#define EN_L P5OUT &=~BIT1 //Disable Read/Write Operation
unsigned char a[]="AD&DA change!";
int AD_result;
void Init_CLK(void); //时钟初始化函数
void Init_ADC(void); //AD转换函数
void Init_TimerA(void);
void DATransfer(unsigned DA_data);//DA转换子函数
void Init_Port()
{
P3SEL=0x00; //LCD所需端口设置
P3DIR=0xFF;
P3OUT&=~BIT5; //74HC245的DIR为低电平,输入方向由B端到A端
P5SEL=0x00; //P5输出
P5DIR=0xFF;
P5OUT=0x00;
P4SEL=0x00; //P4输出
P4DIR=0xFF;
P4OUT=0x00;
P6SEL=0xF0; //P6.4-p6.5作为AD输入通道,P6.0-P6.3作为一般的IO口
P6DIR=0xFF;
P6OUT=0x00;
}
void Delay(unsigned int i) //延时子程序
{
while(i--); //延时时间为i*5+6个时钟周期
}
void Write_Command(unsigned char command )
{
P4OUT=command;
RS_L; //选择程序寄存器
WRITE; //允许写操作
EN_H; //液晶使能
Delay(50);//延时
EN_L; //液晶读写操作禁止
Delay(50);
}
void Write_Data(unsigned char data )
{
P4OUT=data;
RS_H; //选择数据寄存器
WRITE; //允许写操作
EN_H; //液晶使能
Delay(50); //延时
EN_L ; //液晶读写操作禁止
Delay(50);
}
void Clear_Second_Line() //用于删除2*16字符液的晶第二行的函数
{
int i=16;
Write_Command(0xC0); //设置DDRAM的初始地址
while(i--)
{
P4OUT=0x20;
RS_H; //选择数据寄存器
WRITE; //允许写操作
EN_H; //液晶使能
Delay(50); //延时
EN_L ; //液晶读写操作禁止
Delay(50);
}
}
void Init_LCD(void)
{
Write_Command( 0x38 );//8位总线接口,双行显示,5*7点阵型
Delay(100);
Write_Command(0x0F);//开显示,开光标,光标闪烁
Delay(100);
Write_Command(0x01);//清屏,将空格字符ASCII码20H写入到所有的DDRAM单元
Delay(2500);
Write_Command(0x06);//设置进入方式,DDRAM自增,整个显示右移
Delay(100);
Write_Command(0x80);//设置DDRAM的初始地址
}
void Init_ADC(void)
{
//P6SEL = BIT7; //设置P6.7为模拟输入A7
ADC12CTL0 &= ~(ENC); //设置ENC为0,从而可以修改ADC12寄存器的值
ADC12CTL0 += ADC12ON+MSH; //开A/D转换,允许多次采样
ADC12MCTL7 = EOS+INCH_7;//ADC12MCTL7的输入通道为A7,参考电压分别为AVSS和AVCC
ADC12CTL1 = 0X00; //转换的起始地址为:ADCMEM7
ADC12CTL1 = CSTARTADD0+CSTARTADD1+CSTARTADD2;
ADC12CTL1 += SHP; //采样脉冲来自采样定时器
ADC12CTL1 += CONSEQ_2; //单通道多次转换
ADC12CTL1 += ADC12SSEL0; //ADC12内核时钟源为ACLK
ADC12IE = 0x00; //关闭各个通道的转换中断
ADC12CTL0 |= ENC; //使能ADC转换
return;
}
void Init_TimerA(void)
{
TACTL = TASSEL0 + TACLR; // 选择ACLK:32K,清除TAR
TACTL +=ID1; // 1/8 SMCLK
TACTL +=ID0;
CCTL0 = CCIE; // CCR0 中断允许
CCR0 = 2000; // 时间间隔为 0.5S
TACTL |= MC0; // 增记数模式
return;
}
void Init_CLK(void)
{
unsigned int i;
BCSCTL1 = 0X00; //将寄存器的内容清零
//XT2震荡器开启
//LFTX1工作在低频模式
//ACLK的分频因子为1
do
{
IFG1 &= ~OFIFG; // 清除OSCFault标志
for (i = 0x20; i > 0; i--);
}
while ((IFG1 & OFIFG) == OFIFG); // 如果OSCFault =1
BCSCTL2 = 0X00; //将寄存器的内容清零
BCSCTL2 += SELM1; //MCLK的时钟源为TX2CLK,分频因子为1
BCSCTL2 += SELS; //SMCLK的时钟源为TX2CLK,分频因子为1
}
#pragma vector=TIMERA0_VECTOR //定时器A0的中断函数
__interrupt void TimerA_ISR(void)
{
float AD_data;
char a;
char b;
int m;
int n;
// 读出转换结果
P5OUT^=BIT6;
while((ADC12IFG & BIT7)==0) ; //判断有没有转换结束
_NOP();
ADC12CTL0 &= ~ENC; // 关闭转换
P5OUT^=BIT5;
AD_result = ADC12MEM7; //读到AD转换的12位二进制数
DATransfer(AD_result);
if((ADC12IFG & BIT7)==0)
{P5OUT^=BIT4;}
AD_data=AD_result*3.3/4095; //将读到的12位二进制数转化为对应的电压
m=(int)AD_data;
n=(int)(AD_data*10-m*10);
a=48+m; //将符点型的电压值转化为字符数,便于液晶显示
b=48+n;
Clear_Second_Line(); //删除16*2字符液晶的第二行数据
Write_Command(0x06); // 设置液晶进入方式,DDRAM自增,整个显示右移
Delay(100);
Write_Command(0xC0); //设置液晶DDRAM的初始地址
Write_Data(a);
Delay(100);
Write_Command(0x06);//设置进入方式,DDRAM自增,整个显示右移
Write_Data('.');
Delay(100);
Write_Command(0x06);//设置进入方式,DDRAM自增,整个显示右移
Delay(100);
Write_Data(b);
ADC12CTL0 |= ENC; // 允许AD转换
ADC12CTL0|=ADC12SC; //开始新的转换
}
void DATransfer(unsigned DA_data) //DAC转换子程序
{
int i;
unsigned int da_data;
P6OUT&=~BIT0; //CS为低电平
for(i=0;i<16;i++)
{
P6OUT&=~BIT2; //SCLK为低电平
P6OUT&=~BIT1;
da_data=0x3000+(DA_data&0x0fff); //送入待转换的数字量,并选中A通道输出
da_data=((da_data>>(15-i))&0x0001)<<1;
P6OUT|=da_data ; //输出一位二进制数
Delay(10);
P6OUT|=BIT2; //SCLK为高电平
Delay(10);
}
P6OUT&=~BIT2; //SCLK为低电平
P6OUT|=BIT0; //CS为高电平,开始转换数据
Delay(10);
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗
_DINT(); // 关闭中断
Delay(50000);
Init_Port();
Init_LCD();
Init_CLK(); // 初始化
Init_ADC();
Init_TimerA();
_EINT(); // 打开中断
for(unsigned int i=0;a!='\0';i++)
{
Write_Data(a);
}
P5OUT|=BIT7;
ADC12CTL0 |=ADC12SC;
while(1)
{ }
} file:///C:\Users\DIY\AppData\Local\Temp\ksohtml\wps87A8.tmp.jpg
|