微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > 射频无线通信设计 > CC2430 的AD转换问题 求大神救急啊

CC2430 的AD转换问题 求大神救急啊

时间:10-02 整理:3721RD 点击:
我用的是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;
}

}

可以对照下协议栈adc的底层配置文件看下,是不是哪里配置出错了

我用的是无线龙的精简协议栈,里边也没有关于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);
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top