你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 1752|回复: 2

[STM32F412] [NUCLEO-F412ZG试用体验] 七、多路ADC读取显示实验

[复制链接]

82

主题

636

回帖

121

蝴蝶豆

版主

最后登录
2020-7-12
发表于 2017-3-30 18:00:00 | 显示全部楼层 |阅读模式
本实验完成模数转换。先将mainLcd.cpp复制一个,将复制的改为mainAdc.cpp,打开mainAdc.cpp。
首先需要将LCD的屏幕设计一下,如何码放需要显示在上边的东西。128X64点阵的屏幕,一行可以显示20个ASCII码,一共可以显示8行。这个实验计划测试:1路程序计数器、4路ADC、2路PWM、2路外部计数、2路Timer、1个按键,还需要显示一些其他信息。我们考虑屏幕设计是这样的:
1行        Counter ADC PWM Plus
2行        ad0:xxxx ad1:xxxx
3行        ad2:xxxx ad3:xxxx
4行        pwm1:xxx pwm2:xxx
5行        plus1:xxxxxx
6行        plus2:xxxxxx
7行        key:x
8行        CNT:xxxxxxxx
首先打开AnalogIn.h文档,里面的例子如下:
* AnalogIn temperature(p20);//定义对象实例 名称为temperatyre 类为p20
*
* int main() {
*     while(1) {
*         if(temperature > 0.5) {//如果采样数值大于0.5.注:adc采样的结果是浮点数
*             printf("Too hot! (%f)", temperature.read());//打印输出采样值
*         }
*     }
* }
接着我们看PinNames.h文档,可以查到adc0~adc5分别为:A0 = PA_3,A1 = PC_0,A2  = PC_3,A3 = PC_1,A4 = PC_4,A5 = PC_5,这6个IO口,对应用户手册的图是CN8
左下边的连续6个,我们先定义一个adc采样,而后完成后3个adc的采样。
在定义GPIOs的下边增加一行:
AnalogIn adc0(PA_3);
在定义变量的下边增加浮点数定义:
float val0;
再增加1个32位定义:
int32_t cnt;
增加1个新的函数,写屏ASCII固定字符部分:
//Display Base Meseger
void dispBase(void){
c2l(0,0,35);c2l(0,1,79);c2l(0,2,85);c2l(0,3,78);c2l(0,4,84);c2l(0,5,69);c2l(0,6,82);//Counter
c2l(0,8,33);c2l(0,9,36);c2l(0,10,35);c2l(0,12,48);c2l(0,13,55);c2l(0,14,45);//ADC
c2l(0,16,48);c2l(0,17,76);c2l(0,18,85);c2l(0,19,83);//Plus
c2l(1,0,65);c2l(1,1,68);c2l(1,2,16);c2l(1,3,26);//AD0:
c2l(7,0,35);c2l(7,1,46);c2l(7,2,52);c2l(7,3,26);//CNT:
}
再增加1个采样adc之后显示以及程序计数器计数值得显示函数:
void dispMes(void){
c2l(1,5,16+int(val0*10)%10);c2l(1,6,16+int(val0*100)%10);c2l(1,7,16+int(val0*1000)%10);c2l(1,8,16+int(val0*10000)%10);//ad0
c2l(7,4,16+(cnt/10000000)%10);c2l(7,5,16+(cnt/1000000)%10);c2l(7,6,16+(cnt/100000)%10);c2l(7,7,16+(cnt/10000)%10);
c2l(7,8,16+(cnt/1000)%10);c2l(7,9,16+(cnt/100)%10);c2l(7,10,16+(cnt/10)%10);c2l(7,11,16+(cnt)%10);
}
由于adc采样的结果是浮点数表示,0~1之间的数,因此转换成十进制显示
在main主函数的炼成的Clear();后边增加一行:val0*10,-将小数点后1位变为只是个位,int取整,之后%10取0~9的有效位数,以下的一样。
dispBase();
在main的while循环体内增加1行:
val0=adc0.read();
在循环体的最后增加2行:
cnt++;
dispMes();
将原来keyTest()函数中的lcdClear();注释了,改成//lcdClear();
将main函数中的dispAsc();注释了,改成//dispAsc();
编译下载后运行结果见照片71。下边在增加3路adc的屏幕固定字符设计和采样显示,以及main中,循环体中的增加内容请自己进行。最后的4路ADC采样结果见照片72。按键key还是有效的。

71-1路ADC在LCD上的显示结果.jpg
72-4路ADC显示结果.jpg
<
回复

使用道具 举报

1182

主题

3785

回帖

1

蝴蝶豆

论坛元老

最后登录
2020-3-17
发表于 2017-6-13 14:20:26 | 显示全部楼层
谢谢楼主分享
回复 支持 反对

使用道具 举报

6

主题

11

回帖

0

蝴蝶豆

初级会员

最后登录
2019-12-10
发表于 2017-6-30 16:41:28 | 显示全部楼层
刚好要学习F412,谢谢
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版