微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > Cortex-M3 (NXP LPC1788)之PWM

Cortex-M3 (NXP LPC1788)之PWM

时间:11-19 来源:互联网 点击:

  1. R&(0x1<1))
  2. {
  3. rFIO1PIN&=~(1<18);
  4. rPWM0IR|=0x1<1;//MR1中断复位
  5. }
  6. }
  7. voidSystemInit()
  8. {
  9. rSCS&=~(0x1<4);//频率12M
  10. rSCS|=(0x1<5);//使能主振荡器
  11. while(0==(rSCS&(0x1<6)));//等待主振荡器稳定
  12. rCLKSRCSEL=0x1;
  13. rPLL0CFG=0x9;//配置CCLK=120M
  14. rPLL0CON=0x01;
  15. rPLL0FEED=0xAA;
  16. rPLL0FEED=0x55;
  17. while(0==(rPLL0STAT&(0x1<10)));
  18. rCCLKSEL=(0x1|(0x1<8));
  19. rPCLKSEL=0x2;//配置PCLK=60M
  20. rCLKOUTCFG=0x0|(0xb<4)|(0x1<8);
  21. }
  22. voidPWMInit()
  23. {
  24. rIOCON_P1_02&=~0x7;
  25. rIOCON_P1_02|=0x3;//P1.02配置成PWM0[1]
  26. rPCONP|=0x1<5;//使能PWM0外设
  27. rPWM0IR=0x73F;//初始化PWM相关控制寄存器
  28. rPWM0TCR=0;
  29. rPWM0CTCR=0;
  30. rPWM0MCR=0;
  31. rPWM0CCR=0;
  32. rPWM0PCR=0;
  33. rPWM0LER=0;
  34. rPWM0PR=0x1<20;//每0x1<20+1个PLCK上升沿,TC递增
  35. rPWM0TCR|=0x1<1;//复位TC和PC
  36. rPWM0TCR&=~(0x1<1);
  37. rPWM0MR0=100;
  38. rPWM0LER|=0x1;
  39. rPWM0MCR|=0x1<1|0x1;//MR0和TC匹配时复位TC和PC.并且产生中断
  40. rPWM0MR1=duty;
  41. rPWM0LER|=0x1<1;
  42. rPWM0MCR|=0x1<3;//MR1和TC匹配时产生中断
  43. }
  44. intmain()
  45. {
  46. PWMInit();
  47. rFIO1DIR|=(0x1<18);
  48. rISER1|=0x1<7;//PWM0中断使能
  49. rPWM0TCR|=0x1<1;//复位TC和PC
  50. rPWM0TCR&=~(0x1<1);
  51. rPWM0TCR|=0x1;//PC和TC计数使能
  52. rPWM0TCR|=0x1<3;//PWM模式使能
  53. while(1)
  54. {
  55. if(match_cnt>=1)
  56. {
  57. match_cnt=0;
  58. duty=duty+10;
  59. if(duty>=100)
  60. {
  61. duty=0;
  62. }
  63. rPWM0MR1=duty;
  64. rPWM0LER|=0x1<1;
  65. rPWM0MCR|=0x1<3;
  66. }
  67. }
  68. return1;
  69. }

程序在MR0匹配时复位TC,在MR1匹配时触发边沿。可以看到随着MR1匹配值的改变,LED灯的亮灭时间对应改变。(程序中的预分频寄存器PR设置为了让LED效果明显)

LPC1788的PWM可以进行双边沿的控制。如PWM0.2可以用MR0控制PWM的周期频率,用MR1和MR2控制PWM0.2的边沿。

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

网站地图

Top