【中科昊芯Start_DSC28027勇士开发板试用体验】通过pwm来调整led亮度

描述

本文来源电子发烧友社区,作者:jf_53933321, 帖子地址:https://bbs.elecfans.com/jishu_2286741_1_1.html

这块板子最大的特点是mcu带dsp。dsp最大的特点是有非常丰富的计算指令,而且计算指令占用系统时钟周期特别短。今天来玩pwm。
1.pwm是啥
PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。
2.pwm可以用来干啥

pwm输出可以接到led灯上,通过调节占空比可以达到调整led的亮度。pwm输出还可以接到蜂鸣器上,通过占空比调节声音频率,可以让蜂鸣器唱歌。这些都是大材小用。其实pwm最大的作用是做精密电源,或者做电机驱动。
3.上代码
我看了下板子上有的LED资源是接了OPWM4B和OPWM4A,正好可以用来验证。
开发板试用
 


  1.  
  2. void InitEPwm4Example()
  3. {
  4.         /*时钟分频标志位。        0: 不分频          1: 2分频*/
  5.         EPwm4Regs.CLKDIV.bit.CLKDIV = 1;
  6.         /*配置EPWM输出频率为TBCLK/3000/2=10kHz*/
  7.         EPwm4Regs.TBPRD = 3000000;
  8.         /*配置EPWM输出相位不偏移*/
  9.         EPwm4Regs.TBPHS.half.TBPHS = 0;
  10.         /*配置EPWM的TBCTR计数初值为0*/
  11.         EPwm4Regs.TBCTR = 0x0000;
  12.  
  13.         /*配置EPWM的占空比输出为50%*/
  14.         EPwm4Regs.CMPA.half.CMPA = 1500;
  15.         EPwm4Regs.CMPB = 0;
  16.  
  17.         /*配置EPWM的TBCTR采用向上向下计数*/
  18.         EPwm4Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
  19.         /*配置EPWM输出不装载相位偏移*/
  20.         EPwm4Regs.TBCTL.bit.PHSEN = TB_DISABLE;
  21.         /*配置EPWM时基频率TBCLK为系统时钟,不进行分频*/
  22.         EPwm4Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
  23.         EPwm4Regs.TBCTL.bit.CLKDIV = TB_DIV1;
  24.  
  25.         /*比较模块CMPA采用影子寄存器装载模式*/
  26.         EPwm4Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
  27.         EPwm4Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
  28.         /*比较模块CMPA从CTR=0时开始装载*/
  29.         EPwm4Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
  30.         EPwm4Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
  31.  
  32.         /*TBCTR向上计数时,达到CMPA事件,EPWM1A产生置高动作*/
  33.         EPwm4Regs.AQCTLA.bit.CAU = AQ_SET;
  34.         /*TBCTR向下计数时,达到CMPA事件,EPWM1A产生置低动作*/
  35.         EPwm4Regs.AQCTLA.bit.CAD = AQ_CLEAR;
  36.         /*TBCTR向下计数时,达到CMPB事件,EPWM1B产生置低动作*/
  37.         EPwm4Regs.AQCTLB.bit.CBD = AQ_CLEAR;
  38.         /*TBCTR向上计数时,达到CMPB事件,EPWM1B产生置高动作*/
  39.         EPwm4Regs.AQCTLB.bit.CBU = AQ_SET;
  40.  
  41.         /*中断事件选择,当CTR=0时开始产生事件中断*/
  42.         EPwm4Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;
  43.         /*中断事件选择,事件中断的使能信号*/
  44.         EPwm4Regs.ETSEL.bit.INTEN = 1;
  45.         /*中断事件分频配置,一周期产生1次中断*/
  46.         EPwm4Regs.ETPS.bit.INTPRD = ET_1ST;
  47.  
  48.         /*
  49.          HALFCYCLE 位无用, 配置无效;
  50.          HALFEN 位=0: 死区采用 2 倍 TBCLK 时钟;
  51.          HALFEN 位=1: 死区采用 TBCLK 时钟;
  52.          */
  53.         EPwm4Regs.DBCTL.bit.HALFEN = 1;
  54. //        EPwm4Regs.DBCTL.bit.HALFCYCLE = 1;
  55.  
  56.         /*死区输出模式配置,配置输出双边沿延时*/
  57.         EPwm4Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
  58.         /*死区极性配置,配置EPWMxA输出置高,EPWMxB输出置低*/
  59.         EPwm4Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
  60.         /*死区输入模式配置,配置输入的上升沿与下降沿延时来源为EPWMxA*/
  61.         EPwm4Regs.DBCTL.bit.IN_MODE = DBA_ALL;
  62.  
  63.         /*死区时间配置,配置输出上升沿延时5us*/
  64.         EPwm4Regs.DBRED = 600;
  65.         /*死区时间配置,配置输出下降沿延时5us*/
  66.         EPwm4Regs.DBFED = 600;
  67. }
复制代码



  1. int main(void)
  2. {
  3.         /*系统时钟初始化*/
  4.         InitSysCtrl();
  5.  
  6.         /*EPWM外设引脚初始化配置*/
  7.         InitEPwm4Gpio();
  8.  
  9.         InitPieCtrl();
  10.  
  11.         /*清中断,关中断*/
  12.         IER = 0x0000;
  13.         IFR = 0x0000;
  14.  
  15.         /*中断向量表初始化配置*/
  16.         InitPieVectTable();
  17.  
  18.         EALLOW;
  19.         /*配置EPWM1_INT中断向量表指向执行相应的中断服务程序*/
  20.         PieVectTable.EPWM1_INT = &epmw1_isr;
  21.         EDIS;
  22.  
  23.         EALLOW;
  24.         /*禁止EPWM的时基使能,允许EPWM初始化配置写入*/
  25.         SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
  26.         EDIS;
  27.  
  28.         /*EPWM的初始化配置*/
  29.         InitEPwm4Example();
  30.  
  31.         EALLOW;
  32.         /*打开EPWM的时基使能,使EPWM的初始化配置起作用*/
  33.         SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
  34.         EDIS;
  35.  
  36.         /*使能打开IER的第3组中断向量*/
  37.         IER = M_INT3;
  38.  
  39.         /*使能打开IER的第3组中断向量的第一个向量*/
  40.         PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
  41.  
  42.         /*使能打开全局中断*/
  43.         EINT;
  44.  
  45.         while(1)
  46.         {
  47.  
  48.         }
  49.  
  50.         return 0;
  51. }
复制代码

4.效果图
开发板试用

5.IDE的神奇功效
IDE里有一个live view面板,我觉得live View可以代替示波器,在live View里设置刷新时间和观察的变量后,非常方便调试。再加上对变量值的以采样时间为横轴画图,真的就能达到示波器的效果,思路非常不错。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分