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

DSP28335-ePWM

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
#include "DSP28x_Project.h") C( y, k, ?, i- q
// Configure the period for each timer
  S( z/ |' Y4 h8 R' U#define EPWM1_TIMER_TBPRD  3750  // Period register 系统始终为150MHZ,下面的程序进行了4分频,即为37.5MHZ,这样得到的是10KHZ
8 V* y: k+ Q7 r#define EPWM1_START_CMPA     1900//设置PWM通道A初始占空比! }( V% L9 i' K" p. e' A
#define EPWM1_START_CMPB     1900//设置PWM通道B初始占空比' B$ ^& Q9 [, v. ?. N% t
void ChangeDuty(Uint16 Duty)//改变占空比函数
& B) G. F: O% N$ w  }  s{
; O& J2 y. W0 e6 k- F, m3 ^, h    if(Duty > EPWM1_TIMER_TBPRD) Duty = EPWM1_TIMER_TBPRD;
+ M& X/ g! m, Z( E+ x! Q    if(Duty < 0) Duty = 0;
9 P! B+ q# n+ k& I    EPwm1Regs.CMPA.half.CMPA = Duty;     // Set compare A value- b9 e: r1 V6 ~
    EPwm1Regs.CMPB = Duty;               // Set Compare B value
7 G: e$ @& I: k* l/ _1 g- Y}; J9 E  n7 G% f! w7 g7 O6 R
void PWM1_Init()//初始化PWM- p8 ]6 j0 E" Z$ g$ U: ]0 h- e
{) N& ?8 M' N5 F/ H: O: E
/*首先进行的是PWM1引脚的初始化,因为PWM1的引脚为GPIO0和GPIO1,这两个引脚可以是普通的IO口,也可以复用输出PWM,这里选用复用功能*/5 L5 \" a9 n# M, i. l) e! U7 N
    EALLOW;: u6 A8 q$ P2 Z( n, P+ J
    GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0;    // Enable pull-up on GPIO0 (EPWM1A)- V% d/ b5 G' ^4 y/ N9 A
    GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0;    // Enable pull-up on GPIO1 (EPWM1B)
/ [% j8 o( M/ P1 }' R) _: R    GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;   // Configure GPIO0 as EPWM1A复用功能设置,为0代表是普通IO口
  i, y: `' [# |& k1 D# Q    GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1;   // Configure GPIO1 as EPWM1B/ s$ E- l  l: U7 G
    EDIS;/ }) Y. h: r* v/ ~0 A
    EALLOW;. Y3 |7 N' f- V$ `
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;      // Stop all the TB clocks" v0 |8 ]) r. Q0 @
    EDIS;5 _( ~3 [  t1 m& n) Q
    // Setup TBCLK
: X0 ~1 T3 T3 u' [1 Y( ~    EPwm1Regs.TBPRD = EPWM1_TIMER_TBPRD - 1;           // 设置周期4 W' T/ k+ \. _& ^, H8 ?) D
    EPwm1Regs.TBPHS.half.TBPHS = 0x0000;           // 这个代表的是相位,不明白什么东西
$ t; g7 [9 U" ]' e% z: u    EPwm1Regs.TBCTR = 0x0000;                      // Clear counter& }, K$ \; U5 O# r
    // Set Compare values
' ^2 D2 m5 B; M% S    EPwm1Regs.CMPA.half.CMPA = EPWM1_START_CMPA;     // Set compare A value4 S) V; ?" A2 m
    EPwm1Regs.CMPB = EPWM1_START_CMPB;               // Set Compare B value% Q% n% d3 a8 G
    // Setup counter mode2 W& w3 s# ]  N+ E8 D2 w5 b
    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; //计数模式3 w. N/ O- X+ y5 L7 y# w
    EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;        // Disable phase loading6 L1 l( A$ F% u( G+ p3 Z
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV2;       // 这里是进行2分频) m9 A% H- \7 w8 u
    EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV2;          //这里也是2分频
% C3 Q0 M4 X. B* M+ q    // Setup shadowing
4 J$ N# n6 G4 F- u" G# D+ i    EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;   //采用影子寄存器跟新. V. a4 M: P: n8 U8 r
    EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;0 D2 ^1 E" H/ N/ G) R8 n
    EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;  // Load on Zero% o7 t) E  c( J* M
    EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;% u) D6 C, h, \7 h7 c8 S
    // Set actions
2 K' {4 h( W* i/ g  \2 u9 \    EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;          // Set PWM1A on event A, up count' e( [. S& |. v1 I2 F& y
    EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;           // Clear PWM1A on event A, down count
' V2 _# Z8 M6 a* J* n4 _; I% a) |& w    EPwm1Regs.AQCTLB.bit.CBU = AQ_SET;             // Set PWM1B on event B, up count
* `8 c2 _* Q: Z$ f( ^; r4 F    EPwm1Regs.AQCTLB.bit.CBD = AQ_CLEAR;           // Clear PWM1B on event B, down count8 l' @6 D" Q, _7 l% X; K4 B
    EALLOW;
/ m9 k. ]9 T5 Y2 ]) X& y; k8 t    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;         // Start all the timers synced/ \* a+ w6 n4 N, W# z, R: t7 I
    EDIS;
! K+ j% `# l1 d9 X% \}
+ s. [( y7 ~4 ?" a1 V# H4 Uvoid All_Init()5 H6 H# U0 P# ]4 o) q* A4 \5 p
{1 U6 }+ h2 I- [2 v3 Q' T
    InitSysCtrl();& E6 ?9 R; V% E3 y! S) G9 V  ?
    DINT;1 N8 L- W! n6 ^% \' }
    InitPieCtrl();( ~( L; U9 O2 r; e
    IER = 0x0000;
: r& |7 S& l& F0 X% q9 s    IFR = 0x0000;
$ s& a' D' P+ }( x/ `  s& d8 n    InitPieVectTable();6 m9 c9 u: _' C3 m4 O/ x% ]
    PWM1_Init();7 `" V0 n" Q. O2 y. p* K
    EINT;   // Enable Global interrupt INTM, d/ T/ a* q" u# {8 r( {  l. N
    ERTM;   // Enable Global realtime interrupt DBGM9 @) v; R( M: I* T
}
4 j6 `" J' {' {* m  e% c/ N+ sUint16 Duty = 1900;
  d. f7 k) b/ d1 l) i( h! Hvoid main(void)& P# _7 }$ U( G5 F
{
$ J8 m2 B! f! P: Q5 j" v: }) s    All_Init();
# p( s; U: P+ t8 ^2 V    while(1)) l! E5 W% W* K3 A3 c* Y' |
    {1 d& ~  m  d+ S& Y! u  Z
        ChangeDuty(Duty);# u4 d  r* ]. x. ~
    }: U2 y" C: \+ a0 f* \/ D8 w# [
}+ R, S& Q; l7 V0 E5 J8 b) o
, W; }6 R8 m- r  z
产生PWM主要需要三个部件,
; ~' B# i4 a- c- J+ z6 A0 O第一个是周期PRD,通过设定EPwm1Regs.TBPRD的值,来得到周期,我的代码中设定的是3750,系统时钟是150 M hz,经过四分频得到的是37.5Mhz,即1/(37.5M)秒,计数器每个时间间隔加一,加到3750需要的时间是3750 * 1 / (37.5M) = (1 / 10K)秒,即为计数周期,可知频率为10K。
  e  o# k/ q" F# x! m6 K# w0 [  i第二个是计数器CTR,计数器根据设定的时钟频率不断累加,我设定计数时钟频率是10K,即每过0.00001s,计数器自动加一。我这里设定的计数模式是增减模式,即计数器加到EPwm1Regs.TBPRD时再自动开始减小,当减到0时,又开始增加。
% n( y0 J* L9 I, s& k/ S第三个是比较器COMPA,COMPA是我们自己设定的比较值,当这里设定的初始值1900,当计数器计数到1900的时候会产生事件,比如讲输出引脚置为1或者清为0。
- `4 S7 X3 [1 q; W这里采用了影子(映射)寄存器(EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;),映射提供了一个保持寄存器与硬件同步更新的方法,当使用映射模式时,只能在特定的事件处更新当前工作的寄存器,这就防止了由于软件异步修改寄存器内容而引发的错误。* @5 [) n8 F; p8 X& W/ Y2 N
计算器不断的累加,当计数器的值等于比较值时,就输出为1,当计数器的值等于周期值时,就输出为0.从图中也很容易看出方波的周期和占空比。2 I, d( E0 G7 K  w$ l
. b0 t# G2 P* ]6 M' X; b

; l! R# y, x' t+ D

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-24 01:25 , Processed in 0.140625 second(s), 22 queries , Gzip On.

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

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

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