查看: 5626|回复: 2

[原创] [LPC11U68自设实验板]三、1路计数器,1路脉冲输出,2路ADC,2...

[复制链接]
  • TA的每日心情
    开心
    2019-2-14 16:49
  • 签到天数: 296 天

    [LV.8]以坛为家I

    241

    主题

    2239

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    4473
    最后登录
    2020-4-14
    发表于 2018-1-18 10:10:22 | 显示全部楼层 |阅读模式
    经过前期的折腾,LPC ContexM0有点明白了,借助简单的mbed工程设置了1路计数器,1路脉冲输出,2路ADC,2路PWM,5路中断输入——其中的1路作为超声波测距使用,见照片31。mbed写代码非常简单、具体如下:
    1. 6903.h:
    2. //7X5PCB
    3. DigitalOut dat(P2_23);
    4. DigitalOut clk(P2_22);
    5. DigitalOut reg(P2_21);
    6. DigitalOut res(P2_20);
    7. //6903 102X64LCD
    8. const unsigned char asc2[][6]={//8x6 Dots 0-40
    9. {0x00,0x3E,0x45,0x49,0x51,0x3E},//0
    10. {0x00,0x00,0x21,0x7F,0x01,0x00},//1
    11. {0x00,0x31,0x43,0x45,0x49,0x31},//2
    12. {0x00,0x22,0x49,0x49,0x49,0x36},//3
    13. {0x00,0x04,0x0C,0x14,0x7F,0x04},//4
    14. {0x00,0x72,0x51,0x51,0x51,0x4E},//5-5
    15. {0x00,0x3E,0x49,0x49,0x49,0x06},//6
    16. {0x00,0x40,0x43,0x4C,0x50,0x60},//7
    17. {0x00,0x36,0x49,0x49,0x49,0x36},//8
    18. {0x00,0x30,0x48,0x48,0x48,0x3F},//9
    19. {0x00,0x1F,0x24,0x64,0x24,0x1F},//A-10
    20. {0x00,0x41,0x7F,0x49,0x49,0x36},//B
    21. {0x00,0x3E,0x41,0x41,0x41,0x22},//C
    22. {0x00,0x41,0x7F,0x41,0x41,0x3E},//D
    23. {0x00,0x41,0x7F,0x49,0x49,0x63},//E
    24. {0x00,0x41,0x7F,0x49,0x5C,0x60},//F-15
    25. {0x00,0x3E,0x41,0x45,0x47,0x24},//G
    26. {0x41,0x7F,0x08,0x08,0x08,0x7F},//H
    27. {0x00,0x00,0x41,0x7F,0x41,0x00},//I
    28. {0x00,0x42,0x41,0x7F,0x40,0x40},//J
    29. {0x00,0x41,0x7F,0x59,0x24,0x43},//K-20
    30. {0x00,0x40,0x7F,0x41,0x01,0x03},//L
    31. {0x00,0x7F,0x20,0x1E,0x20,0x7F},//M
    32. {0x00,0x7F,0x30,0x18,0x06,0x7F},//N
    33. {0x00,0x3E,0x41,0x41,0x41,0x3E},//O
    34. {0x00,0x41,0x7F,0x49,0x48,0x30},//P-25
    35. {0x00,0x3E,0x41,0x47,0x42,0x3D},//Q
    36. {0x00,0x41,0x7F,0x49,0x4C,0x33},//R
    37. {0x00,0x32,0x49,0x49,0x49,0x26},//S
    38. {0x00,0x60,0x41,0x7F,0x41,0x60},//T
    39. {0x00,0x7E,0x01,0x01,0x01,0x7E},//U-30
    40. {0x00,0x7C,0x02,0x01,0x02,0x7C},//V
    41. {0x00,0x7C,0x03,0x3C,0x03,0x7C},//W
    42. {0x00,0x43,0x24,0x18,0x24,0x43},//X
    43. {0x00,0x60,0x18,0x07,0x18,0x60},//Y
    44. {0x00,0x63,0x45,0x49,0x51,0x63},//Z-35
    45. {0x00,0x00,0x00,0x01,0x00,0x00},//.
    46. {0x00,0x14,0x14,0x14,0x14,0x14},//=
    47. {0x00,0x08,0x08,0x3E,0x08,0x08},//+
    48. {0x00,0x08,0x08,0x08,0x08,0x08},//-
    49. {0x00,0x00,0x00,0x24,0x00,0x00},//:-40
    50. };
    51. //Write Plus
    52. void wri(void){clk=0;clk=1;}
    53. //a byte data to lcd||dt=data reg=command
    54. void b2l(unsigned char dt,unsigned char command){
    55. unsigned char i;
    56. reg=command;  
    57. for(i=0;i<8;i++){
    58.   if(dt&0x80) dat=1;else dat=0;
    59.   dt=dt<<1;   
    60.   wri();
    61. }  
    62. }
    63. //Set display X,Y
    64. void setXY(unsigned char X,unsigned char Y){
    65. b2l(0x40+Y,0);//column
    66. b2l(0x80+X,0);//row
    67. }
    68. //LCD Clear
    69. void lcdClear(void){
    70. unsigned char t,k;
    71. setXY(0,0);
    72. for(t=0;t<9;t++){for(k=0;k<102;k++){b2l(0x00,1);}}
    73. }
    74. //Display ASCII
    75. void c2l(unsigned char x,unsigned char y,unsigned char c){
    76. unsigned char line;
    77. setXY(x*6,y);   
    78. for(line=0;line<6;line++)b2l(asc2[c][line],1);
    79. }
    80. //Initial 6903 LCD model
    81. void lcdInit(void){
    82. res=0;
    83. wait_ms(200);
    84. res=1;
    85. wait_ms(200);
    86. b2l(0x25,0);//00100 PD=1dcOn|=0Dcoff V=0Up|=1Left H==1
    87. wait_ms(5);
    88. b2l(0x15,0);//plus=L000~111=1/6-1/7-1/8-1/9//14=1/7
    89. wait_ms(5);
    90. b2l(0x9C,0);//Set VOP
    91. wait_ms(5);
    92. b2l(0x20,0);//PD=0,V=2,H=0
    93. b2l(0x0C,0);//LCD Set Final
    94. wait_ms(50);
    95. }
    96. //Display ASCII Test
    97. void dispAsc(void){
    98. int i,j,k=0;
    99. for(i=0;i<8;i++){
    100.   for(j=0;j<17;j++){
    101.    c2l(j,i,k);
    102.    if(k>39){k=0;}else{k++;}
    103.   }
    104. }
    105. }
    106. //END Files//
    107. mainTest.cpp代码:
    108. #include "mbed.h"
    109. #include "6903.h"
    110. //Never use The P0_10,P0_15,P0_0
    111. //Configuration GPIO 5X7LCD=P2_15,16,17,18
    112. DigitalOut led1(LED1);//LED1=P1_2
    113. DigitalOut plus0(P1_24);//输出脉冲类
    114. AnalogIn adc0(P0_23);//ADC类
    115. AnalogIn adc1(P0_13);
    116. PwmOut pwm0(P2_2);//PWM类
    117. PwmOut pwm1(P2_16);
    118. Ticker tick;//Ticker类
    119. Timer timer;//时钟类
    120. DigitalIn inPut0(P0_11);//5个输入口类
    121. DigitalIn inPut1(P0_12);
    122. DigitalIn inPut2(P0_14);
    123. DigitalIn inPut3(P0_16);
    124. DigitalIn inPut4(P0_17);
    125. InterruptIn plusIn11(P0_11);//5个输入口为中断输入类
    126. InterruptIn plusIn12(P0_12);
    127. InterruptIn plusIn14(P0_14);
    128. InterruptIn plusIn16(P0_16);
    129. InterruptIn plusIn17(P0_17);
    130. //Serial outPrt(USBTX,USBRX);//P0_19,P0_18
    131. void dispBase(void);
    132. void dispMes(void);
    133. int16_t pj11=0,pj12=0,pj14=0,pj16=0,pj17=0,ps11,ps12,ps14,ps16,ps17,mms=0;
    134. int32_t js;
    135. float val0,val1,dut0=0.95,dut1=0.96,ddt0=0.01,ddt1=0.008,begin,end,dist=10.1f;
    136. void myTick(){plus0=!plus0;}//Tick产生500Hz脉冲
    137. void PlusIn11(void){wait(0.001f);if(P0_11)ps11++;}//中断输入计数
    138. void PlusIn12(void){wait(0.001f);if(P0_12)ps12++;}
    139. void PlusIn14(void){wait(0.001f);if(P0_14)ps14++;}
    140. void PlusIn16(void){wait(0.001f);if(P0_16)ps16++;}
    141. void PlusIn17(void){//脉冲计数
    142. timer.start();
    143. begin=timer.read_us();
    144. while(plusIn17){;};
    145. end=timer.read_us();
    146. dist=(end-begin)/57;
    147. }
    148. void gpioInit(void){//GPIO定义
    149. pwm0.period(0.002f);//pwm0 Period
    150. pwm1.period(0.001f);//pwm1 Period
    151. inPut0.mode(PullNone);//P0_11
    152. inPut1.mode(PullNone);//P0_12
    153. inPut2.mode(PullNone);//P0_14
    154. inPut3.mode(PullNone);//P0_16
    155. }
    156. //MAIN Program
    157. int main(){
    158. int jj=0;
    159. gpioInit();
    160. lcdInit();
    161. lcdClear();
    162. dispBase();//基本LCD显示
    163. tick.attach(&myTick,0.001f);//Tick为1mS
    164. plusIn11.rise(&PlusIn11);//上升沿中断输入
    165. plusIn12.rise(&PlusIn12);
    166. plusIn14.rise(&PlusIn14);
    167. plusIn16.rise(&PlusIn16);
    168. plusIn17.rise(&PlusIn17);
    169. while(1){
    170.   val0=adc0.read();//ADC shuru
    171.   val1=adc1.read();
    172.   if(dut0>0.95f){dut0=0;}//PWM产生
    173.   dut0 +=ddt0;pwm0=dut0;
    174.   if(dut1>0.96f){dut1=0;}
    175.   dut1 +=ddt1;pwm1=dut1;
    176.   if(mms>49){pj11=ps11;pj12=ps12;pj14=ps14;pj16=ps16;mms=ps11=ps12=ps14=ps16=0;}else{mms++;}
    177.   if(js>9999999) js=0;else js++;
    178.   //outPrt.printf("AD0=%f AD1=%f PWM1=%.2f PWM2=%.2f ",val0,val1,dut0,dut1);
    179.   if(jj<10){jj++;}else{
    180.    jj=0;
    181.    led1=!led1;
    182.    dispMes();//检测结果显示
    183.   }
    184.   //wait_ms(10);
    185. }
    186. }
    187. //LCD 6903
    188. void dispBase(void){
    189. c2l(0,0,19);c2l(1,0,28);//JS
    190. c2l(0,1,10);c2l(1,1,0);c2l(8,1,10);c2l(9,1,1);//A0,A1
    191. c2l(0,3,25);c2l(1,3,32);c2l(2,3,1);//PW0
    192. c2l(8,3,25);c2l(9,3,32);c2l(10,3,2);//PW1
    193. c2l(0,4,25);c2l(1,4,19);//PJ
    194. }
    195. void dispMes(void){
    196. c2l(3,0,(js/1000000)%10);c2l(4,0,(js/100000)%10);c2l(5,0,(js/10000)%10);c2l(6,0,(js/1000)%10);
    197. c2l(7,0,(js/100)%10);c2l(8,0,(js/10)%10);c2l(9,0,(js)%10);//c2l(10,0,(js)%10);
    198. c2l(11,0,int(dist/100)%10);c2l(12,0,int(dist/10)%10);c2l(13,0,int(dist)%10);c2l(14,0,36);c2l(15,0,int(dist*10)%10);//c2l(17,2,int(dist*100)%10+16);
    199. c2l(3,1,int(val0*10)%10);c2l(4,1,int(val0*100)%10);c2l(5,1,int(val0*1000)%10);c2l(6,1,int(val0*10000)%10);
    200. c2l(11,1,int(val1*10)%10);c2l(12,1,int(val1*100)%10);c2l(13,1,int(val1*1000)%10);c2l(14,1,int(val1*10000)%10);
    201. c2l(4,3,int((dut0*10))%10);c2l(5,3,int((dut0*100))%10);c2l(6,3,int((dut0*1000))%10);
    202. c2l(12,3,int((dut1*10))%10);c2l(13,3,int((dut1*100))%10);c2l(14,3,int((dut1*1000))%10);
    203. c2l(3,4,(pj11)%10);c2l(5,4,(pj12)%10);c2l(7,4,(pj14)%10);c2l(9,4,(pj16/100)%10);c2l(10,4,(pj16/10)%10);c2l(11,4,(pj16)%10);
    204. }
    复制代码


    代码就是以上所有的。下载的基础mbed工程是LPC11U68 for Keil的,在其中修改PinName.h以适应自己的开发板上的硬件资源。主要的是提出实验过程的问题:
    1. 看PC11U68手册,分别可以有SCTimer0驱动的4路PWM输出和STCimer1的4路PWM输出,在实际实验中,无论选择SCTimeer0或SCTimer1都可以,全部仅1路PWM输出无任何问题,但只要选择了2路PWM输出就会只剩1路有效。本例的PWM分别为SCTimer的P2_2和SCTimer1的P2_16,结果为P2_2没有任何问题,而P2_16在手触摸某区域引脚时才会输出一段时间,有时能维持较长时间有,有事闪几下就没有了,原因不详。
    2. 代码中设置Serial串口任何一个都没有问题,但是只要输出命令,例如printf或outPrt.printff则芯片宕机,不动了!

    31

    31
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2019-2-14 16:49
  • 签到天数: 296 天

    [LV.8]以坛为家I

    241

    主题

    2239

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    4473
    最后登录
    2020-4-14
     楼主| 发表于 2018-1-18 16:52:01 | 显示全部楼层
    自己回复一下,此实验的问题1的PWM2没有输出找到原因了:芯片到PCB的引脚虚焊了——万能表静态量没有问题,拿放大镜仔细观察发现是搭焊,并没有流锡进去,重新焊接后就好了。但UARTx的输出还是有问题,只要设定printf函数,机器就宕了,原因还没有找到。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2016-10-20 11:32
  • 签到天数: 1 天

    [LV.1]初来乍到

    12

    主题

    108

    帖子

    0

    高级会员

    Rank: 4

    积分
    545
    最后登录
    2022-3-1
    发表于 2018-1-21 10:55:14 | 显示全部楼层

    谢谢分享,666666
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-5-5 06:53 , Processed in 0.108629 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表