首页->【玩CortexM0】

13 0

实验六 2路ADC采样实验

采用实验五完成的LCD作为采样结果演示显示屏。

首先需要设计屏幕位置,此屏的宽是128点阵,ASCII吗是8X8,8像素宽的,因此一行能显示16个ASCII码;

12位ADC采样出来的结果是浮点:0~1的数,为了简单起见,换算成有效位0~9999显示,一行2个,设计如下:

A0 XXXX A1 XXXX

在main前边写2个函数,一个是基本显示内容,不改变的:

void dispBase(void){

 c2l(1,0,33);c2l(1,1,16);c2l(1,8,33);c2l(1,9,17);//A0,A1

}

void dispMes(void){

 c2l(1,3,int(val0*10)%10+16);c2l(1,4,int(val0*100)%10+16);c2l(1,5,int(val0*1000)%10+16);c2l(1,6,int(val0*10000)%10+16);

 c2l(1,11,int(val1*10)%10+16);c2l(1,12,int(val1*100)%10+16);c2l(1,13,int(val1*1000)%10+16);c2l(1,14,int(val1*10000)%10+16);

}

为什么不从第1行[控制为0]开始呢?因为后边我们会加入程序执行计数器,检验有无宕机和当即执行次数情况。

简单介绍转换: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

AnalogIn adc0(P0_19);//adc0为第一路ADC的对象类名

AnalogIn adc1(P0_20);//adc1为第二路ADC的对象类名

分别用P0_19,P0_20两个GPIO口作为两路ADC的输入。再在变量定义区增加两个浮点的变量:

float val0,val1;

在while(tyre)循环语句中加入:

val0=adc0.read();

val1=adc1.read();

如果是手动输入,当输入到val0=adc0在输入.后会弹出属性或方法提示列表,光标移到所需或鼠标双击所需,则对应的代码就自动加入到.之后,如果还有继续输入.或()完成代码。见图61。61-自动弹出属性或方法.jpg

更改main程序为:

//Main Program

int main(){

 lcdInit();

 lcdClear();

 dispBase();

 while(true){

  val0=adc0.read();

  val1=adc1.read();

  myled0 =!myled0;

  dispMes();

  wait(0.2);

 }

}

编译下载后,将电位器连接在P0_20,P0_21上分别调到A0显示3000,A1显示5000,电位器半圈的很难调,大概齐吧。结果见照片图62。62-2路ADC显示.JPG

为了检测程序执行情况,我们再加上一行显示。在变量定义区添加1个变量:

int32_t js;

在dispBase模块中增加一行:

c2l(0,0,42);c2l(0,1,51);//JS

考虑到程序执行测试的时间较长,取6位,代码为:

c2l(0,3,(js/100000)%10+16);c2l(0,4,(js/10000)%10+16);c2l(0,5,(js/1000)%10+16);c2l(0,6,(js/100)%10+16);c2l(0,7,(js/10)%10+16);c2l(0,8,(js)%10+16);

最后再在while循环体中增加一句:

js++;

这样查询每运行一个循环,js增加1,便已下载后运行结果见照片63。63-2路ADC+计数器.JPG

在看AnalogIn.h函数时,细心的玩着可能会发现有read_u16()函数,是否能测量16位的ADC数据呢?答案是不确定的。这个留在以后有时间讨论——因为采样的数值如果按照整形处理会出现跳断现象,按照浮点处理倒是连续,但如何显示成0~65535的数据?。


作者于2017-01-02 15:15:16修改!
楼主可见