Z-Stack学习 -- 在协议栈下使用ADC

     在协议栈下使用ADC还是很简单的,对电压输出型的传感器,如果传感器输出为0 - 3.3V,就可以直接接到板上,如果是0 - 5V,可以先用一个分压电阻分压,然后接到板子上。这里用的是3.0的协议栈,板子是CC2538的,可能和2530有一点区别。

     一、硬件电路

     这部分其实很简单,按照传感器要求的电路接好就可以了,一定要注意的是,传感器和开发板共地,否则ADC的采样值会很奇怪。

     二、初始化

     在Z-Stack中,使用HAL层的API都需要先初始化,我觉得初始化的目的其实就是使能(这一点可以在初始化的程序中看到),初始化的程序中是这样写的:

void HalAdcInit (void)
{
#if (HAL_ADC == TRUE)
  adcRef = HAL_ADC_REF_VOLT;
#endif
}

     看到 #if (HAL_ADC == TRUE),那么我们就要确定HAL_ADC的值是什么,双击后F12,将程序改为 #define HAL_ADC TRUE ,然后在任务初始化函数中添加ADC的初始化并设置基准电压。

  HalAdcInit();                       // 初始化ADC
  HalAdcSetReference ( HAL_ADC_REF_AVDD );  //设置基准电压

     基准电压有几种选择,可以看数据手册来确定自己要用哪一种,这里选的是HAL_ADC_REF_AVDD ,相当于一个3.3V的基准电压,也就是说我们的传感器输出要在这个电压范围内。

     三、读取转换值

     我没有用过以前版本的协议栈,但看了其他的博客,我觉得3.0的协议栈中ADC读取的API 就是 HalAdcRead (uint8 channel, uint8 resolution)这个函数,可能做的功能更强了。在这个函数中它直接为我们设置好了IOC的寄存器,包括指定哪个端口为ADC功能,还有设置端口信号方向等。

     所以我们可以直接使用这个函数来读取AD转换的值,在任务函数的事件处理(自定义的)中加入这样一段程序:

    ui16Dummy = HalAdcRead (HAL_ADC_CHN_AIN7, HAL_ADC_RESOLUTION_12 );
    dOutputVoltage = ui16Dummy * 0.05 ;

     HalAdcRead()函数有两个输入的参数,分别是转换的通道和转换精度。之后输出的值是一个介于0和精度最大值之间的数。例如:我们选择的精度是8位,那么精度对应的最大值是255,这是HalAdcRead()函数的读取值就在0到255之间,我们就可以根据传感器的电压信号和其所测量的物理量的对应关系算出我们想要的值。

你可能感兴趣的:(ZIGBEE,Z-Stack,协议栈)