找回密码
 注册
关于网站域名变更的通知
查看: 529|回复: 1
打印 上一主题 下一主题

DSP28335-ePWM

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-9-22 13:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x
#include "DSP28x_Project.h"# ~4 ]- d5 Y# b4 G4 E4 }
// Configure the period for each timer5 K' E- y5 w% x; V
#define EPWM1_TIMER_TBPRD  3750  // Period register 系统始终为150MHZ,下面的程序进行了4分频,即为37.5MHZ,这样得到的是10KHZ; |. F% J* _% h4 P
#define EPWM1_START_CMPA     1900//设置PWM通道A初始占空比
6 `3 f3 k  E) y* P* j' k#define EPWM1_START_CMPB     1900//设置PWM通道B初始占空比
9 e! D. u* r( k* D- {! F9 F& b7 c4 ~void ChangeDuty(Uint16 Duty)//改变占空比函数. M9 P; d* l; \( F4 p2 p3 K5 e
{& s1 s/ a8 B( C. c' Y
    if(Duty > EPWM1_TIMER_TBPRD) Duty = EPWM1_TIMER_TBPRD;
; L: j/ b1 X  q! s# ^- H# ~    if(Duty < 0) Duty = 0;& L' B* B: ^4 w8 ?# @
    EPwm1Regs.CMPA.half.CMPA = Duty;     // Set compare A value
' h, o" N: @1 l5 D4 x/ o/ L' Q    EPwm1Regs.CMPB = Duty;               // Set Compare B value) _1 p) R$ p. T7 z
}
9 u! Q/ v. F: Hvoid PWM1_Init()//初始化PWM9 O4 C, y+ Y4 g% g  o0 U6 q
{+ n6 c; y9 K& d  T- m
/*首先进行的是PWM1引脚的初始化,因为PWM1的引脚为GPIO0和GPIO1,这两个引脚可以是普通的IO口,也可以复用输出PWM,这里选用复用功能*/6 W* m7 j# `) e# F* j% f2 T# a
    EALLOW;3 @7 T% S7 n8 d, {* p/ V7 K( z) k# U
    GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0;    // Enable pull-up on GPIO0 (EPWM1A)
5 D5 O# R, ]. ^# R* L* g( N    GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0;    // Enable pull-up on GPIO1 (EPWM1B)+ P# P( v9 z2 P. \
    GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;   // Configure GPIO0 as EPWM1A复用功能设置,为0代表是普通IO口* {7 ~: c( x& a0 w" T6 B
    GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1;   // Configure GPIO1 as EPWM1B& \  {. D9 K0 H# ]2 O1 o
    EDIS;
$ c; R" Q: b& _' E+ C5 D8 f    EALLOW;
+ v% o# m- C4 J/ |4 e( \    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;      // Stop all the TB clocks
( d3 n3 K) X; y; k5 o5 n    EDIS;
* C5 `- z, l' k9 E2 A    // Setup TBCLK
/ G$ V  T3 n( a" ]    EPwm1Regs.TBPRD = EPWM1_TIMER_TBPRD - 1;           // 设置周期
: w7 u" ?' Z3 P3 K- w) S9 [  j    EPwm1Regs.TBPHS.half.TBPHS = 0x0000;           // 这个代表的是相位,不明白什么东西
- C. T* p4 t7 t9 i* t6 k2 ^    EPwm1Regs.TBCTR = 0x0000;                      // Clear counter1 o/ s3 B/ W2 q( Z! ?+ I
    // Set Compare values9 f  e3 `9 a4 G! p" [
    EPwm1Regs.CMPA.half.CMPA = EPWM1_START_CMPA;     // Set compare A value
4 x0 z. I3 D. Y    EPwm1Regs.CMPB = EPWM1_START_CMPB;               // Set Compare B value2 T+ W3 G' n0 T+ b9 H9 m) ?1 F
    // Setup counter mode1 q6 b1 {1 P6 A+ I$ n
    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; //计数模式
! B+ M0 w1 _. o1 G' W0 w    EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;        // Disable phase loading
8 I2 R, A4 s6 Y' p    EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV2;       // 这里是进行2分频9 P" F/ u# t7 E, C
    EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV2;          //这里也是2分频
8 X- Y+ o; q: h    // Setup shadowing
  _1 m9 Y6 }4 A6 ^8 A! L& A# ^    EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;   //采用影子寄存器跟新
5 P9 G9 a6 S. c/ H    EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
+ P8 v% @+ {4 M    EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;  // Load on Zero3 ~, b3 t9 ~- I' h  `
    EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;$ v4 ~$ G* W! Q: |9 d3 a2 |* p% _( n1 E! ^
    // Set actions
6 E3 S( |$ b1 q2 F/ U' y    EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;          // Set PWM1A on event A, up count
& q3 Y. H; s) k6 _% c, {: l/ E    EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;           // Clear PWM1A on event A, down count
5 g4 ?* J6 U8 t    EPwm1Regs.AQCTLB.bit.CBU = AQ_SET;             // Set PWM1B on event B, up count- P4 _8 G8 _) d4 L
    EPwm1Regs.AQCTLB.bit.CBD = AQ_CLEAR;           // Clear PWM1B on event B, down count
. h+ h4 f7 w0 B( L2 z$ V    EALLOW;5 y; [! ~( W1 c$ i
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;         // Start all the timers synced" A8 D- D8 Z8 [" H- t6 B: C
    EDIS;
( c) E! s6 v1 v( ~1 E$ P/ u}
% s0 H6 [  Q6 A# a' m  X" h) @void All_Init()
9 `% `$ a! [# \- p7 S{+ q( [  `" P1 [1 Q
    InitSysCtrl();
' G$ ?& m" f1 l  n: {0 R    DINT;( X, |  v6 |( O+ G/ j  |
    InitPieCtrl();
4 @: @/ Q+ ]- j+ ^    IER = 0x0000;* o0 P$ r) B& b* Z. d6 B$ G: X1 E
    IFR = 0x0000;
# p+ m! M/ B* t: K% k: D7 L2 L    InitPieVectTable();
2 n( }9 ]; Y: m% i  f9 S9 n    PWM1_Init();: E+ k: b5 G! s  h
    EINT;   // Enable Global interrupt INTM' B4 Z# R/ l1 w' A) h* t$ P
    ERTM;   // Enable Global realtime interrupt DBGM9 v. s3 F2 T/ R6 @% [
}6 R* z; ^" o; `! @- b5 m
Uint16 Duty = 1900;; ?+ U' A1 ^! \; W) I* d
void main(void)
1 g. P5 x2 }. g" a1 ^. x/ F{6 p- R5 Y! V) F% t
    All_Init();
  L# ~9 R' Z9 f3 `7 N    while(1)
+ V  m+ }. z  \    {
3 V' f2 v* e0 B' F        ChangeDuty(Duty);
4 t7 ~1 M2 p. L! a' O; J    }& E" A+ Q6 i0 ?7 X' Z4 s# E
}
0 ?5 i3 W5 J& }! J
6 A5 Q3 E. I% O( l( _9 J产生PWM主要需要三个部件,. q0 Y0 S. i* c0 Q9 {) Y+ [' O
第一个是周期PRD,通过设定EPwm1Regs.TBPRD的值,来得到周期,我的代码中设定的是3750,系统时钟是150 M hz,经过四分频得到的是37.5Mhz,即1/(37.5M)秒,计数器每个时间间隔加一,加到3750需要的时间是3750 * 1 / (37.5M) = (1 / 10K)秒,即为计数周期,可知频率为10K。
0 ^# H+ S$ z  O  W. p第二个是计数器CTR,计数器根据设定的时钟频率不断累加,我设定计数时钟频率是10K,即每过0.00001s,计数器自动加一。我这里设定的计数模式是增减模式,即计数器加到EPwm1Regs.TBPRD时再自动开始减小,当减到0时,又开始增加。9 b1 j8 b% O$ U; N2 ^% G% Z# x9 a! \
第三个是比较器COMPA,COMPA是我们自己设定的比较值,当这里设定的初始值1900,当计数器计数到1900的时候会产生事件,比如讲输出引脚置为1或者清为0。9 d3 v; \# c" K  c
这里采用了影子(映射)寄存器(EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;),映射提供了一个保持寄存器与硬件同步更新的方法,当使用映射模式时,只能在特定的事件处更新当前工作的寄存器,这就防止了由于软件异步修改寄存器内容而引发的错误。
& d+ N- b- J( I, N计算器不断的累加,当计数器的值等于比较值时,就输出为1,当计数器的值等于周期值时,就输出为0.从图中也很容易看出方波的周期和占空比。" F0 |, N  z( `' k; }/ F
) D' @4 u0 u5 J4 }; e9 z) K# M

. i7 E- n# `  l+ V

该用户从未签到

2#
发表于 2021-9-22 15:52 | 只看该作者
首先进行的是PWM1引脚的初始化,因为PWM1的引脚为GPIO0和GPIO1,这两个引脚可以是普通的IO口,也可以复用输出PWM
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-24 03:00 , Processed in 0.156250 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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