嵌入式开发者社区

标题: 请问一下怎么产生PWM波 [打印本页]

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
7 B8 ?# l8 H* Y1 t0 s
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/$ M" P1 W! @' q; [$ B; ~
/*                                                                          */
- d8 A8 T3 C$ X2 q( L/*              宏定义                                                      */
6 |3 _# z2 ]$ u" g/*                                                                          */7 t  z; M  z1 l6 e0 B5 J6 `
/****************************************************************************/
/ ]" x( Y7 f" I& r! j7 r3 [; H/ A$ L" H// 软件断点
! v+ R0 ~/ u/ M6 w4 d% a#define SW_BREAKPOINT     asm(" SWBP 0 ");
1 n' r1 B  F9 v5 {, _4 u5 O+ @$ ~$ G1 Z5 d0 J
// 时钟分频: ~; q; H9 b# v4 @! {9 u, ?
#define CLOCK_DIV_VAL     228
" W, y! @) K8 g$ T1 b8 o! V& I7 ^: y5 X
# M: l: Y/ f" \  ]( i/****************************************************************************/7 f; c# Q, N1 G0 s+ y; u
/*                                                                          */' N6 p2 [3 o3 e( U5 B- C/ n
/*              全局变量                                                    */3 f/ f/ ^" T9 Z7 R, ^% u
/*                                                                          */
- r, V* `$ a0 ~/****************************************************************************/
, N  Z( w( Q* |4 ]8 Y) ^ECAPCONTEXT ECAPResult;
" r- n# c/ D# Q, [, y0 C1 I+ h4 ]; }, M2 N6 F
/****************************************************************************/
$ P/ e# h$ p# C8 q$ m/*                                                                          */2 ~7 C* F; }# k  f$ r. r* T8 l
/*              函数声明                                                    */& L7 E" O8 V; m% J  r
/*                                                                          */
2 P9 H+ J" U6 k/ \7 q; L% k4 ]0 `8 N/****************************************************************************/
3 R5 O6 {2 g- Y: N! G$ y' a// 外设使能配置
. I) e- ]8 U! a' u& pvoid PSCInit(void);
; `. W6 h. G" j# X/ v/ c# u+ P+ V" _0 ?9 k, ~
// GPIO 管脚复用配置" z# p% L0 J" h9 o4 x
void GPIOBankPinMuxSet();
5 q! c$ J; v# Y: B1 t
0 Y# C7 v: M/ L# }0 J) I// 产生波形
$ Z4 b' C  c# pvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);$ L) `- e3 Q5 x% m& N8 L6 J
void ChopperWaveform(void);& J8 c# g/ q3 V- J& ]3 R* A
* r6 M% A1 w9 `  i! U
// ECAP初始化和读函数1 E& i; @) o4 T3 t. N4 |4 h3 p$ N
void ECAPInit(void);
# `  u3 z3 M9 w* G, p, punsigned int ECAPRead(void);
/ s- M$ F9 X1 m/ {; i; L0 s4 K) d9 l6 o& i% ?9 J& b, C
//ARM 中断初始化/ p0 O5 M8 ~& s# o: n9 z
void InterruptInit(void);4 s' a( P3 C* M, a* e& c- j

2 i1 W/ _4 k; X7 ~3 Z8 j// PWM 中断初始化
7 q  K8 z; ]/ O* [; f+ J  k' avoid PWMInterruptInit(void);
4 U% e# a8 f5 p  `+ P1 K& q// 中断服务函数% [, K% ]- C5 C1 X7 d
// PWM 事件
- W) b6 `( w/ H* N5 ovoid PWMEventIsr(void);
" T# n% w. [8 S# k" x// PWM 错误控制事件
* h5 P& \- D% e0 ~) ]void PWMTZIsr(void);
: e6 D3 {. Y# `. V0 h: B- r5 ^
* r; W8 T# d" M, c2 j& X  Y% y/****************************************************************************/
: z! |- U6 W! }/*                                                                          */
. C# v" Q2 C3 `1 Z/ l8 h/*              主函数                                                      */9 _2 ?8 T; c6 x. g
/*                                                                          */
( J2 v7 U& S& q+ z, G9 u6 _+ T/****************************************************************************/; Q: \  C, {! i- v9 F
int main(void)
# ~: u/ I6 X& U8 M! d{: P0 U. B$ f4 [6 J
        // 外设使能配置3 W: \5 B+ j) W& o+ {8 x, y
        PSCInit();$ c4 G" c  s3 o2 G

9 H' f7 s  m! t, t9 H) i% ^+ [        // 初始化串口终端 使用串口2
6 O/ @) `' i* B% D$ y# f9 S        UARTStdioInit();
- b/ S8 J1 o$ Y7 y( M2 }        % }- @. N* |! m1 o7 F4 r2 q; T
        // GPIO 管脚复用配置/ y, W% ?9 w. w! O3 |. ?. m8 j
        GPIOBankPinMuxSet();9 K  U# A- S3 }% c' B$ G+ _

7 u; V2 w6 J4 y  n6 i' i        // ARM 中断初始化2 c3 P+ J& h4 N: W6 H. C
        InterruptInit();
4 N7 ~/ `/ g# O3 {2 h, ~. _2 C$ e; A/ G
        // PWM 中断初始化# {0 J- N+ }) X/ m4 L
        PWMInterruptInit();9 z2 U- a9 _; J6 g. Z0 C
: B1 S; r  o+ b: R, \! w
        unsigned char i;
( M8 r6 d# [  W! W6 z# A        unsigned int j;
4 v: [6 |% k, [. [1 o3 H) V* G( ]9 @8 b9 u
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);6 `$ O8 s+ B: n4 x
        UARTPuts("------------------------------------------------------------\r\n", -1);2 D  b1 i8 ~+ E
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);7 Z$ Z; V% m+ C: C7 ~& j
        // 产生波形6 s, U# G( }% N& ]# u! ^' E1 X
        PWM1ABasic(25000,50);
3 l+ G9 S+ G: i/ P& O/ \. ]& R) |/ U, s( R
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);; o8 l) t" O( l
        UARTPuts("------------------------------------------------------------\r\n", -1);9 f4 @' u" `) p
) O8 Z/ B7 z! ~/ |3 z, r# ^$ w, C

9 J9 `& S' Z2 a3 G! C) N, G2 `, Z3 t7 ^
        UARTPuts("------------------------------------------------------------\r\n", -1);
% ]! s$ \7 F5 P  F' h2 S        UARTPuts("                    C6748 ECAP Test\r\n", -1);/ W) |& B. C# t
        // ECAP 捕获初始化! w; P; L0 h$ s. [& u
        ECAPInit();
: J/ M& T) O9 \' w: m        UARTPuts("Initialize ECAP.......\r\n",-1);
+ O" Z% q# I3 O1 {: j        for(i=0;i<5;i++)
( V- `0 X" Z2 l1 [. v8 D& T' w        {) t# n6 U7 k2 c# w# M
                    for(j=0x00FFFFFF;j>0;j--);            // 延时
0 v  F: v2 b! l9 r3 B1 G                    ECAPRead();
) y: q: Y4 X0 b7 S, y        }
  `0 A: }" p) [        UARTPuts("\r\n",-1);
1 K5 Y$ ^3 F( |0 ]) K        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);: o) j8 b- t' J# p9 o
        UARTPuts("------------------------------------------------------------\r\n", -1);
- D# }- o5 t/ G
/ F0 x4 l) a+ D' E0 s1 L6 j1 G1 ?        // 主循环) p8 x# `& r4 _8 P4 z
        for(;;)- N+ b& {8 d# w: a4 e
        {
2 j& `1 s6 |. [/ }
/ G% p# {' W7 `* u2 R$ `6 v% ]! w        }4 f6 @% C$ x3 w+ \
}
# v4 M$ G/ L5 D% }* e+ u/ h- [3 u9 G  l: a1 {7 |
/****************************************************************************/0 |4 q8 f: Z6 K- E
/*                                                                          */
$ y$ D7 q  f" \  ^& ~; B* D+ H/*              PSC 初始化                                                  */
6 y5 s$ ^  W! ?9 c/*                                                                          */4 t4 O8 z' B+ {, g8 b
/****************************************************************************/
- W, q+ ]2 \$ c) f  }" O) H; avoid PSCInit(void)+ e- E+ B3 R4 c/ l2 U- I2 b
{
: q1 j* f( u( B, J; V# z        // 使能  EHRPWM 和 ECAP 模块
+ U' j' e/ k8 \& R        // 对相应外设模块的使能也可以在 BootLoader 中完成* U! u* t% v& h4 {% x' n, R
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
7 N7 A6 v- i% K7 \6 O( j    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
& G- Z3 s7 n7 @5 O" l}' G: ^9 X( p4 Q7 O
  W- {6 S; n  \! J1 F6 N: o9 L, e9 I
/****************************************************************************/2 g2 ^. _  W2 y* o
/*                                                                          */
) F* n9 w0 u0 f/*              GPIO 管脚复用配置                                           */
/ R# [& n# x9 D  N* I3 f$ B" j/*                                                                          */
, B0 Y6 _+ Q8 @- R: Z8 Z7 n/****************************************************************************/
( ~8 d9 T/ G9 z/ c: bvoid GPIOBankPinMuxSet(void)
3 E  f& i' X+ ]; o{$ e+ T" x9 q3 w/ }- ~
        EHRPWM1PinMuxSetup();
$ n6 O: Y, e# J, p) Y. g1 D/ i7 {  a
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP); z( A; p: Z( p3 |
        // 作为捕获功能时管脚方向为输入& I- a% Y/ J# g3 H$ K
        // 作为辅助脉宽调制时管脚方向为输出
  y7 `, _+ I/ O, b% X: G5 }    // ECAP2 / APWM2( L  h% |$ X2 P5 Q/ B
        ECAPPinMuxSetup(2);- n  T& W* L! q- l. n! m
1 |1 o" ~3 x, r3 U. B
        // ECAP2 / APWM2方向设置为输入# \4 _% h+ J% ]0 h1 n7 s
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]. R% R- p* k- z% @( J  D6 G
}
- k  J5 ~1 y) z4 b
  u, @9 P* m& |/****************************************************************************/* F! @# K7 {2 P
/*                                                                          */
! G( l1 e  M. ~8 H% \- }" e/*              PWM 输出波形                                                */3 {0 j5 Y1 i5 W4 D  z7 b6 ^
/*                                                                          */
" b* s! R* o/ z" b5 z' ^: j/****************************************************************************/
2 x( O' x6 e. u" W/ K4 I7 _void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
, Q0 K/ a$ ^0 I' [$ Z. b9 ~3 a* R{
/ j6 _, _; J& ?/ ~8 {    // 时间基准配置( i' t; F' d: T5 d7 X4 k
    // 时钟配置1 s3 J9 f4 D, |' m) g& b1 r
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);) Y* n5 c, v+ F' g/ c& S( [
* g1 {. k0 t7 j0 G* F6 k- y
    // 配置周期$ Y1 z; A) }& R: s
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
- E% ]* l2 C9 ]5 r                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);) {! R) l) m, C! F( ^2 p' F
% S+ A$ U- ^1 K7 t. \+ R' Q
    // 禁用输入同步信号
( l; g$ Q: p, N, _- l  Z% |2 v    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);# p) @7 w* M/ H' q- I7 h
. J) B( N" D1 A+ {
    // 禁用输出同步信号
# Y6 E; z+ J, R; }& H9 B! \- c9 T    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);' ~* e0 u6 T* a7 R
  ?/ h, s- c0 A5 t- Q9 r6 l# p
    // 仿真(DEBUG)模式行为配置
; H) c- R$ P, T/ j. D) `' w$ D6 m# [    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);# W! {* |) \3 a6 ~* }& W4 @

5 ?0 M4 v9 V" f5 r    // 配置计数比较器子模块
/ B/ t/ s" z! h0 L+ M$ ?% ^4 `1 l    // 加载比较器 A 值
' K- f9 K5 \3 t0 W1 B  J    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE," v- P( _! S- z
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);% R4 b# [+ h9 u( S+ `2 p

8 A! S+ W+ `9 F3 G    // 加载比较器 B 值9 h; {+ x# N! H% c1 B- c) X
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,8 N# ]3 c( c1 C( y, M& v$ q
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
) B7 g$ \) u1 v! u  Q5 H
6 i5 `5 j" o! [6 X    // 功能限定配置(输出引脚触发方式设定)& t9 S4 `0 i9 k( e* ?% R
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出6 `. I/ ~' ~; ?6 |' j( |
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
/ n+ e9 R! E% b' g/ s                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,# K+ i# B6 {# m
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
3 }0 x! S% |8 m$ o
* }3 B4 k, Y/ T# \    // 禁用(旁路,信号直接输出到斩波子模块)死区模块0 x" K1 H1 n2 z' }0 w
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);+ G, ]6 h. j% T0 z

7 k2 r( c! _2 [6 A0 K    // 禁用斩波子模块
% j2 r: @& h/ ~% J    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
: R. f% Z+ V4 m6 u8 L  ]6 }8 D( d) v" X
    // 禁用错误控制事件2 {1 n" C( T/ V3 |+ Z- W
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
5 x1 n! p7 C, g& R# \6 ~, i    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);6 f' D: d/ ?% P" k5 U
/ P/ u: u) H& D* [- L
    // 事件触发配置& W, D& R8 u5 `# ]. `, D% T$ O* c- W
    // 每三次事件发生产生中断0 {; m" ~0 G% w& R9 s
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);( c7 @& j) R( ~6 x6 c
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
. a2 s4 ~4 p" E+ t  o    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
$ X( Q1 y" g* i7 a# L8 [4 W    // 使能中断' {8 u: e# m, J+ P' ?( S
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);3 A3 d+ \  {9 c0 D5 D' C
0 `% m& l- }) p. e' j
    // 禁用高精度子模块1 b: E6 A3 u; ?) |1 A
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
  _/ J/ S! d! Y, n7 }6 k) b7 H; I8 @; _. B
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
  p- _6 l$ n' x) [& g}
# {  ~9 N# X- V% M
# I% U, i" \8 r. K) v/ [& z1 x- Rvoid ChopperWaveform(void)9 \" T8 H2 y! n0 V; ^
{/ |4 y# q2 x4 {' ~) c
    // 50% 占空比
- e, ^8 l4 r9 ^6 @& l3 R    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
& O. B6 a  u6 J$ Q2 C9 @    // 4 分频
+ d& U/ {  D, |& q% C9 S    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);7 q7 w% I5 |6 e! D: K0 o* o
    // 单个脉冲宽度
  n& f# j& I' u4 g" @, B7 w1 R: S    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
  c+ j8 P. b2 g    // 使能斩波子模块
4 G+ D' L. ~$ W3 Z* `    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);# ]9 q: v2 f5 W6 ]
}
- o+ z- ~  [: |- A9 N- S; s: c) \6 }8 h; l5 i+ D
/****************************************************************************/& K' {1 U" ~# k+ c3 V. q/ O
/*                                                                          */, h4 S0 e" |: {+ T1 E
/*              PWM 中断初始化                                              */
0 t  l4 x. R1 u5 w* S. W/*                                                                          */$ b: r% X" p9 S  p7 Q& a8 m' {% H
/****************************************************************************/
: [$ j2 f2 M1 V* h+ j5 P4 o0 t( jvoid PWMInterruptInit(void)1 C& ]2 ^* s+ T" {; |  B( `) l
{
9 A* A, ]8 V# d) a/ \3 L        // 注册中断服务函数
6 P( D$ S9 G9 {' w4 X        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);0 U0 F4 {, @' W8 w& x* k
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
7 N$ }6 ]/ I) T+ C+ }7 p
. l9 `) n5 L+ t2 [  i        // 映射中断
- H, H5 u: t" \: d# e8 j0 o        IntChannelSet(SYS_INT_EHRPWM1, 2);
; C1 \5 T) z9 c  j: b        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);9 n7 c6 f7 G( C* s. }% c

8 s/ n+ ]0 k) d5 o. X        // 使能中断
2 C2 f# c3 s8 [8 r8 u/ S        IntSystemEnable(SYS_INT_EHRPWM1);
! n" m9 O7 I1 K% K        IntSystemEnable(SYS_INT_EHRPWM1TZ);+ Q$ g! u, `9 Z
}
2 U$ y4 E; b( D* Y, ~! A1 k- i4 a. d! K% K0 \
/****************************************************************************/( ^/ X  S1 Q+ U7 o, {( s% Y
/*                                                                          */
: v4 F& S  D, ^+ l7 o, e/*              ARM 中断初始化                                              */
* P* V9 r; p# Q7 K, r/*                                                                          */- g  j& }/ I; m
/****************************************************************************/0 x( f* e5 e$ G3 M2 c( L) Q3 G4 r) E4 h
void InterruptInit(void)8 T$ E6 |. s: h- d- z
{' x% H5 K! l4 t# ~" P
        // 初始化 ARM 中断控制器. z9 W# D2 v# \, ]& Q, r
        IntAINTCInit();' |8 I: K/ T3 T/ {9 j
2 @% Z5 I! y6 m9 R2 o0 T+ Z
        // 使能 IRQ(CPSR)1 ~  u7 ]3 m2 D$ r6 m
        IntMasterIRQEnable();
) E6 h8 e7 z5 p9 a' g; @
' _' ?5 u" W; ?- b5 V5 \6 d        // 使能中断(AINTC GER)
. s$ X6 `1 y% i; y) ]2 H8 a        IntGlobalEnable();
' g1 y* ]  E( N: G6 V( Z
* j0 I; f7 n, S  T8 n# u        // 使能中断(AINTC HIER)- ^# [9 ?% ?6 k
        IntIRQEnable();
2 {' l2 X7 ~6 X* o9 |  Z}
% o2 P5 N9 t" e7 e+ x2 G7 C: d, V% W9 y  s! ?8 f) \

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/+ q7 a3 a& H# t* y
/*                                                                          */
5 B2 E. Z* g; v8 y  A! ^/*              中断服务函数                                                */( p  c4 S+ t5 k- i+ h2 R  |
/*                                                                          */
' h1 T7 c, v5 \2 I# {# y. R/****************************************************************************/: K) E0 L8 J- B0 t8 C; C1 _
void PWMEventIsr(void)
7 b$ M, w4 i) d8 [/ i{
$ a* z  J1 n2 n$ W7 V        IntSystemStatusClear(SYS_INT_EHRPWM1);- p# h2 g1 _. l/ k2 u8 W

: M9 s" Q; L. H  p$ {; F    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
& W4 c2 C0 e/ p2 Q* P& k}
9 W/ l& {4 Y; V2 _5 o* A  \1 u$ w$ h* l) B1 h) f1 X  ^
void PWMTZIsr(void)1 S0 X6 W. s0 M5 V% F8 d; _- p
{7 K- ~7 H+ Q( Q- f7 L6 S# U
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
, P6 j; ]" w; V2 k
6 y* S. F- f/ @, t; T    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);4 M0 c* ^% d% e3 h( J
}) M$ R* j. W. s0 v+ B
7 @. a) P: X5 x5 G0 @2 V
/****************************************************************************/
( U5 d3 |) ^3 _7 [+ X/*                                                                          */$ H0 }. p* v$ k8 e
/*              初始化捕获模块                                              */
: o, D% R* Q& W- X8 C5 u/*                                                                          */
3 {* A* L' u  P. A6 w& u5 D9 t4 \/****************************************************************************/
, z9 Q1 q6 ?9 yvoid ECAPInit(void)
& n# G4 _4 z' k+ k3 p{
) c' `; q2 }5 S9 y        /*-----设置 ECCTL1-----*/* X3 _* k. s2 Y& `! Q8 e; Z1 X
        // 使能CAP寄存器装载6 r9 z/ s9 Z  `# S/ K+ F, j
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
" u6 t0 k+ u+ g# t. ^( }        // 设置预分频值.
1 r. V2 U8 E  m6 ~1 p! }        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
3 b5 i# U1 q- J, u) l2 j        // 上升沿触发捕获事件( ?8 n* S1 c% n8 ^2 F9 _
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);5 ^$ \$ ]% Q9 T; T5 A% A
        // 输入捕获后重新装载计数器值.! h- B' `5 t4 m
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);. z) L" H, y$ n" F
8 W- k$ b) R' _* z- H1 w
        /*-----设置 ECCTL2-----*/7 f$ i* p( [, X( d. v  o
        // 连续模式
" U- t! ?% W9 S/ p! G! ~        ECAPContinousModeConfig(SOC_ECAP_2_REGS);8 c  S7 P. q7 C9 Q2 n' P4 p
        // ECAP计数器TSCTR持续计数' ]7 m) ^3 o6 ^! \
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
5 v" z& o* x/ ?) N1 i4 h; Z        // 禁用同步输出和同步输入
/ [. v  H. k  o        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);) Z8 n2 x; V& a) o1 M1 x; n
        // 配置 ECAP 2 为 CAPTURE 模式: T: ?9 G9 `0 u8 u2 y, e' ^/ ~
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
0 F2 A' C8 b: h0 B( E2 \  A* W. h3 h& N* e5 y
        // 使能中断' R2 t5 l  w: p3 |0 p' w# L4 `* V8 s
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
+ M: G2 t" z8 i* V8 t. J}
5 `: c% b. b) ^- m* k* q) |$ a0 I: [" U/ n+ z: k4 v9 {
/****************************************************************************/
. O6 E5 w& g, e& q* s- s/*                                                                          */
5 M3 G, x, J* U# N. j: J$ i/*              取得捕获结果                                                */
- R) |8 `+ N  W. I/*                                                                          */
7 [* R0 G# @; c$ ?' [! h/****************************************************************************/, J5 `* W9 m1 r! a$ a
unsigned int ECAPRead(void)7 C6 v0 P' a$ q
{& s* G& C: i! y1 N! d" _
        unsigned int capvalue;+ s; x' D: ~# g( G: _
        unsigned long frequency;
8 n/ G1 p8 A. ?# ?1 y( h$ s( s. P9 U. W1 N/ D
        // Event1 中断标志  C& g' ?. t6 H, p
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))" c1 n# O0 ]6 M: ]
        {
& Q$ p) u  b1 v6 d& }                // 取得捕获计数
$ ^9 |8 _$ J' N# P) g: y" y                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
  o$ q" l/ e* _# u( I) o8 z5 D                capvalue = ECAPResult.cap1;) D3 x/ M% U: l; w2 r. K6 m0 d8 O
0 K2 E3 \  ^  Z; k6 O
                // CAPTRUE 模块 228M 时钟主频
$ v' G2 O% l  b6 ~. o                frequency  =  228000000/capvalue;  d# M5 [' h, `# |) l. K1 S  p
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
( V% N) f1 t/ q$ {3 L* O
9 |* x& n# n) Q                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
% v5 f# [+ ~# m+ p0 z! y//                IntEventClear(SYS_INT_ECAP2);
$ R6 P3 |/ p. ~/ x        }- N& P$ B7 H. }+ s( v
        return frequency;
% U+ H2 x2 T- @; P2 w3 W}
: V; h6 V  v" ~# @: d% Z8 z& R, z
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
3 F  ]+ ~) D) J  i) l[attach]4202[/attach]
作者: 浙江第一帅    时间: 2018-11-1 21:27
可以给我发一份吗
作者: 广州创龙莫工    时间: 2018-11-2 08:51
如需获取相关资料,请发送您的客户信息到我们的技术支持邮箱:support@tronlong.com,我们会给您提供相关的网盘链接。




欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4