[讨论] CC2430 的AD转换问题 求大神救急啊

kuaileniwo89   2013-9-26 20:05 楼主
我用的是CC2430无线单片机连接自行设计的传感器,进行AD采样和无线传输,AD采样过程出现问题一直无法解决。我设计的传感器是个复合传感器,出来四路信号,都需要进行AD转换,但是四路信号不能同时出来,需要一个控制位来控制传感器的哪一部分工作,我用的是P1_1作控制位,当为1时,传感器输出信号1接到P0_2进行AD转换,当P1_1为0时,传感器输出信号2,3,,4分别送给P0_1,P0_4,P0_6进行AD转换,采集完一次四个信号值之后,进行无线传输,但是转换的结果总是不对,是乱的!当不加控制位时,就是给固定的高或者低,AD转换是正常的,都是正常的结果,但是一将控制位写近程序就不对了,实在是头疼,找不到原因所在,大神们,救命啊!
dstADDR.saddr = 0; //RFD发送数据的目的地址为网络协调器
ppState = PP_STATE_SEND;
        aplSetMacMaxFrameRetries(0);
        while (1) {
              ppState = PP_STATE_SEND;

             P1_1=1;

                          k1=halAdcSampleSingle(ADC_REF_1_25_V, ADC_12_BIT, 0x02);
                       P1_1=0;
                          k2=halAdcSampleSingle(ADC_REF_1_25_V, ADC_12_BIT, 0x01);
                           k3=halAdcSampleSingle(ADC_REF_1_25_V, ADC_12_BIT, 0x04);
                         k4=halAdcSampleSingle(ADC_REF_1_25_V, ADC_12_BIT, 0x06);
                         SendData();//发送按键值和温度值函数
           }
void SendData(void )
{
        static INT16U count = 0;//计数变量,用以廷时
          apsFSM();////应用层处理函数

         switch (ppState) {

                                   case  PP_STATE_IDLE://空闲状态
                                  if(++count == 1000)//每一千次发送一次数据
                                   {
                                                                          count = 0;
                                    }
                                  break;

                case PP_STATE_SEND://发送数据状态
                                {
                                         payload[0]=k1;
                                         payload[1]=k1>>8;


                                           payload[2]=k2;
                                          payload[3]=k2>>8;


                                        payload[4]=k3;
                                         payload[5]=k3>>8;


                                          payload[6]=k4;
                                          payload[7]=k4>>8;

          ppState = PP_STATE_WAIT_FOR_TX;
          aplSendMSG (APS_DSTMODE_SHORT,//以网络地址发送
                            &dstADDR,
                             2,
                              0,
                                 1,
                                &payload[0],//数据
                          8,  //数据长度
                          apsGenTSN(),
                         FALSE);  //不需要应用层应答
                     ppState = PP_STATE_WAIT_FOR_TX;
                                }

                        break;

           case PP_STATE_WAIT_FOR_TX://等待发送数据完成
                                 if (apsBusy()) break; //如果没有完成则继续发送
                                 if (aplGetStatus() == LRWPAN_STATUS_SUCCESS)
                                {
                                      ppState = PP_STATE_IDLE;//发送成功切换到空闲状态
                                    }
                                  else
                                {
                                        ppState = PP_STATE_SEND;//发送不成功,重新发送
                                }
                                break;
                      }

}

回复评论 (2)

可以对照下协议栈adc的底层配置文件看下,是不是哪里配置出错了
淘宝:https://viiot.taobao.com/Q群243090717 多年专业物联网行业经验,个人承接各类物联网外包项目
点赞  2013-9-27 11:32

回复 沙发wateras1 的帖子

我用的是无线龙的精简协议栈,里边也没有关于AD的什么配置啊,协议栈里面很多东西我看着也不是太懂,这个是那个AD转换调用的程序,应该是没问题的
INT16 halAdcSampleSingle(BYTE reference, BYTE resolution, UINT8 input) {
    BYTE volatile temp;
    INT16 i,value;

    //reading out any old conversion value
    temp = ADCH;
    temp = ADCL;


    ADC_ENABLE_CHANNEL(input);
    ADC_STOP();

    ADC_SINGLE_CONVERSION(reference | resolution | input);
         for(i = 0; i <100; i++);
          //for(j = 0; j<1000; j++);

    //while (!ADC_SAMPLE_READY());

    ADC_DISABLE_CHANNEL(input);

    value = (((INT16)ADCH) << 8);
    value |= ADCL;


    resolution >>= 3;
    return value >> (8 - resolution);
}
点赞  2013-9-27 12:39
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复