[范例教程] 【笙泉MA82G5D】高速PWM范例

[复制链接]
235|1
 楼主 | 2018-12-12 09:02 | 显示全部楼层 |阅读模式
本帖最后由 noctor 于 2018-12-17 13:06 编辑
使用过笙泉5D的应该都知道,5D的PWM内部时钟源频率可以跑到96M,性能强劲,这里放一下使用96M时钟源的PWM例程。
  1. /*
  2. PWM输出范例程序
  3. 此范例的基本配置,16位PWM,PCA时钟源为内部晶振倍频96MHz,PWM0,1和PWM2,3为互补输出,PWM的频率可由PcaInitValue进行调整
  4. */
  5. #include "REG_MA82G5Dxx.H"
  6. #include <intrins.h>
  7. #define PcaInitValue 65536-40000
  8. #define nop() _nop_()
  9. #define ISP_READ                1           
  10. #define ISP_WRITE             2           
  11. #define ISP_WRITE_P     4     
  12. #define ISP_READ_P             5     

  13. typedef unsigned char                                        BYTE;

  14. void WriteP(BYTE PsfrAddr,BYTE PsfrData)
  15. {
  16.                 bit bEA=EA;
  17.                 EA = 0;                                         
  18.                 IFADRH = 0;                                 
  19.                 IFADRL= PsfrAddr;                        
  20.                 IFD= PsfrData;                                
  21.                 IFMT = ISP_WRITE_P;
  22.                 ISPCR = 0x80;                                
  23.                 SCMD = 0x46;
  24.                 SCMD = 0xB9;
  25.                 nop();
  26.                 ISPCR = 0;                                       
  27.                 EA = bEA;                                       
  28. }

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

  34. void main()
  35. {
  36.         InitClock();
  37.         
  38.         //PWM I/O推挽输出设置
  39.   P2M0=0x14;                        //PWM推挽输出:P2.2 P2.4
  40.         SFRPI=0x1;
  41.   P2M1=0x0;
  42.   P2=0x0;

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

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

  60.         PCAPWM0=P0RS0|P0RS1;
  61.         PCAPWM2=P2RS0|P2RS1;
  62.         PCAPWM1=P1RS0|P1RS1;
  63.         PCAPWM3=P3RS0|P3RS1;

  64.         CR=1;        //PCA使能计数

  65.         while(1);
  66. }
复制代码


 楼主 | 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中断。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

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