打印
[范例教程]

【笙泉MA82G5D】高速PWM范例

[复制链接]
2039|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
noctor|  楼主 | 2018-12-12 09:02 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
PWM, pc, RS, ni, AI
本帖最后由 noctor 于 2018-12-17 13:06 编辑
使用过笙泉5D的应该都知道,5D的PWM内部时钟源频率可以跑到96M,性能强劲,这里放一下使用96M时钟源的PWM例程。
/*
PWM输出范例程序
此范例的基本配置,16位PWM,PCA时钟源为内部晶振倍频96MHz,PWM0,1和PWM2,3为互补输出,PWM的频率可由PcaInitValue进行调整
*/
#include "REG_MA82G5Dxx.H"
#include <intrins.h>
#define PcaInitValue 65536-40000
#define nop() _nop_()
#define ISP_READ                1           
#define ISP_WRITE             2           
#define ISP_WRITE_P     4     
#define ISP_READ_P             5     

typedef unsigned char                                        BYTE;

void WriteP(BYTE PsfrAddr,BYTE PsfrData)
{
                bit bEA=EA;
                EA = 0;                                         
                IFADRH = 0;                                 
                IFADRL= PsfrAddr;                        
                IFD= PsfrData;                                
                IFMT = ISP_WRITE_P;
                ISPCR = 0x80;                                
                SCMD = 0x46;
                SCMD = 0xB9;
                nop();
                ISPCR = 0;                                       
                EA = bEA;                                       
}

void InitClock(void)
{
        CKCON0 = 0x58;                        // 12MHz, ENCKM, CpuCLK=SYSCLK/2
        WriteP(CKCON2_P,0x5c);        //  MCK=CKMI*8  =6*8=48MHz
}

void main()
{
        InitClock();
        
        //PWM I/O推挽输出设置
  P2M0=0x14;                        //PWM推挽输出:P2.2 P2.4
        SFRPI=0x1;
  P2M1=0x0;
  P2=0x0;

        P3M0=0x0;           //PWM推挽输出:P3.3 P3.4
        P3M1=0x18;
  P3=0x0;
//PCA相关配置
        CMOD=CPS2|BME2|BME0|ECF;        //PcaClk = MCKI X 16,BME0为PWM0,1互补输出使能

        CCON = 0x00;                                        //清空flag,禁用PCA
  CH=CHRL=PcaInitValue>>8; CL=CLRL=PcaInitValue;      //设置 CH:CL & 重载值
//PWM设置
  CCAPM0=CCAPM2=ECOM0|PWM0;                                 // 使能PWM
  CCAPM1=CCAPM3=ECOM0|PWM0;
        PCAPWM0=PCAPWM2=P0RS0|P0RS1;            // 16位分辨率         
        PCAPWM1=PCAPWM3=P0RS0|P0RS1;   
//占空比设置
        CCAP0H=CCAP1H=(PcaInitValue+10000)>>8;
        CCAP0L=CCAP1L=(PcaInitValue+10000);
        CCAP2H=CCAP3H=(PcaInitValue+20000)>>8;
        CCAP2L=CCAP3L=(PcaInitValue+20000);            

        PCAPWM0=P0RS0|P0RS1;
        PCAPWM2=P2RS0|P2RS1;
        PCAPWM1=P1RS0|P1RS1;
        PCAPWM3=P3RS0|P3RS1;

        CR=1;        //PCA使能计数

        while(1);
}


沙发
noctor|  楼主 | 2018-12-12 09:56 | 只看该作者
本帖最后由 noctor 于 2018-12-13 15:31 编辑

MA82G5Dxx的PWM相关设置步骤如下:

一:如果需要使用96MHz的PWM时钟设置系统时钟,12MHz系统时钟通过倍频器输出CKMI *8 =48MHz的系统时钟(通过寄存器CKCON)。
二:设置PWM输出的相应端口为推挽输出(通过寄存器PxMxsfr)。
三:设置PCA定时器的时钟源(CKMIX16最高96MHz)、桥臂控制、计数器模式、重载值,设置重载值前务必关闭PCA计数器,重载值如:CHRLCLRL=0x0000(通过寄存器CMODCHRLCLRL
四:设置PCAPWM分辨率(通过寄存器PCAPWM)。如:PCAPWM0=0x00
五:设置PWM的占空比(通过寄存器CCAPnH、CCAPnL)。如:CCAPnH、CCAPnL=0x8000占空比为50%。
六:设置PCAPWM模式(通过CCAPM)。例如:CCAPMn=0x42
七:启动PCA计数(通过CCON)。
八:若设置中断,PWM与PCA的中断入口地址一样不同的标志位确定哪一路PWM中断。如:CCFn=1,为第n路PWM中断。

使用特权

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

本版积分规则

26

主题

82

帖子

3

粉丝