本帖最后由 lovezichao 于 2015-4-23 17:56 编辑
最近在使用IAP15W413AS这个单片机和AD芯片CS1231做一个称重处理的小东西。调试很长时间,内码数值及线性也挺可以的,只是会读出来大量的0值,比如说正常内码值为5500,但是会突然再跳变为全0。使用串口将读到的AD值输出到电脑,发现也确实是AD会读到大量的0.不知道有没有谁遇到过,或者帮小北看下。下面贴上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_();
- Delay(10);
- }
- /*
- 从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 {
-
- }
- }
-
- return(rdata);
- }
- /*
- 从CS1231读取AD值数据,返回4字节的长整型数据Rdata
- */
- unsigned char Data[4] = {0};
- unsigned long longTemp;
- long Get_AD_adcIC(){
- unsigned int i;
- long Rdata = 0;
- //while(IO_ADC_DDAT); //读数据前确定数据线为低
- IO_ADC_SCLK = 0; //此语句可确保在读AD值之前SCLK为低电平
- for(i = 0; i < 3; i++) { //读到的3字节数据到在数组的元素:1~3
- Data = Read_byte_adcIC();
- }
- Delay(1);
- CS1231_Clk(); //向CS1231发送结束标志位
- //IO_ADC_DDAT = 1;
-
- // Rdata = result << 8;
- Rdata = Data[2] << 8UL;
- longTemp = Data[1];
- Rdata |= longTemp << 16UL;
- longTemp = Data[0];
- Rdata |= longTemp << 24UL;
- Rdata = Rdata / 256; // 24bit adc value
- return(Rdata);
- }
- /*
- 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工作正常
-
- }
|