4722|11

22

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【玩转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)

最新回复

鼓励原创,顶起  详情 回复 发表于 2013-1-6 22:17

点评

gei给力 大家一起学习  详情 回复 发表于 2012-12-29 09:17
 
点赞 关注

回复
举报

5304

帖子

453

TA的资源

五彩晶圆(高级)

沙发
 
不错!学习了!
加油!呵呵
 
 

回复

22

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
哈哈,刚刚调出来,老大多指教哦

点评

呵呵,互相学习!  详情 回复 发表于 2012-12-28 15:57
 
 
 

回复

5304

帖子

453

TA的资源

五彩晶圆(高级)

4
 

回复 板凳 机动哥 的帖子

呵呵,互相学习!
 
 
 

回复

2056

帖子

0

TA的资源

五彩晶圆(初级)

5
 
楼主可以给个QQ吗?
有些问题想问你
 
 
 

回复

22

帖子

0

TA的资源

一粒金砂(中级)

6
 
什么问题啊!不防发上来大家一起来讨论啊。这样容易得到解决哦。

点评

我直接用你的工程无法导入,自己建的工程有非常多的错误。 你能详细解释怎么建立这个工程的吗?  详情 回复 发表于 2012-12-29 16:51
 
 
 

回复

33

帖子

0

TA的资源

一粒金砂(中级)

7
 

回复 楼主 机动哥 的帖子

gei给力  大家一起学习
 
 
 

回复

2056

帖子

0

TA的资源

五彩晶圆(初级)

8
 

回复 6楼 机动哥 的帖子

我直接用你的工程无法导入,自己建的工程有非常多的错误。
你能详细解释怎么建立这个工程的吗?
 
 
 

回复

22

帖子

0

TA的资源

一粒金砂(中级)

9
 
你用的是CCS5吗?我是用CCS5建的工程 。。你打开工程 后需要将这二个文件给屏蔽掉

上面是屏蔽的方法。还有要让程序运行到FALSH中。如果运行在RAM中的话CMD会报内存小的错误
 
 
 

回复

22

帖子

0

TA的资源

一粒金砂(中级)

10
 
在SRC中将这2个文件屏蔽,或直接在工程中的SRC文件夹中将它删除
图用用箭头指着的文件屏蔽掉,或到工程文件夹中把它删掉。要不就报内存不够的错误
   哈哈。。。。。   多多交流哦

[ 本帖最后由 机动哥 于 2013-1-2 09:36 编辑 ]
 
 
 

回复

22

帖子

0

TA的资源

一粒金砂(中级)

11
 
原来不需要外接串口板就可以实现和PC机通信的,直接利用板子上面的USB转串口就能实现通信了   一根USB线就能搞定了
 
 
 

回复

2606

帖子

0

TA的资源

五彩晶圆(初级)

12
 
鼓励原创,顶起
 
个人签名工程 = 数学+物理+经济
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表