[STC单片机] iap15w413as单片机,cs1231 AD 芯片

[复制链接]
2283|3
 楼主| lovezichao 发表于 2015-4-23 13:53 | 显示全部楼层 |阅读模式
本帖最后由 lovezichao 于 2015-4-23 17:56 编辑

最近在使用IAP15W413AS这个单片机和AD芯片CS1231做一个称重处理的小东西。调试很长时间,内码数值及线性也挺可以的,只是会读出来大量的0值,比如说正常内码值为5500,但是会突然再跳变为全0。使用串口将读到的AD值输出到电脑,发现也确实是AD会读到大量的0.不知道有没有谁遇到过,或者帮小北看下。下面贴上AD部分电路和程序。
  1. void Delay(unsigned int n) {
  2.         unsigned int i, j;
  3.         for(i = 0; i < n; i++){
  4.                 for(j = 0; j < 200; j++){

  5.                 }
  6.         }
  7. }

  8. /*
  9.         时钟脉冲
  10. */
  11. void CS1231_Clk(void)
  12. {
  13.         IO_ADC_SCLK = 1;
  14.         Delay(10);
  15. // _nop_();_nop_();_nop_();
  16.         IO_ADC_SCLK = 0;
  17.   //_nop_();_nop_();_nop_();
  18.         Delay(10);
  19. }

  20. /*
  21.         从CS1231读取1字节的数据,返回无符号的rdata
  22. */
  23. unsigned char Read_byte_adcIC (void) {
  24.         int i;
  25.         unsigned char rdata = 0;            //初始化返回值为0
  26.         
  27.         for (i = 0; i < 8; i++) {
  28.                 rdata <<= 1;          //返回值左移1位
  29.                 CS1231_Clk();        //上升沿接收数据,下降沿更新数据
  30.                 if (IO_ADC_DDAT) {
  31.                         rdata |= 1;        //若数据线上数据为1,则返回值加1
  32.                 } else {
  33.                         
  34.                 }
  35.         }
  36.         
  37.         return(rdata);
  38. }

  39. /*
  40.         从CS1231读取AD值数据,返回4字节的长整型数据Rdata
  41. */
  42. unsigned char Data[4] = {0};
  43. unsigned long longTemp;
  44. long Get_AD_adcIC(){
  45.         unsigned int i;
  46.         long Rdata = 0;

  47.   //while(IO_ADC_DDAT);                                //读数据前确定数据线为低
  48.         IO_ADC_SCLK = 0;                      //此语句可确保在读AD值之前SCLK为低电平
  49.         for(i = 0; i < 3; i++) {  //读到的3字节数据到在数组的元素:1~3
  50.                 Data = Read_byte_adcIC();
  51.         }
  52.   Delay(1);
  53.         CS1231_Clk();          //向CS1231发送结束标志位        
  54.   //IO_ADC_DDAT = 1;
  55.         
  56.         // Rdata = result << 8;
  57.         Rdata  = Data[2] << 8UL;
  58.         longTemp = Data[1];
  59.         Rdata |= longTemp << 16UL;
  60.         longTemp = Data[0];
  61.         Rdata |= longTemp << 24UL;
  62.         Rdata = Rdata / 256; // 24bit adc value

  63.         return(Rdata);
  64. }

  65. /*
  66.         cs1231初始化
  67. */
  68. void Init_adcIC(void)      //CS1231初始化
  69. {
  70. //         PDWN = 0;
  71. //         Delay(2);
  72.          PDWN = 1;            //power down (低电平有效)
  73.         IO_ADC_SCLK = 0;     // SCLK长时间表为高电平时,AD会进入待机模式
  74.         while(IO_ADC_DDAT);  //等待到一个AD值,表示AD工作正常
  75.         
  76. }






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
ningling_21 发表于 2015-4-23 16:17 | 显示全部楼层
程序中把那些0值过滤掉即可
 楼主| lovezichao 发表于 2015-4-23 17:47 | 显示全部楼层
ningling_21 发表于 2015-4-23 16:17
程序中把那些0值过滤掉即可

应用中可能还存在数值真的为0的情况,所以不可能单纯的过滤……
 楼主| lovezichao 发表于 2015-4-23 17:58 | 显示全部楼层
本帖最后由 lovezichao 于 2015-4-23 18:01 编辑

将读AD函数改为下面这样处理,效果好很多。
  1. signed long adcResult = 0;
  2. signed long Get_AD_adcIC(){
  3.         unsigned int i;
  4.         long Rdata = 0;
  5.   
  6.   //while(IO_ADC_DDAT);                                //读数据前确定数据线为低
  7.         IO_ADC_SCLK = 0;                      //此语句可确保在读AD值之前SCLK为低电平
  8.   

  9.   *((unsigned char *)(&adcResult)+0) = Read_byte_adcIC();
  10.   *((unsigned char *)(&adcResult)+1) = Read_byte_adcIC();
  11.   *((unsigned char *)(&adcResult)+2) = Read_byte_adcIC();
  12.   *((unsigned char *)(&adcResult)+3) = 0; //Read_byte_adcIC();
  13.   
  14.   
  15.   Delay(1);
  16.         CS1231_Clk();          //向CS1231发送结束标志位       

  17.   adcResult = adcResult / 65536;
  18.         return(adcResult);
  19. }


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

本版积分规则

个人签名:欢迎前辈指点,必将勇往直前。

31

主题

225

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部