本实验完成所用的Arduino兼容的STM32F410RB开发板的1路Ticker启动程序计数器,2路ADC,2路PWM测试,ADC直测,PWM测试舵机控制。下边按照程序顺序直接给出代码。
首先需要设计LCD屏幕显示的信息
屏幕为8行17.5列,第一行显示程序计数器,由Ticher中断实现程序计数器累加功能,预计2mS中断一次,计数器累加1。
第二行显示两路ADC,因为是浮点数,显示.后的4位——0.0000~0.9999。
第三行显示PWM的周期变化值,也是浮点数,显示.后的3位——0.000~0.999。
还有5行显示X-NUCLEO-IKS01A2班子的数据应该够了,不够也可以采用其它方法解决。
首先将元main.cpp复制为mainTest.cpp,打开此文档输入:
- //Define GPIO functions Object
- AnalogIn adc0(PA_0);//定义PA_0为ADC0
- AnalogIn adc1(PA_1);//定义PA_1为ADC1
- PwmOut pwm0(PA_10);定义PA_10为PWM0
- PwmOut pwm1(PA_8);定义PA_8为PWM1
- Ticker tick;//Time Interupt Clock
- //DigitalOut led(LED1);——因为LCD显示器用了PA_5,所以此LED会随LCD数据而闪烁
- Serial sout(PA_2,PA_3);//定义串口输出
- I2C i2c(PB_9,PB_8);//定义I2C——此次无用,仅仅是验证定义不冲突——事实如此
- //声明函数
- void dispBase(void);
- void dispMes(void);
- //DEFINE VARIABLE
- int32_t jsq;
- float val0,val1,dut0=0.330f,dut1=0.450f,ddu0=0.003f,ddu1=0.002f;
- int pdir0=1,pdir1=1;
- //Define Ticker
- void tipInt(void){jsq++;}
- //IO Initial
- void ioInit(void){
- pwm0.period(0.003f);//pwm0 Period time
- pwm1.period(0.004f);//pwm1 Period time
- }
- int main(){
- ioInit();
- lcdInit();
- lcdClear();
- dispBase();
- tick.attach(&tipInt,0.005f);
- sout.printf("TEST 2ADC 2PWM a LCD Display\n\r");
- while(1){
- val0=adc0.read();
- val1=adc1.read();
- if(dut0>0.810f){pdir0=0;};if(dut0<0.180f){pdir0=1;}
- if(pdir0==0){dut0 -=ddu0;};if(pdir0==1){dut0 +=ddu0;}
- pwm0=dut0;
- if(dut1>0.610f){pdir1=0;};if(dut1<0.160f){pdir1=1;}
- if(pdir1==0){dut1 -=ddu1;};if(pdir1==1){dut1 +=ddu1;}
- pwm1=dut1;
- if((jsq/10)%10==1){dispMes();}
- sout.printf("ADC1=%0.4f ADC2=%0.4f PWM1=%0.3f PWM2=%0.3f\n\r",val0,val1,dut0,dut1);
- //led=!led;
- wait(0.05);
- }
- }
- //Display Base Meseger
- void dispBase(void){
- c2l(0,0,19);c2l(1,0,28);c2l(2,0,26);c2l(3,0,40);//JSQ:
- c2l(0,1,10);c2l(1,1,13);c2l(2,1,0);c2l(3,1,40);//AD0:
- c2l(9,1,10);c2l(10,1,13);c2l(11,1,1);c2l(12,1,40);//AD1:
- c2l(0,2,25);c2l(1,2,32);c2l(2,2,0);c2l(3,2,40);//PW0:
- c2l(9,2,25);c2l(10,2,32);c2l(11,2,1);c2l(12,2,40);//PW1:
- }
- //Display Messeg
- void dispMes(void){
- c2l(4,0,(jsq/1000000)%10);c2l(5,0,(jsq/100000)%10);c2l(6,0,(jsq/10000)%10);c2l(7,0,(jsq/1000)%10);//JSQ:
- c2l(8,0,(jsq/100)%10);c2l(9,0,(jsq/10)%10);c2l(10,0,(jsq)%10);//JSQ:
- c2l(4,1,int(val0*10)%10);c2l(5,1,int(val0*100)%10);c2l(6,1,int(val0*1000)%10);c2l(7,1,int(val0*10000)%10);//ad0
- c2l(13,1,int(val1*10)%10);c2l(14,1,int(val1*100)%10);c2l(15,1,int(val1*1000)%10);c2l(16,1,int(val1*10000)%10);//ad1
- c2l(4,2,int(dut0*10)%10);c2l(5,2,int(dut0*100)%10);c2l(6,2,int(dut0*1000)%10);
- c2l(13,2,int(dut1*10)%10);c2l(14,2,int(dut1*100)%10);c2l(15,2,int(dut1*1000)%10);
- }
打开mbed_config.h文档,将里面的一串口速率的两个9600,改为115200。
编译后还是有5个告警,没有错误,下载成功后的测试结果见照片:照片31是硬件+LCD屏幕设计以及显示结果、照片32是2路PWM示波器显示结果、照片33是有串口读出的数据、照片34是其中1路PWM控制舵机的示波器放大波形、35是两路ADC测试示意图。控制1路舵机的视频见:还在转码中... ...。