对于FM33LGxx开发板开发板,它配有2Msps的12位ADC模数转换器,并达到20个采集通道,其中有14个快速通道,可以组成7个差分输入对;有6个慢速通道,仅支持单端输入。
在ADC数据采集的例程中,有单端采集的示例,其采集通道为ADC_1,所使用的引脚为PD1。
该引脚可由IO扩展接口来引出,见图1所示。
图1 数据采集引脚
将例程中的ADC数据采集功能与OLED屏的显示功能相结合,便可快速构成一个数字式电压表,其显示效果如图2所示。
图2 电压检测效果
实现该显示效果的主程序为:
int main(void)
{
MF_Clock_Init();
MF_SystemClock_Config();
FL_Init();
MF_Config_Init();
UserInit();
AdcInit();
oled_app();
OLED_Init();
OLED_Clear();
OLED_ShowString(20,0,"FM33LG0XX",16);
OLED_ShowCHinese(20,2,0);
OLED_ShowCHinese(36,2,1);
OLED_ShowCHinese(52,2,2);
OLED_ShowCHinese(68,2,3);
OLED_ShowCHinese(84,2,4);
OLED_ShowCHinese(100,2,5);
OLED_ShowString(20,5," mV",16);
while(1)
{
Get122VSample = GetVREF1P2Sample();
GetVSample = GetSingleChannelSample();
GetV = (GetVSample * 3000 * (ADC_VREF)) / (Get122VSample * 4095);
OLED_ShowNum(20,5,GetV,4,16);
FL_DelayMs(1000);
}
}
至于OLED屏的显示驱动,则可参考“OLED屏的显示驱动及其电子时钟”的内容。
https://bbs.elecfans.com/jishu_2322660_1_1.html
此外,在该数字式电压表的基础上再添加NTC的传感器电路即可进行温度的检测和控制,其电路如图3所示。
为此,将显示语句:
OLED_ShowString(20,5," mV",16);
改为:
OLED_ShowString(20,5," C",16);
然后修改while循环的内容,即可显示温度值。
其具体内容为:
while(1)
{
Get122VSample = GetVREF1P2Sample();
GetVSample = GetSingleChannelSample();
GetV = (GetVSample * 3000 * (ADC_VREF)) / (Get122VSample * 4095);
u= GetV;
...
if((u<=1495)&&(u>1153))
V=10+(1495-u)/34;
if((u<=1153)&&(u>861))
V=20+(1153-u)/29;
if((u<=861)&&(u>629))
V=30+(861-u)/23;
...
OLED_ShowNum(20,5,V,3,16);
FL_DelayMs(200);
}
由此可知,模数转换功能是十分有用的,而且还非常好用。
更多回帖