打印
[Cortex-M0技术交流]

新塘MO51单片机PWM的寄存器操作方法

[复制链接]
2114|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
守稲者0|  楼主 | 2013-8-17 20:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

这是第一次用MO51通过寄存器的方法来操作PWM整了好久


/*************************************************************
* 用操作寄存器的方法设置PWM
*使能PWM的死区设置PWMO和PWM1为一对互补对,可调整死区时间,频率和占空比课自己设定,灵和性大
**************************************************************/
#include "DrvPWM.h"
#include "DrvGPIO.h"
#include "DrvSYS.h"
#include "SysInfra.h"
#include "ModuleID.h"

#define CLK 12000000  //ext_clok
#define Deadtime  20
void Init_sys(void)
{
           UNLOCKREG();                                  //寄存器锁定地址寄存器
           DrvSYS_SetOscCtrl(E_SYS_XTL12M,1);         //使能12M crystal

           /* Waiting for 12M Xtal stalble */
           DrvSYS_Delay(5000);
           LOCKREG();                                   //向“0x5000_0100”写入任何值,可以重锁保护寄存器
}

/*************************************************************
* PWM Initialization Code Template这个产生的频率在3M以下
**************************************************************/
void Init_pwm(double Fre,double Duty)
{
        Init_sys();
    /* Enable PWM clock */
    DrvPWM_Open();

    DrvPWM_SelectClockSource(DRVPWM_TIMER0, DRVPWM_EXT_12M);
   
     /*以下是对PWMO的寄存器设置*/
      PWMA->PPR.CP01=1;   //divider   1  f=PWMxy_CLK/((prescale+1)*(clock divider)*(CNR+1))
      PWMA->CSR.CSR0=0b100;//prescale 1
      PWMA->PCR.CH0INV=0;//Inverter close
      DrvPWM_EnableDeadZone(DRVPWM_TIMER0, Deadtime, 1);//deadtime set
      PWMA->PCR.CH0MOD=1;//function model auto_reload
          PWMA->PCR.CH0EN=0;//close pwm_timer
          PWMA->CNR0=(uint16_t)(CLK/(2*Fre)-1);     //set duty 50%  set frequence
          PWMA->CMR0=(uint16_t)((Duty*(PWMA->CNR0+1)/100.0)-1);//set duty
      PWMA->PIER.PWMIE0=0;//start Pwm_timer
      
      DrvGPIO_InitFunction(E_FUNC_PWM01);

         DrvPWM_SetTimerIO(DRVPWM_TIMER0, 1);

     /* Enable in/out for PWM Timer1 */
     DrvPWM_SetTimerIO(DRVPWM_TIMER1, 1);

    /* Enable the PWM Timer 1 */
     DrvPWM_Enable(DRVPWM_TIMER1, 1);

    /* Enable the PWM Timer 0 */
     DrvPWM_Enable(DRVPWM_TIMER0, 1);
     //PWMA->PCR.CH0EN=1;
}

int main(void)
{


        Init_pwm(10000,30);
    while(1)
    {
            ;
    }
}

相关帖子

沙发
linfeng24| | 2013-8-17 23:00 | 只看该作者
没看懂楼主意思?是分享程序,还是说不懂问题?问题在哪里?

使用特权

评论回复
板凳
天凉好个秋| | 2013-8-17 23:15 | 只看该作者
应该是分享

使用特权

评论回复
地板
守稲者0|  楼主 | 2013-8-18 16:41 | 只看该作者
呵呵  发帖的时候  发错了  是分享的   不好意思哦

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

4

帖子

0

粉丝