打印
[STM32F4]

【Nucleo-F413ZH创想】 实验四 两路ADC采样

[复制链接]
832|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhjb1|  楼主 | 2017-1-27 20:31 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
【Nucleo-F413ZH创想】 实验四 两路ADC采样
从实验四开始,换平台了。由于KEIL的编译速度简直不敢恭维,3分钟算少的,几乎让人崩溃,与其如此不如换成IAR——美中不足的是必须下载新版的IAR,直接从官网下载最新的7.8版的,在里面就能找到STM32F413ZH芯片,当然7.8版可不止增加了这些,还有许多各个公司的芯片。软件的下载、配置,option设置就不再多说了。
首先需要设计屏幕位置,此屏的宽是128点阵,ASCII吗是8X8,8像素宽的,因此一行能显示16个ASCII码;12位ADC采样出来的结果是浮点:0~1的数,为了简单起见,换算成有效位0~9999显示,一行2个,设计如下:
AD0:XXXX AD1:XXXX
在main前边写2个函数,一个是基本显示内容,不改变的:
//LCD 128X64
//Display BaseData
void dispBase(void){
c2l(1,0,33);c2l(1,1,36);c2l(1,2,16);c2l(1,3,26);//AD0:
c2l(1,10,33);c2l(1,11,36);c2l(1,12,17);c2l(1,13,26);//AD1:
}
//Disp Meseger
void dispMes(void){
c2l(1,4,16+int(val0*10)%10);c2l(1,5,16+int(val0*100)%10);c2l(1,6,16+int(val0*1000)%10);c2l(1,7,16+int(val0*10000)%10);
c2l(1,14,16+int(val1*10)%10);c2l(1,15,16+int(val1*100)%10);c2l(1,16,16+int(val1*1000)%10);c2l(1,17,16+int(val1*10000)%10);
}
简单介绍转换:int(val0*10)%10):val0*10——将小数点后第1位设为最高位,%10表示取0~9的有效数,当然前边的int取整函数可以不要,结果一样的,以下依次递减。上述一行运行的结果:例如ADC0=0.12341234,显示结果:1234,以后的数丢掉了。
下边开始ADC设置,打开AnalogIn.h函数,实例代码如下:
* AnalogIn temperature(p20);
*
* int main() {
*     while(1) {
*         if(temperature > 0.5) {
*             printf("Too hot! (%f)", temperature.read());
*         }
*     }
* }
分析此文档,可以得到定义对象后的类属性和方法就很简单了,下边尝试定义,在对象定义区:
//Define ADC GPIO
AnalogIn ad0(PC_0);//adc0为第一路ADC的对象类名
AnalogIn ad1(PC_1);//adc1为第二路ADC的对象类名
分别用P0_19,P0_20两个GPIO口作为两路ADC的输入。再在变量定义区增加两个浮点的变量:
float val0,val1;
在显示模块前边增加IO设置函数:
//IO Initial
void ioInit(void){
led1=1;led2=0;led3=1;
}
在while(tyre)循环语句中加入:
val0=adc0.read();
val1=adc1.read();
如果是手动输入,当输入到val0=adc0在输入.后会弹出属性或方法提示列表,光标移到所需或鼠标双击所需,则对应的代码就自动加入到.之后,如果还有继续输入.或()完成代码。
更改main程序为:
//Main Program
int main(){
lcdInit();
lcdClear();
dispBase();
while(true){
  val0=adc0.read();
  val1=adc1.read();
  led1=!led1;led2=!led2;led3=!led3;
  jsq++;
  dispMes();
  wait(0.2);
}
}
编译下载后,将电位器连接在P0_20,P0_21上分别调到A0显示3000,A1显示5000,电位器半圈的很难调,大概齐吧。结果见照片图62。
为了检测程序执行情况,我们再加上一行显示。在变量定义区添加1个变量:
int32_t jsq;
在dispBase模块中增加一行:
c2l(0,0,42);c2l(0,1,51);c2l(0,2,49);c2l(0,3,26);//JSQ:
考虑到程序执行测试的时间较长,取6位,代码为:
c2l(0,4,16+(jsq/100000)%10);c2l(0,5,16+(jsq/10000)%10);c2l(0,6,16+(jsq/1000)%10);c2l(0,7,16+(jsq/100)%10);c2l(0,8,16+(jsq/10)%10);c2l(0,9,16+(jsq)%10);
最后再在while循环体中增加一句:
jsq++;
这样每运行一个循环,jsq增加1。此实验完成后,将可以测试2路ADC,1个程序运行计数器,并且显示在LCD上,运行结果见照片41。
在看AnalogIn.h函数时,细心的玩着可能会发现有read_u16()函数,是否能测量16位的ADC数据呢?答案是不确定的。这个留在以后有时间讨论——因为采样的数值如果按照整形处理会出现跳断现象,按照浮点处理倒是连续,但如何显示成0~65535的数据需要讨论。

41-1路计数器2路ADC.JPG (537.25 KB )

图41

图41
沙发
zhuotuzi| | 2017-1-28 09:09 | 只看该作者
看懂了是MEBD这个真心好用啊,很容易上手

使用特权

评论回复
板凳
zhjb1|  楼主 | 2017-1-28 21:12 | 只看该作者
zhuotuzi 发表于 2017-1-28 09:09
看懂了是MEBD这个真心好用啊,很容易上手

是的,我已经用mbed玩了3种以上的板子了。真有点一通百通。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:永远好心情 [img]https://bbs.21ic.com/static/image/s

36

主题

198

帖子

1

粉丝