|
【玩转C2000 Launchpad】SCI to ADC
[复制链接]
此程序通过串口发送指定数据来触发ADC采样,并通过串口将采集到的电压值在电脑上显示出来。
外围电路也没加就是外接了个串口板就行了
上图为发送指定数据给DSP采集指定的AD通道 发送0采集ADCINA0通道、1=ADCINA1、3=ADCINA3、5=芯片温度 、 7=ADCINA7、9=ADCINB1、b或B=ADCINB3 等。PC发送0时ADCINA0采样并显示。发送5时ADC采样内部温度并显示出来。有的通道还没有加上去,大家可根据喜爱来加吧
串口板的线是从电脑主板上引出来的,比较丑。呵呵。。。。。。。。。。。
下面上程序,,呵呵 因为自己比较菜,注释也加了不少,相信初学者应该很容易懂吧。
在调串口时发现PC发送多位数据给DSP时经常会丢数据的。不知道是不是程序处理的问题还是??????希望大家能分享交流下
/****************************************************************************/
/* */
/* Module Name : SCIA for ADC */
/* File Name : main.c */
/* Author : 机动哥 */
/* Create Date : 2012/12/28 */
/* Function : SCI:波特率9600.数据位8.无校验。停止位1 ,接收采用中断方式 */
/* 串口管脚配制成1脚和48脚 ,GPIO29为发送、GPIO28为接收 */
/* Description :ADC的采样通道ADCINA0、ADCINA1、ADCINA3、ADCINA7、ADCINB1、 */
/* ADCINB3通道为外部AD采样 ADCINA5通道为采用芯片内部温度 */
/* 主函数通过串口接收到的数据分别来进行各通道的采样,串口发送0采样ADCINA0 */
/* 0采样ADCINA0 B采样ADCINB1 D采样ADCINB3 */
/* 主函数通过串口发送0触发采样 ADCINA0通道,1=ADCINA1、3=ADCINA3、5=芯片温度 */
/* 7=ADCINA7、9=ADCINB1、b或B=ADCINB3 等并通过串口发送给电脑显示 */
/****************************************************************************/
/*****************头文件********************/
#include "DSP28x_Project.h"
/****************端口宏定义*****************/
/****************常量宏定义*****************/
#define ADC_usDELAY 500000L
/***************全局变量定义****************/
#ifdef TOFLASH
extern void MemCopy(Uint16 *SourceAddr, Uint16* SourceEndAddr, Uint16* DestAddr);
extern Uint16 RamfuncsLoadStart;
extern Uint16 RamfuncsLoadEnd;
extern Uint16 RamfuncsRunStart;
#endif
//unsigned char SCIA_TX_BUF[]={1,2,3,4,5,6,7,8,0};
unsigned char SCIA_RX_BUF;
int16 temp,INA0,INA1,INA3,INA7,INB1,INB3,degC;
/****************函数声明*******************/
void TXV(Uint16 V);
void TXC(Uint16 C);
void Send_Char_SCIA(char B);
void Send_String_SCIA(char *String);
char Receive_Char_SCIA(void);
char Get_Char_SCIA(void);
interrupt void SCIA_RXINT(void);
/*------------------------------------------*/
/*形式参数:void */
/*返回值:void */
/*函数描述:主函数 */
/*------------------------------------------*/
void main(void)
{
InitSysCtrl(); // 系统初始化子程序,在DSP28_sysctrl.c中
InitSciGpio(); //配置SCI的GPIO
DINT; //禁止所有中断
InitPieCtrl();
IER = 0x0000; //禁止CPU中断模块
IFR = 0x0000; //清除CPU中断标志
InitPieVectTable(); //初始化PIE中断矢量表
EALLOW; // This is needed to write to EALLOW protected registers
#ifdef TOFLASH
MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
InitFlash();
#endif
InitGpio();
InitAdc();
InitSci(); //配置SCI初始化
while(1)
{
GpioDataRegs.GPADAT.all= 0x0000000E;
DELAY_US(ADC_usDELAY);
GpioDataRegs.GPADAT.all= 0x0000000D;
DELAY_US(ADC_usDELAY);
GpioDataRegs.GPADAT.all= 0x0000000B;
DELAY_US(ADC_usDELAY);
GpioDataRegs.GPADAT.all= 0x00000007;
DELAY_US(ADC_usDELAY);
if(SCIA_RX_BUF==48) //ASCII码的0
{
AdcRegs.ADCSOCFRC1.bit.SOC3 = 1; //软件启动SOC3开始转换ADCINA0
INA0 = AdcResult.ADCRESULT3; //读取结果寄存器3中的值也就是SOC3配置通道采样的值
INA0=((INA0*3.3)/4096)*10; //将采样到的数字量转换成电压,并放大10倍
Send_String_SCIA("ADCINA0="); //发送显示采样通道
TXV(INA0); //将转换好的电压用串口发送出去
SCIA_RX_BUF=0; //清除接收标志以防止多次进入
}
if(SCIA_RX_BUF==49) //ASCII码的1
{
AdcRegs.ADCSOCFRC1.bit.SOC2 = 1; //软件启动SOC2开始转换ADCINA1
INA1 = AdcResult.ADCRESULT2; //读取结果寄存器2中的值也就是SOC2配置通道采样的值
INA1=((INA1*3.3)/4096)*10; //将采样到的数字量转换成电压,并放大10倍
Send_String_SCIA("ADCINA1="); //发送显示采样通道
TXV(INA1); //将转换好的电压用串口发送出去
SCIA_RX_BUF=0; //清除接收标志以防止多次进入
}
if(SCIA_RX_BUF==51) //ASCII码的3
{
AdcRegs.ADCSOCFRC1.bit.SOC1 = 1; //软件启动SOC1开始转换ADCINA3
INA3 = AdcResult.ADCRESULT1; //读取结果寄存器1中的值也就是SOC1配置通道采样的值
INA3=((INA3*3.3)/4096)*10; //将采样到的数字量转换成电压,并放大10倍
Send_String_SCIA("ADCINA3="); //发送显示采样通道
TXV(INA3); //将转换好的电压用串口发送出去
SCIA_RX_BUF=0; //清除接收标志以防止多次进入
}
if(SCIA_RX_BUF==53) //ASCII码的5
{
AdcRegs.ADCSOCFRC1.bit.SOC7 = 1; //软件启动SOC7开始转换ADCINA5
AdcRegs.ADCSOCFRC1.bit.SOC8 = 1; //软件启动SOC8开始转换ADCINA5
temp = AdcResult.ADCRESULT8; //读取结果寄存器8中的值也就是SOC8配置通道采样的值
degC = GetTemperatureC(temp); //转换成摄氏度
Send_String_SCIA("TMS320F28027="); //发送显示采样通道
TXC(degC); //将转换好的温度用串口发送出去
SCIA_RX_BUF=0; //清除接收标志以防止多次进入
}
if(SCIA_RX_BUF==55) //ASCII码的7
{
AdcRegs.ADCSOCFRC1.bit.SOC0 = 1; //软件启动SOC0开始转换ADCINA7
INA7 = AdcResult.ADCRESULT0; //读取结果寄存器0中的值也就是SOC0配置通道采样的值
INA7=((INA7*3.3)/4096)*10; //将采样到的数字量转换成电压,并放大10倍
Send_String_SCIA("ADCINA7="); //发送显示采样通道
TXV(INA7); //将转换好的电压用串口发送出去
SCIA_RX_BUF=0; //清除接收标志以防止多次进入
}
if(SCIA_RX_BUF==57) //ASCII码的9
{
AdcRegs.ADCSOCFRC1.bit.SOC4 = 1; //软件启动SOC4开始转换ADCINB1
INB1 = AdcResult.ADCRESULT4; //读取结果寄存器4中的值也就是SOC4配置通道采样的值
INB1=((INB1*3.3)/4096)*10; //将采样到的数字量转换成电压,并放大10倍
Send_String_SCIA("ADCINB1="); //发送显示采样通道
TXV(INB1); //将转换好的电压用串口发送出去
SCIA_RX_BUF=0; //清除接收标志以防止多次进入
}
if(SCIA_RX_BUF==98 | SCIA_RX_BUF==66) //ASCII码的b和B
{
AdcRegs.ADCSOCFRC1.bit.SOC5 = 1; //软件启动SOC5开始转换ADCINB3
INB3 = AdcResult.ADCRESULT5; //读取结果寄存器5中的值也就是SOC5配置通道采样的值
INB3=((INB3*3.3)/4096)*10; //将采样到的数字量转换成电压,并放大10倍
Send_String_SCIA("ADCINB3="); //发送显示采样通道
TXV(INB3); //将转换好的电压用串口发送出去
SCIA_RX_BUF=0; //清除接收标志以防止多次进入
}
}
}
/*------------------------------------------*/
/*形式参数:char */
/*返回值:void */
/*函数描述:发送电压 */
/*------------------------------------------*/
void TXV(Uint16 V)
{
Uint16 i;
i=V/10+48;
SciaRegs.SCITXBUF=i;
while ( SciaRegs.SCICTL2.bit.TXRDY == 0);//状态检测模式:
while ( SciaRegs.SCICTL2.bit.TXEMPTY == 0);//状态检测,等待发送标识为空
SciaRegs.SCITXBUF=46; //在ASCII码中显示是 . 这样串口可直接发送
while ( SciaRegs.SCICTL2.bit.TXRDY == 0);//状态检测模式:
while ( SciaRegs.SCICTL2.bit.TXEMPTY == 0);//状态检测,等待发送标识为空
i=V%10+48;
SciaRegs.SCITXBUF=i;
while ( SciaRegs.SCICTL2.bit.TXRDY == 0);//状态检测模式:
while ( SciaRegs.SCICTL2.bit.TXEMPTY == 0);//状态检测,等待发送标识为空
Send_String_SCIA("V\n"); //显示电压单位,换行
}
/*------------------------------------------*/
/*形式参数:char */
/*返回值:void */
/*函数描述:发送温度 */
/*------------------------------------------*/
void TXC(Uint16 C)
{
Uint16 i;
i=C/10+48; //显示10位温度数,因是串口发送ASCII码显示,0=48,所以得加48
SciaRegs.SCITXBUF=i;
while ( SciaRegs.SCICTL2.bit.TXRDY == 0);//状态检测模式:
while ( SciaRegs.SCICTL2.bit.TXEMPTY == 0);//状态检测,等待发送标识为空
i=C%10+48;
SciaRegs.SCITXBUF=i;
while ( SciaRegs.SCICTL2.bit.TXRDY == 0);//状态检测模式:
while ( SciaRegs.SCICTL2.bit.TXEMPTY == 0);//状态检测,等待发送标识为空
Send_String_SCIA("C\n"); //显示温度单位,换行
}
/*------------------------------------------*/
/*形式参数:char */
/*返回值:void */
/*函数描述:发送一个字符 */
/*------------------------------------------*/
void Send_Char_SCIA(char B)
{
while (SciaRegs.SCIFFTX.bit.TXFFST != 0);
SciaRegs.SCITXBUF=B;
while ( SciaRegs.SCICTL2.bit.TXRDY == 0);//状态检测模式:
while ( SciaRegs.SCICTL2.bit.TXEMPTY == 0);//状态检测,等待发送标识为空
}
/*------------------------------------------*/
/*形式参数: char *String */
/*返回值:void */
/*函数描述:发送一个字符串 */
/*------------------------------------------*/
void Send_String_SCIA(char *String)
{
while(*String !='\0')
{
Send_Char_SCIA(*String++);
}
}
/*------------------------------------------*/
/*形式参数:void */
/*返回值:char */
/*函数描述:接收一个字符 */
/*------------------------------------------*/
char Get_Char_SCIA(void)
{
DINT;//关闭总中断
while(SciaRegs.SCIRXST.bit.RXRDY != 1);//等待接收完毕
EINT; //开总中断
return (SciaRegs.SCIRXBUF.all); // 返回接收到的数据
}
/*------------------------------------------*/
/*形式参数:void */
/*返回值:void */
/*函数描述:SCIB中断处理函数 */
/*------------------------------------------*/
interrupt void SCIA_RXINT(void)
{
DINT;//关闭总中断
SCIA_RX_BUF=SciaRegs.SCIRXBUF.bit.RXDT; //读取SCI接收到的数据位
PieCtrlRegs.PIEACK.all = 0x0100; //响应中断,当PIEACKx相应的位被清0时,PIE向CPU请求中断
EINT; //开总中断
}
将整个工程上传方便大家测试,希望大家能指证程序中不足,以便改进,大家多多交流,共同进步。祝大家新年快乐
SCI for ADC.zip
(258.03 KB, 下载次数: 98)
|
|