在GD32F303的片内配置有12位的A/D转换器,并在开发板上配有一个电位器来产生模拟信号,通过它可检测A/D的采集功能,其电路原理图见图1所示。
图1 A/D检测电路 此外,还提供了一个双通道采集的例程以供学习和借鉴。 该例程的主体框架如下:
- while(1){
- /* ADC software trigger enable */
- adc_software_trigger_enable(ADC0, ADC_INSERTED_CHANNEL);
- /* delay a time in milliseconds */
- delay_1ms(2000);
- /* value convert */
- adc_val_1 = ADC_IDATA0(ADC0); // PC3
- adc_val_2 = ADC_IDATA1(ADC0); //PC5
- /* value print */
- printf(" adc val 1 is 0x%xrn", adc_val_1);
- printf(" adc val 2 is 0x%xrn", adc_val_2);
- printf(" rn");
- }
复制代码
经程序编译和下载,其运行效果如图2所示。
图2 运行效果 为能更加直观地观察数据采集的结果,特为其配置了一个0.96寸的双色显示屏来进行显示,其显示效果如图3所示。
图3 OLED屏显示效果 因为前面已经介绍过一个0.91寸单色显示屏的驱动方法,所以完全可以在它的基础上来实现双色屏的显示驱动。2个显示屏的关键区别就在于OLED屏的初始化函数上,双色屏的初始化函数为:
- void OLED_Init(void)
- {
- OLED_WR_Byte(0xAE,OLED_CMD);
- OLED_WR_Byte(0x02,OLED_CMD);
- OLED_WR_Byte(0x10,OLED_CMD);
- OLED_WR_Byte(0x40,OLED_CMD);
- OLED_WR_Byte(0x81,OLED_CMD);
- OLED_WR_Byte(0xff,OLED_CMD);
- OLED_WR_Byte(0xA1,OLED_CMD);
- OLED_WR_Byte(0xC8,OLED_CMD);
- OLED_WR_Byte(0xA6,OLED_CMD);
- OLED_WR_Byte(0xA8,OLED_CMD);
- OLED_WR_Byte(0x3f,OLED_CMD);
- OLED_WR_Byte(0xD3,OLED_CMD);
- OLED_WR_Byte(0x00,OLED_CMD);
- OLED_WR_Byte(0xd5,OLED_CMD);
- OLED_WR_Byte(0x80,OLED_CMD);
- OLED_WR_Byte(0xD9,OLED_CMD);
- OLED_WR_Byte(0xF1,OLED_CMD);
- OLED_WR_Byte(0xDA,OLED_CMD);
- OLED_WR_Byte(0x12,OLED_CMD);
- OLED_WR_Byte(0xDB,OLED_CMD);
- OLED_WR_Byte(0x40,OLED_CMD);
- OLED_WR_Byte(0x20,OLED_CMD);
- OLED_WR_Byte(0x02,OLED_CMD);
- OLED_WR_Byte(0x8D,OLED_CMD);
- OLED_WR_Byte(0x14,OLED_CMD);
- OLED_WR_Byte(0xA4,OLED_CMD);
- OLED_WR_Byte(0xA6,OLED_CMD);
- OLED_WR_Byte(0xAF,OLED_CMD); l
- OLED_WR_Byte(0xAF,OLED_CMD);
- OLED_Clear();
- OLED_Set_Pos(0,0);
- }
复制代码
实现图3所示效果的主程序为:
- int main(void)
- {
- /* configure systick */
- systick_config();
- /* ADC configuration */
- adc_init();
- IIC_Init();
- OLED_Init();
- OLED_Clear();
- OLED_ShowString(10,0,"GD32F303",16);
- OLED_ShowString(10,2,"OLED & ADC",16);
- OLED_ShowString(10,4,"CH1= ",16);
- OLED_ShowString(10,6,"CH2= ",16);
- OLED_ShowCHinese(79,0,9);
- OLED_ShowCHinese(95,0,10);
- OLED_ShowCHinese(111,0,11);
- while(1){
- /* ADC software trigger enable */
- adc_software_trigger_enable(ADC0, ADC_INSERTED_CHANNEL);
- /* delay a time in milliseconds */
- delay_1ms(2000);
- /* value convert */
- adc_val_1 = ADC_IDATA0(ADC0); // PC 3
- adc_val_2 = ADC_IDATA1(ADC0); // PC5
- OLED_ShowNum(48,4,adc_val_1,4,16);
- OLED_ShowNum(48,6,adc_val_2,4,16);
- }
- }
复制代码
那么我们如何在此基础上对A/D数据采集功能加以具体的应用呢? 我们可以为其配置相应的模拟传感器来解决应用的问题,例如对火焰传感器的添加,可进行火灾的检测和报警;若添加相应的土壤湿度传感器,这可对所种的植物进行湿度监测和管控。
图4 是一个对土壤湿度进行监测的示例,它是将土壤湿度传感器连接到了PC5的引脚上,也就是说通道2的检测值就是土壤的速度状态。 |
|
|
|