微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 实验三 2路ADC采样和2路PWM输出

实验三 2路ADC采样和2路PWM输出

时间:10-02 整理:3721RD 点击:
【NUCLEO-F412ZG试用体验】实验三 2路ADC采样和2路PWM输出
先完成2路ADC采样显示。
首先打开项目种的main.cpp/打开+号找到PinNames.h和AnalogIn.h文档
查看前文档是为了找到ADC的GPIO口,可以看到在Arduino兼容管脚中有6路A0~A5输入,分别对应如下:
A0          = PA_3,
A1          = PC_0,
A2          = PC_3,
A3          = PC_1,
A4          = PC_1,
A5          = PC_5,
就用前两个,可以使A0,A1也可以是PA_3,PC_0。
接着打开AnalogIn.h文档,可以看到NameSpaces mbed{下有个Example:
/** An analog input, used for reading the voltage on a pin
*
* @NOTE Synchronization level: Thread safe
*
* Example:
* @code
* // Print messages when the AnalogIn is greater than 50%
*
* #include "mbed.h"
*
* AnalogIn temperature(p20);
*
* int main() {
*     while(1) {
*         if(temperature > 0.5) {
*             printf("Too hot! (%f)", temperature.read());
*         }
*     }
* }
* @endcode
*/
要求main.cpp加入include "mbed.h"
其语法就是C++或C#类似,首先定义对象Object[本例定义两个]:
//Define ADC GPIO
AnalogIn ad0(PA_3);//ad0
AnalogIn ad1(PC_0);//ad1
接着在主函数中使用对象的方法就可以了,实际上挡输入ad0之后再输入.之后自动弹出此对象的方法和参数的,选择read();这种方法在C++和C#中是基本功能,见图-30。实际上为了在LCD中显示ADC采样数值,先赋值到变量,代码如下:
val0=ad0.read();
val1=ad1.read();
由于read()方法得到的是浮点数[0~1],为了显示方便,保留前有效4位,因此在显示中作如下处理:
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);
这样可以显示0~1中的0.xxxx4位有效数据,也可以将数据*3.3后显示电压数值,val1的代码同val0。
再在main.cpp前边加上变量定义:
float val0,val1,val2,val3;
val2,val3是为了以后实际用4路ADC采样预留的变量。
接着完成2路PWM的设置,打开PinNames.h文档,找到PWM设置,发现只有1个:
PWM_OUT     = PB_3,

需要两路,只有一路不够,参考STM32F412ZG_User Manual.pdf手册,可以看到实际上可以输出PWM的Arduino口有多个CN7插座上的D13~D9都支持PWM输出,简单起见,选用D12,D11对应PA_6,PA_7,自己在此文档PWM_OUT        = PB_3,下边写上:
PWM_OUT1    = PA_6,
PWM_OUT2    = PA_7,
而后打开PwmOut.h文档,同样看到案例代码:
* Example
* @code
* // Fade a led on.
* #include "mbed.h"
*
* PwmOut led(LED1);
*
* int main() {
*     while(1) {
*         led = led + 0.01;
*         wait(0.2);
*         if(led == 1.0) {
*             led = 0;
*         }
*     }
* }
* @endcode
此案例是由PWM信号控制LED的渐亮暗的,我们也是,只不过输出口定义为PA_6,PA_7而已,此文档我们关心对象类的PwmOut和period周期
在main.cpp前边加上对象定义:
//Define PWM Port
PwmOut pwm0(PA_6);
PwmOut pwm1(PA_7);
在ioInit()中加入周期定义:
pwm0.period(0.002f);
pwm1.period(0.001f);
在前边定义变量的地方加上:
float val0,val1,val2,val3,dut0=0.100f,dut1=0.050f,ddu0=0.02f,ddu1=0.04f;
在主程序中加上控制PWM周期的语句:
if(dut0<0.810f) dut0 +=ddu0;else dut0=0;
pwm0=dut0;
if(dut1<0.950f) dut1 +=ddu1;else dut1=0;
pwm1=dut1;
输出显示部分与ADC的处理一样,因为也是0~1的浮点数。
至此本例的代码就完成了,结果见照片。

自动代码向导



LCD显示2路ADC2路PWM


PWM示波器图示


PWM示波器图示


上传图片方式看这里:http://bbs.elecfans.com/jishu_429732_1_1.html

这个勋章怎么申请呀  我觉着也够10个最佳答案了

这个活动是12月份开始上线的。
累计到10个最佳答案,系统会自动赠送。

哎 原来的努力岂不白费了

大家都在同一个起跑线上。
相信你的实力,很快就可以拿到勋章的!

好吧  继续努力奋斗

不错的经验,看看

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top