0
【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的浮点数。
至此本例的代码就完成了,结果见照片。
|
|