找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6953|回复: 1
打印 上一主题 下一主题
收起左侧

MSP430F5529单片机24位AD采样ADS1256串口发送采样数据

[复制链接]
跳转到指定楼层
楼主
ID:222844 发表于 2017-8-7 10:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include  "msp430F5529.h"
  2. #include  "ADS1256.h"

  3. void main(void)
  4. {
  5.   
  6.   WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  7.   
  8. P3SEL = BIT3+BIT4;
  9.   UCA0CTL1|=UCSWRST;
  10.   UCA0CTL1|=UCSSEL_1;
  11.   UCA0BR0 = 0x03;                           // 32kHz/9600=3.41 (see User's Guide)
  12.   UCA0BR1 = 0x00;                           //
  13.   UCA0MCTL = UCBRS_3+UCBRF_0;               // Modulation UCBRSx=3, UCBRFx=0
  14.   UCA0CTL1&=~UCSWRST;
  15.   UCA0IE|=UCRXIE;
  16.   _EINT();
  17.   
  18.   ADS1256_IO_init();
  19.   ADS1256_Init( );
  20.      while(1)
  21.     {   
  22.                 ADS_sum(ADS1256_MUXP_AIN0 | ADS1256_MUXN_AINCOM);
  23.                
  24.   ADS_sum(ADS1256_MUXP_AIN1 | ADS1256_MUXN_AINCOM);
  25.                
  26.   ADS_sum(ADS1256_MUXP_AIN2 | ADS1256_MUXN_AINCOM);
  27.                
  28.   ADS_sum(ADS1256_MUXP_AIN3 | ADS1256_MUXN_AINCOM);
  29.                
  30.   ADS_sum(ADS1256_MUXP_AIN4 | ADS1256_MUXN_AINCOM);
  31.                
  32.   ADS_sum(ADS1256_MUXP_AIN5 | ADS1256_MUXN_AINCOM);
  33.                
  34.   ADS_sum(ADS1256_MUXP_AIN6 | ADS1256_MUXN_AINCOM);
  35.                
  36.   ADS_sum(ADS1256_MUXP_AIN7 | ADS1256_MUXN_AINCOM);
  37.                
  38.     }
  39. }

  40. //  Echo back RXed character, confirm TX buffer is ready first
  41. /*#pragma vector=USCIAB0RX_VECTOR
  42. __interrupt void USCI0RX_ISR(void)
  43. {
  44.   while (!(IFG2&UCA0TXIFG));                // USCI_A0 TX buffer ready?
  45.   UCA0TXBUF = UCA0RXBUF;                    // TX -> RXed character
  46. }*/

  47. /*******************ADS1256的模拟SPI设置********************/
  48. unsigned char ADS1256_SPI(unsigned char dat)
  49. {
  50.   unsigned char i,r=0;
  51.      ADS1256_SCLK_L;            
  52.      for(i=0;i<8;i++)
  53.      {
  54.         r = r<< 1;        //SOMI接收的数据左移
  55. if(dat & 0x80)        
  56.     ADS1256_SIMO_H;     //高      
  57. else                  //        
  58.    ADS1256_SIMO_L;     //低      
  59.                                    //
  60. ADS1256_SCLK_H;     //SCK置高      |下      
  61. dat =dat << 1;      //             |降   
  62. ADS1256_SCLK_L;     //SCK置低      V沿      
  63.      
  64. if(ADS1256_SOMI)      //判断接受的数据
  65. r = r | 0x01;
  66. else
  67. r = r & 0xfe;
  68.      
  69.       }
  70.       delay_us(100);        //延时   t11
  71.      return r;
  72. }
  73. /************************************************************/
  74. /*****************ADS1256写寄存器******************************/
  75. void ADS1256_WREG(unsigned char regaddr,unsigned char dat)
  76. {
  77.    while(ADS1256_DRDY);           //当DRDY为低是才能写寄存器
  78.         ADS1256_SPI(ADS1256_CMD_WREG | (regaddr & 0xF)); //WREG指令+地址
  79.         ADS1256_SPI(0x00);      
  80.         ADS1256_SPI(dat);           //向ADS1256寄存器写数据
  81. }
  82. /************************************************************/
  83. /*****************ADS1256读数据*******************************/
  84. unsigned long ADS1256_ReadData(void)  
  85. {
  86.         unsigned char i=0;
  87.         unsigned long sum=0;
  88.       unsigned long r=0;
  89. while(ADS1256_DRDY);              //当DRDY为低是才能写指令
  90. ADS1256_SPI(ADS1256_CMD_SYNC);    //ADS1256转换指令
  91. ADS1256_SPI(ADS1256_CMD_WAKEUP);  //ADS1256唤醒指令                 
  92. ADS1256_SPI(ADS1256_CMD_RDATA);    //ADS1256转换指令
  93.          
  94.         for(i=0;i<3;i++)                      //接收数据24位
  95.         {
  96.              sum = sum << 8;
  97.   r = ADS1256_SPI(0x00);    //接收数据
  98.     sum |= r;            
  99.         }  
  100.         return sum;                          //返回数据
  101. }
  102. /************************************************************/
  103. /********************ADS1256初始化******************************/
  104. void ADS1256_Init(void)
  105. {      
  106. //        ADS1256_CS_L;
  107.         ADS1256_REST_L;         //ADS1256复位
  108.         delay_ms(2);
  109.         ADS1256_REST_H;                              
  110.         ADS1256_WREG(ADS1256_STATUS,0x04);               // 高位在前、校准、不使用缓冲
  111. ADS1256_WREG(ADS1256_MUX,0x08);                  // 初始化端口A0为‘+’,AINCOM位‘-’
  112. ADS1256_WREG(ADS1256_ADCON,0x00);                // 放大倍数1
  113. ADS1256_WREG(ADS1256_DRATE,ADS1256_DRATE_5SPS);  // 数据5sps
  114. ADS1256_WREG(ADS1256_IO,0x00);                   // IO状态输入

  115. }
  116. /************************************************************/
  117. /********************ADS转换结果*****************************/
  118. void ADS_sum(unsigned char road)
  119. {
  120. unsigned long results=0;
  121. unsigned long Result_sum=0;
  122. unsigned long fVoltage;
  123.         unsigned char i,rod;
  124. ADS1256_WREG(ADS1256_MUX,road);   //设置通道
  125. ADS1256_SPI(ADS1256_CMD_SELFCAL);    //偏移和增益自动校准
  126. results = ADS1256_ReadData();        //读取AD值,返回24位数据。
  127. Result_sum =  results >> 4;
  128. if(Result_sum<0x80000)               //测得电压值为正的情况
  129. {
  130.   fVoltage=Result_sum*954;        //954=2*2.5/2^19*100000000   2.5为基准电压  100000000为为了计算的准确性转换为整形计算
  131.   ADS1256_buf[0]=(unsigned char)(fVoltage/100000000);
  132.   ADS1256_buf[0]=ADS1256_buf[0]+0x30;
  133.   ADS1256_buf[1]='.';
  134.   ADS1256_buf[2]=(unsigned char)((fVoltage%100000000)/10000000);
  135.   ADS1256_buf[2]=ADS1256_buf[2]+0x30;
  136.   ADS1256_buf[3]=(unsigned char)((fVoltage%10000000)/1000000);
  137.   ADS1256_buf[3]=ADS1256_buf[3]+0x30;
  138.   ADS1256_buf[4]=(unsigned char)(fVoltage%1000000/100000);
  139.   ADS1256_buf[4]=ADS1256_buf[4]+0x30;
  140.   ADS1256_buf[5]=(unsigned char)(fVoltage%100000/10000);
  141.   ADS1256_buf[5]=ADS1256_buf[5]+0x30;
  142.   ADS1256_buf[6]=(unsigned char)(fVoltage%10000/1000);
  143.   ADS1256_buf[6]=ADS1256_buf[6]+0x30;
  144.   ADS1256_buf[7]=(unsigned char)(fVoltage%1000/100);
  145.   ADS1256_buf[7]=ADS1256_buf[7]+0x30;      
  146.   ADS1256_buf[8]='V';   //V      
  147.   ADS1256_buf[9]=0x20;
  148.   }
  149.    else      //测得电压值为负的情况
  150.   {
  151.   Result_sum=0xfffff-Result_sum;    //取反运算
  152.   fVoltage=Result_sum*954;  //954=2*2.5/2^19*100000000   2.5为基准电压  100000000为为了计算的准确性转换为整形计算
  153.   ADS1256_buf[0]=(unsigned char)(fVoltage/100000000);
  154.   ADS1256_buf[0]=ADS1256_buf[0]+0x30;
  155.   ADS1256_buf[1]='.';
  156.   ADS1256_buf[2]=(unsigned char)((fVoltage%100000000)/10000000);
  157.   ADS1256_buf[2]=ADS1256_buf[2]+0x30;
  158.   ADS1256_buf[3]=(unsigned char)((fVoltage%10000000)/1000000);
  159.   ADS1256_buf[3]=ADS1256_buf[3]+0x30;
  160.   ADS1256_buf[4]=(unsigned char)(fVoltage%1000000/100000);
  161.   ADS1256_buf[4]=ADS1256_buf[4]+0x30;
  162.   ADS1256_buf[5]=(unsigned char)(fVoltage%100000/10000);
  163.   ADS1256_buf[5]=ADS1256_buf[5]+0x30;
  164.   ADS1256_buf[6]=(unsigned char)(fVoltage%10000/1000);
  165.   ADS1256_buf[6]=ADS1256_buf[6]+0x30;
  166.   ADS1256_buf[7]=(unsigned char)(fVoltage%1000/100);
  167.   ADS1256_buf[7]=ADS1256_buf[7]+0x30;      
  168.   ADS1256_buf[8]='V';   //V         
  169.   ADS1256_buf[9]='-';
  170.   }
  171.         if(road/16 == 0)    //本次读取的数据是上一次转换的值
  172. rod = (7 + 0x30);    //进行通道-1计算
  173. else
  174. rod = ((road/16  + 0x30) -1);
  175.         PutString("第");
  176.         PutChar(rod);  
  177.         PutString("路:");        
  178.                
  179.            i=0;
  180.     while(i<12)
  181.            {
  182.                PutChar(ADS1256_buf[i]);            
  183.                i++;                                    
  184.            }
  185.             while (!(UCA0IFG&UCTXIFG));
  186.             UCA0TXBUF = '\n';
  187.             Delays( );
  188. }


  189. /**********************ADS1256_IO初始化****************************/
  190. void ADS1256_IO_init()
  191. {
  192.          P2SEL &=~ 0XFF;
  193.          P2DIR |=  BIT0  + BIT3 + BIT4;
  194.          P2DIR &=~ (BIT2 + BIT5);
  195. }
  196. /************************************************************/

  197. /*******************************************
  198. 函数名称:PutSting
  199. 功    能:向PC机发送字符串
  200. 参    数:ptr--指向发送字符串的指针
  201. 返回值  :无
  202. ********************************************/
  203. void PutString(uchar *ptr)
  204. {
  205.       while(*ptr != '\0')
  206.       {
  207.             while (!(UCA0IFG&UCTXIFG));                // TX缓存空闲?
  208.             UCA0TXBUF = *ptr++;                       // 发送数据
  209.       }
  210.       while (!(UCA0IFG&UCTXIFG));
  211.       UCA0TXBUF = '\n';
  212. }
  213. /*******************************************
  214. 函数名称:PutChar
  215. 功    能:向PC机发送一个字符对应的ASCII码
  216. 参    数:zifu--发送的字符
  217. 返回值  :无
  218. ********************************************/
  219. void PutChar(uchar zifu)
  220. {
  221.       while (!(UCA0IFG&UCTXIFG));
  222.       UCA0TXBUF = zifu;
  223.      
  224. }
  225. /*******************************************
  226. 函数名称:Delays
  227. 功    能:延时一会
  228. 参    数:无
  229. 返回值  :无
  230. ********************************************/
  231. void Delays(void)
  232. {
  233.      uchar i=20;
  234.      uint j;
  235.      while(i--)
  236.      {
  237.              j=2000;
  238.              while(j--);
  239.      }
  240. }
复制代码

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:433911 发表于 2019-5-21 20:54 | 只看该作者
楼主头文件ADS1256.h的内容是什么啊。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表