我用的是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的底层配置文件看下,是不是哪里配置出错了
淘宝:https://viiot.taobao.com/Q群243090717
多年专业物联网行业经验,个人承接各类物联网外包项目
回复 沙发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);
}