这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 企业专区» Microchip» STC系列IAP15W413AS单片机,AD CS1231芯片

共5条 1/1 1 跳转至

STC系列IAP15W413AS单片机,AD CS1231芯片

菜鸟
2015-04-23 14:11:42 打赏

小弟最近在用IAP15W413AS这个单片机和AD芯片CS1231做一个小的称重处理项目。调试一段时间后发现,AD内码值以及线性变化也挺好的。但是,在读到的AD数值中间会穿插大量的0值,也就是内码会突变为0 。纠结好久,搞不懂为什么。有没有大神帮忙看下,谢谢。

下面附上AD部分电路以及AD驱动程序。

void Delay(unsigned int n) { unsigned int i, j; for(i = 0; i < n; i++){ for(j = 0; j < 200; j++){ } } } /* 时钟脉冲 */ void CS1231_Clk(void) { IO_ADC_SCLK = 1; Delay(10); // _nop_();_nop_();_nop_(); IO_ADC_SCLK = 0; //_nop_();_nop_();_nop_(); // } /* 从CS1231读取1字节的数据,返回无符号的rdata */ unsigned char Read_byte_adcIC (void) { int i; unsigned char rdata = 0; //初始化返回值为0 for (i = 0; i < 8; i++) { rdata <<= 1; //返回值左移1位 CS1231_Clk(); //上升沿接收数据,下降沿更新数据 if (IO_ADC_DDAT) { rdata |= 1; //若数据线上数据为1,则返回值加1 } else { } Delay(10); } return(rdata); } /* 从CS1231读取AD值数据,返回4字节的长整型数据Rdata */ signed long adcResult = 0; signed long Get_AD_adcIC(){ unsigned int i; long Rdata = 0; //while(IO_ADC_DDAT); //读数据前确定数据线为低 IO_ADC_SCLK = 0; //此语句可确保在读AD值之前SCLK为低电平 *((unsigned char *)(&adcResult)+0) = Read_byte_adcIC(); *((unsigned char *)(&adcResult)+1) = Read_byte_adcIC(); *((unsigned char *)(&adcResult)+2) = Read_byte_adcIC(); *((unsigned char *)(&adcResult)+3) = 0; //Read_byte_adcIC(); Delay(1); CS1231_Clk(); //向CS1231发送结束标志位 adcResult = adcResult / 65536; return(adcResult); } /* cs1231初始化 */ void Init_adcIC(void) //CS1231初始化 { // PDWN = 0; // Delay(2); PDWN = 1; //power down (低电平有效) IO_ADC_SCLK = 0; // SCLK长时间表为高电平时,AD会进入待机模式 while(IO_ADC_DDAT); //等待到一个AD值,表示AD工作正常 }

AD部分电路



院士
2015-04-23 14:31:42 打赏
2楼

编辑器有代码功能,干吗不用?


这看着多累啊


工程师
2015-04-26 00:13:22 打赏
3楼
太赞了,学习了

工程师
2017-04-10 12:32:54 打赏
4楼
我也遇到类似问题(AD输出不稳定中间夹杂突变数),我也是用的STC单片机,单用TM7711没有此现象,CS1231的应用笔记有提到时钟信号必须纯净,否则会出错,不知是不是这个问题,也没去验证。

菜鸟
2017-06-28 11:55:39 打赏
5楼
IO_ADC_DDAT ,IO_ADC_SCLK这两句怎么定义呢?

共5条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]