由相关的资料可知,W806具有4个A/D数据采集端口,相应引脚与采集通道的对应关系如下: ADC_CHANNEL_0 :PA1 ADC_CHANNEL_1 :PA4 ADC_CHANNEL_2 :PA3 ADC_CHANNEL_3 :PA2 另外,在例程中又做了如下定义: ADC_CHANNEL_8 :PA1 and PA4 ADC_CHANNEL_9 :PA3 and PA2 这2个通道似乎是属于差分式数据采集 此外,还指出芯片的引脚19~21是作为普通 ADC使用,其输入电压范围 0~2.4V。因此在测试信号高于2.4V时,需采用分压的方式来进行,其电路如图1所示。 这里有个疑问,引脚22(PA4)是那种类型呢?若不是普通 ADC,难道是高速ADC吗? 为提高检测精度,电路中的R1和R2要使用高精度电阻。R1,R2的电阻值需根据Sensor的输出最大值来配置。
图1 分压电路
由于以前驱动OLED屏的引脚是PA1和PA4,这与ADC的引脚相冲突,故需要改到其它引脚才行,但又不能与串口UART0相冲突。 SCK---PB24 SDA---PB25 模拟信号的输入引脚为PA1,进行A/D采集与显示的效果如图2所示
图2 采集与显示效果 ADC的初始化函数为:
- static void ADC_Init(void)
- {
- hadc.Instance = ADC;
- hadc.Init.channel = ADC_CHANNEL_0;
- hadc.Init.freq = 1000;
- if (HAL_ADC_Init(&hadc) != HAL_OK)
- {
- Error_Handler();
- }
- }
复制代码
实现图2所示效果的主程序为:
- int main(void)
- {
- intvalue,v;
- uint32_tnum=0;
- SystemClock_Config(CPU_CLK_160M);
- GPIO_Init();
- OLED_Init();
- OLED_Clear();
- OLED_ShowString(16,0,"OLED & ADC",16);
- OLED_ShowString(80,2,"mv",16);
- ADC_Init();
- while (1)
- {
- value = HAL_ADC_GET_INPUT_VOLTAGE(&hadc);
- printf("value = %dmvrn", value);
- OLED_ShowNum(32,2,value,4,16);
- HAL_Delay(1000);
- }
- }
复制代码
经程序编译,其程序下载的结果如图3所示。
图3下载结果 在悬空状态下,其采样值约为36;若接在GND上,则为30,不知是何原因!
|