嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
! U8 g! v$ W, f2 I
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
5 `1 {9 L, I. V# Z! [/*                                                                          */6 P6 g8 R, I8 a; k
/*              宏定义                                                      */. }  r6 W- ~2 x$ \+ }! ~1 F
/*                                                                          */
9 D  o9 D, e  ~/****************************************************************************/, l$ u( X6 ~7 D5 |$ q
// 软件断点
/ }! p& n" L  D9 m, L9 r#define SW_BREAKPOINT     asm(" SWBP 0 ");
/ a: n; `. R! D7 b0 ?, H) P, x' L; c5 N4 W) f
// 时钟分频
  v* E8 V' b) b! ]$ n/ [1 D. P# }#define CLOCK_DIV_VAL     228+ p' y' z" O; _. K1 [6 ?
# q; Q( o& u- n# W
/****************************************************************************/8 D* ^) V0 B; u' E( p3 C* C7 }
/*                                                                          */
* M* O) _6 c  g/*              全局变量                                                    */
/ I; A, R7 F! ~" S/*                                                                          */0 w% N6 z5 [4 X  I
/****************************************************************************/
" c5 ^* {' C! ]2 Q! }, {4 ]ECAPCONTEXT ECAPResult;
7 }, V" {8 M4 }$ K- I0 r5 {. W9 O
  k" Q  l  r- K& F8 K: X* e- C/****************************************************************************/
, v+ U0 Q5 v3 G; A( b$ {+ y/*                                                                          */
! G1 T' }, M+ ~" Z/*              函数声明                                                    */
: X/ i  J% `+ O( h1 X/*                                                                          */  Z& M4 K% z" q3 W
/****************************************************************************/
  M+ \1 g  ?5 J// 外设使能配置
  k6 P$ h+ Z# \$ `; W: Qvoid PSCInit(void);
( F/ A- m: y+ a' b& v8 `" }, f$ q3 p& e+ W4 z" x
// GPIO 管脚复用配置  N4 t1 o* N' E
void GPIOBankPinMuxSet();5 _* J9 x$ j% L' c
5 `( w# m0 L% i
// 产生波形8 z8 K$ k1 L) d0 @2 z
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
0 u. Y  Q2 i8 Xvoid ChopperWaveform(void);
+ ?# @+ h& X7 ?; Y$ P$ S# Q. x& a, o7 c' L1 Z
// ECAP初始化和读函数
( ?6 G# N' v# x0 m( V6 b% nvoid ECAPInit(void);0 T# U3 F8 b$ c. S, R) i
unsigned int ECAPRead(void);
3 j/ b6 o2 \  A% q: G( R
5 f5 b2 k; W( u# d//ARM 中断初始化
  f$ O2 ^& U8 Hvoid InterruptInit(void);$ ~' ?( S( P3 ]0 X2 h. B$ H& m$ L
" ~* x5 z, F4 R" [
// PWM 中断初始化3 U( ~) M" ~8 |% k
void PWMInterruptInit(void);; A! \1 a+ U9 h# R
// 中断服务函数4 N6 Q% D' ^# F- q3 e: z* a: J
// PWM 事件# d5 q: Z! N* s1 A4 s8 T2 }
void PWMEventIsr(void);# R! c$ q6 _! ^8 B8 P; h. a  ^) K
// PWM 错误控制事件
& M+ j( ?5 g3 P4 U! e: @8 }void PWMTZIsr(void);
& ~0 L' P. p% X9 u7 P' @
( h2 E6 @. S  ?0 R' M8 Z8 d4 D/****************************************************************************/
/ B& V: b$ R! d* T& r/*                                                                          */
  u  H& w3 w3 @8 T" \' Y/*              主函数                                                      */1 {2 V; i6 q9 D6 z3 B( l
/*                                                                          */
3 S2 C2 B3 }9 L* M2 T8 C, V4 i* k/****************************************************************************/
) g$ Q: ]. h- ?- U5 x4 P3 pint main(void)
; v% L1 G9 L+ b{) D  f$ E# A9 ]9 ~- u7 ^/ Z% R5 _
        // 外设使能配置$ B9 _" {7 A/ h2 t; o
        PSCInit();6 B5 u( X# M& g* K5 g
. X+ h% M% Z$ g7 J2 R
        // 初始化串口终端 使用串口28 j8 p1 t4 o5 L0 d6 ]
        UARTStdioInit();! w: s6 F4 a* i! h; |
        2 ^) Y1 J( w1 y7 Z% f$ a; \2 {
        // GPIO 管脚复用配置
. u0 `6 K* ]& q; W5 {; @/ K        GPIOBankPinMuxSet();3 C2 {, R. C7 B6 f* _% ?2 C
$ r3 r! _4 B& o( n6 m2 \$ X7 y
        // ARM 中断初始化
! \0 q0 [# Z- Q1 Y: R        InterruptInit();6 i2 |% V& i; S& T% R
: |2 D+ l( |0 j6 w+ `/ w
        // PWM 中断初始化
  s, U0 d3 |6 g        PWMInterruptInit();% `/ {  m0 e1 r# Z% ?
, V- I5 Z* j8 C6 t' ~
        unsigned char i;3 }5 G6 C0 q. F  ?$ M
        unsigned int j;: R# m/ g0 }6 O' c9 q$ Y3 G5 `

2 ?# w9 o; ~5 ], l- b( \        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);7 C, f9 ]2 R6 A+ _' M6 e9 ^8 R
        UARTPuts("------------------------------------------------------------\r\n", -1);
& B2 H. N' j3 x2 M: a& x; M! h, S9 {        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);6 U* }' D$ V- n2 x" j
        // 产生波形
9 i- Y, x; a2 G/ @5 {% Q& d        PWM1ABasic(25000,50);
8 L! z# T: n& u4 s; d* b, V' \
+ l4 l: K0 m( J( i        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
2 u4 X6 e+ a# f! g! R& b2 n4 i        UARTPuts("------------------------------------------------------------\r\n", -1);: O! _5 i$ \& C1 Y4 z1 @

  A0 \, A+ k$ m' F& G" t( u# u$ A6 f; K/ ~8 j; q8 `' T
4 R; V7 A) K2 _
        UARTPuts("------------------------------------------------------------\r\n", -1);) Y! k: A2 O" @+ }0 N
        UARTPuts("                    C6748 ECAP Test\r\n", -1);
6 T, }  v; w0 `8 e$ g/ ~        // ECAP 捕获初始化0 b: R" H! y- u- @
        ECAPInit();# j3 C: c& y# G* f8 T
        UARTPuts("Initialize ECAP.......\r\n",-1);4 J( ^- |# n6 Q3 B, p  x; n
        for(i=0;i<5;i++)/ j# V% n: }% @
        {$ C) Z7 |  f  T- A. W
                    for(j=0x00FFFFFF;j>0;j--);            // 延时3 c  R8 k5 q3 B2 n  p; g
                    ECAPRead();" t2 ^5 V9 |! Y
        }" H, s7 W3 ]& A& E# S
        UARTPuts("\r\n",-1);! h. W2 [+ H, Y3 V
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
# ~3 m  |4 `- r1 \$ P: T. Z        UARTPuts("------------------------------------------------------------\r\n", -1);
4 `4 l, M5 ]9 h: N+ s% z: |8 m/ v0 x' ?; M
        // 主循环
1 j% q- H- O3 X: |% y$ o        for(;;): n: R+ j, \% D: a  ?
        {
- w1 K0 _, z: t4 R
% j9 J5 e; V) @- d; P1 a        }
) s# U: j4 q2 `+ }" o2 O}
: g, c% ^: Z0 e' a8 w" b+ Q4 @& B4 T+ K4 k, m
/****************************************************************************/' n0 e4 H" H" O$ k% O1 Z
/*                                                                          */) L% i/ y2 `) s3 H& q' J
/*              PSC 初始化                                                  */& u6 }9 b( x) a7 E+ y3 S  F. y
/*                                                                          */
$ l& D6 M- C4 D) |. l/****************************************************************************/
# y5 ?3 W* y' H7 _1 t$ evoid PSCInit(void)8 C4 t+ m( S9 u
{. A, O) C$ `5 @7 E# A* _4 V2 X+ p- A0 E
        // 使能  EHRPWM 和 ECAP 模块/ ?- e( Q! v, p, m1 c
        // 对相应外设模块的使能也可以在 BootLoader 中完成! Y  \4 _1 z7 b3 v+ I& i
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
2 u. T: h: P7 y& ^0 R: y    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);7 Q* m2 j0 q9 |# z3 `
}
1 ]6 L$ a; e5 A' i4 v! A' `2 j. o
, B7 n! N; \$ u1 e( z* U; O/****************************************************************************/
3 W6 R: R; {1 c6 I2 w+ F* {" N! h/*                                                                          */8 _5 G8 @" q2 k* K& A# ?
/*              GPIO 管脚复用配置                                           */
! f. z% L6 a7 N% w/*                                                                          */
5 U. N, b' h0 R) \2 v! m: e/****************************************************************************/
) `& m; T0 |" ^1 R" ?& Gvoid GPIOBankPinMuxSet(void)
2 ]+ l, z3 H4 g( p{
  k+ ?0 H* A* v- p4 [        EHRPWM1PinMuxSetup();
* @/ M; L: T# K+ \! e1 U8 i+ g% }& U* ]
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
2 \7 A' D( S( U: ]' U        // 作为捕获功能时管脚方向为输入2 i. N6 u: j/ m
        // 作为辅助脉宽调制时管脚方向为输出
( z! `- }3 N, O    // ECAP2 / APWM2
; W7 [5 q/ d7 y3 N! o; F4 x1 f        ECAPPinMuxSetup(2);! A( y+ b1 P, V" l4 L
! @0 \, w* ]7 R; G8 t# W2 v) \
        // ECAP2 / APWM2方向设置为输入* b8 H5 a* L3 S! I( Q4 u/ O
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]3 J9 n6 V$ B% d2 E- K- F" R1 s+ h
}
5 M& I& ?6 c3 y8 J" F) r" B+ L% G, Y9 A+ C! o8 ~- Y8 G
/****************************************************************************/
. b# A1 {0 b! m8 F1 H- `$ X/*                                                                          */
8 R; ?2 V! J7 z! w6 Z/*              PWM 输出波形                                                */1 S# i6 {& {0 l
/*                                                                          */
$ I1 t# o7 N4 h9 R* d+ e: \/****************************************************************************/
5 N& ]( s0 |. h9 s, Y) B! Nvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
5 C7 G& _% O5 C{- U: }" h% ~4 S) `, A" B3 R$ O
    // 时间基准配置5 b8 C, c2 }/ h4 J
    // 时钟配置- u7 ?. `! z4 M7 O. c+ K
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
. \! T0 u5 d0 k8 `% X) M  \4 A+ |1 L
    // 配置周期3 S" a  P% b: v
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
- {4 N8 ~* ?; V/ ^6 w4 E: T3 ^                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
! u8 F/ ?2 l; J" B8 s! |1 g1 I0 \
" B, M3 \' z# h; J5 e4 Z& \! |    // 禁用输入同步信号
( R/ |, J- z9 t0 s' M9 d  K    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
+ z; {$ s+ I8 U4 P- ]0 U* ]
  W+ f1 S, Z1 M, a1 }    // 禁用输出同步信号! _! M+ C! W- |8 Y4 m  B: _
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);8 n! Z# o# G7 [' M6 O# Z
. x6 {) N* `  I8 w: Z& L
    // 仿真(DEBUG)模式行为配置
% u* _/ L: Y1 {/ T' I- g7 A7 I& f& w    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
! B; j* a) @( w) ^5 u% k% |3 P4 e# j2 \& R4 {3 o, g
    // 配置计数比较器子模块# s/ y+ c- M% |4 G9 k4 j
    // 加载比较器 A 值0 \3 g) a" T# }. r8 k
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,6 e" {# v0 t% Q
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);" k& X- P9 ~" Z' A3 o8 H& i
& E+ I/ c' a6 [1 d# X  m
    // 加载比较器 B 值6 M" O/ d  b8 ^6 y9 }3 y
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,0 ~6 [. Y( }- u! ]4 V& U+ p
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
' F  J' o! C; T, `0 H* n2 ]5 @' B4 ^# ^- n% s0 ~
    // 功能限定配置(输出引脚触发方式设定)
- H( l3 t9 a6 j3 K2 ~! J4 ^3 R    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
% m+ d# z- H; v6 f. O    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,0 w3 `+ B' E- O) w$ ?
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
" q- @" z$ Y; k) q' N- w! G: n                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
5 v  r: l$ T- X, y
* i' d; `* c2 C8 |% B7 [- K    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
4 a& ]) p; x& z' e, ?9 o    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
3 [4 T' }0 z' I& v7 t: c& ^8 u2 [( v" {9 r1 l! r+ r8 B
    // 禁用斩波子模块) t7 ^8 D$ }3 t
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
; L9 Z! f% ^. F1 \
7 ?+ h, J  ], s# K8 x1 q: c    // 禁用错误控制事件" x! S& h( C% P$ O& N3 z: o
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);6 }7 d7 e2 q" i5 r$ `6 U9 E
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
$ T1 E8 l' I: B0 n) ~! Z5 {6 Q
    // 事件触发配置  p2 [. o- F* X
    // 每三次事件发生产生中断
6 F/ @* h9 P1 D$ k9 s& ], k    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);9 G7 w. f, h+ T2 A. C1 u/ }
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
  C! F/ V/ Y8 r" B    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
# V+ H. V1 v( u/ J7 ]0 g    // 使能中断: c2 _  ~: E1 d2 U$ Q; a9 L8 x
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);: h% x0 k  `% N; C: Q4 N* H
  G3 U. d) I: N' W, B6 P
    // 禁用高精度子模块- w: |9 {' G4 g; W9 S
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
0 R7 t) i1 ?6 u* ^" `1 r6 g2 O, Q4 h. _3 ?
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
, o) ]5 U( M, {+ T2 q* o' a}
7 K3 f- l) x2 Z$ `) S6 g4 y6 X. j6 h5 f1 ~% ?
void ChopperWaveform(void)
# D/ [' E8 b% H% N{
/ N9 p9 ~, X1 h% J    // 50% 占空比; s/ O! e! Y1 C# |+ p. \1 L( [' W" e
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);$ P* J; c. p" ^
    // 4 分频
5 _# a0 ~: Z! o+ ^4 ^! I    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);& e. [. U1 p6 o9 x5 M% W( A- T
    // 单个脉冲宽度( @3 r- D4 R, s5 d
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);+ ]# U8 Z: k- C( T9 `, j
    // 使能斩波子模块
; k5 `1 D* Y' t' J$ t" [% r. U* Q    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);" S& t+ s( q' |& n2 R
}/ w6 ^  n* _% p( x
! P) B( p6 s3 v. C$ u
/****************************************************************************/9 G$ P1 h3 L0 Q1 O, A
/*                                                                          */2 H  O- ~* [, I8 K
/*              PWM 中断初始化                                              */# c2 m4 i) T/ j% y. B
/*                                                                          */* L# Q, n" a5 u- f4 q5 t7 {: q2 Z; [% W
/****************************************************************************/
' l* \: p0 T2 w9 H) ^& ?7 f- xvoid PWMInterruptInit(void)/ f# a' ^, h: ~
{
* ~$ p0 \1 v3 u! ^; A( x9 T4 ^        // 注册中断服务函数6 |. ?  b4 `7 j* i' i' D3 [
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);0 _& t! V3 S1 m3 {# ?+ e8 |& T
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);0 i% a4 A4 e1 M) \/ m0 \8 U$ X$ N' t' E) j

# W) r' o% ^# ?9 B$ h2 a+ p        // 映射中断7 p0 [: p; Y5 }. ]- G" D/ G
        IntChannelSet(SYS_INT_EHRPWM1, 2);9 J& o* S( o! T2 J4 G
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);" r/ h) l; p/ m' E3 z0 ^+ _
6 r0 ~1 y2 P9 ?
        // 使能中断0 K% E# c2 R& B8 [
        IntSystemEnable(SYS_INT_EHRPWM1);
( N9 Z# Q6 ^, u5 z( H" M. X" n        IntSystemEnable(SYS_INT_EHRPWM1TZ);
3 Y" ^" e% R8 y7 h. v% {( ?( D# l}
- O& ~1 `: o& `/ p) \- q
, `5 S) p& m/ |/****************************************************************************/6 e! l6 x* T2 @
/*                                                                          */
" D& `* G5 A* c1 P: _/*              ARM 中断初始化                                              */6 s/ O1 e% V& c( B6 ~5 C4 l# J
/*                                                                          */+ O/ a- J" E9 c7 d% q6 Y
/****************************************************************************/
, j6 K4 e0 n( B, Avoid InterruptInit(void). I* Y- O( N7 I; A6 X$ t
{
& s) \% W# I2 L( G/ q, J: O        // 初始化 ARM 中断控制器. T# [3 Y6 `' i! P/ b& v
        IntAINTCInit();
  g: C: z; [2 k) S+ R0 S" j0 T7 j
6 o  M1 K" m4 G9 b- \" `        // 使能 IRQ(CPSR)
& p, j/ O9 n% F# ]/ o        IntMasterIRQEnable();$ A/ N0 D/ z/ c# b- b) Q7 l2 ^5 d
8 [1 M" `" [8 e! }# c6 q
        // 使能中断(AINTC GER)! S8 b' c9 ^+ R  q! u4 _
        IntGlobalEnable();
) X& Q. V0 T5 y5 s/ V0 w- @9 @! g6 V" @4 l
        // 使能中断(AINTC HIER)
. m! S8 [% ^! s* J        IntIRQEnable();
( |) f! F; M0 X4 ?! w1 F( p}
, w/ l% L8 N" x) f) _. S; I4 F* ^$ A* x$ |

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/
1 M0 m! i/ m- h/*                                                                          */$ |( U" a/ k9 \/ }: `
/*              中断服务函数                                                */% O! V' K1 x! \+ q
/*                                                                          */
: S/ b+ f) |6 |$ X& v# K# ^8 R5 D6 J/****************************************************************************/
- L  H  O! P8 e/ V9 V  Zvoid PWMEventIsr(void)
# k0 q* x; p7 G" I: ~  @{: x. {9 O# V/ c, g
        IntSystemStatusClear(SYS_INT_EHRPWM1);, f' L) S5 Q/ S) L6 c& o
: C. T; r$ A# j* D3 v8 M
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
8 }8 R% Y2 O/ V4 w$ R}
0 F# U- d$ Y. q% t! i( F! p
( T: l. O* t8 v8 k) r$ X) U" Ovoid PWMTZIsr(void)
( w) L2 A6 y6 |4 [{
+ h7 b7 ^4 y6 D8 {+ T7 @* M6 G5 k        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
1 M/ Z9 E0 ~& v
/ r! y( l) O$ Y9 p+ I+ g( ]! ?& f    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);) m  h: i" d( J5 h
}! F4 d" w% @. ?0 w. Y6 @' F$ Q

' Y4 F8 X- L& g0 u3 r! b/****************************************************************************/
& Q  l& s+ y4 p/*                                                                          */+ X. x; W; d, P
/*              初始化捕获模块                                              */$ X$ G2 j3 s$ a) N+ ~  Y
/*                                                                          */! O9 J% U1 V" W( u7 q6 u
/****************************************************************************/+ u% t; i1 M  ], g
void ECAPInit(void)
! J4 F, ?. t1 J7 v% [{! u8 K* w" f, s( H- @
        /*-----设置 ECCTL1-----*/' X) z' {& P5 p& Y+ m
        // 使能CAP寄存器装载
) R9 M9 g: S! v  p        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
. @8 C" {; k0 G, \( |  H3 Y" ]        // 设置预分频值.
) R# j! L5 a5 w5 w! Z+ U5 ^$ ~/ q( u        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);' j; z( b/ j- |( Q% x0 Q+ w
        // 上升沿触发捕获事件
  @7 B( j/ s4 y- J6 ^! `* w9 f2 T# w4 j) w        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
" c& F5 D! j+ ]1 c1 P; p8 g$ J- z        // 输入捕获后重新装载计数器值.
1 F5 p0 R- V( d: f$ p3 d; u        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
, |3 I' Z2 G( M$ @+ \6 p
$ K2 P0 R5 r! D; L  M5 X, h. Q        /*-----设置 ECCTL2-----*/( m$ n8 u7 ?  E' x0 ^* y3 ^
        // 连续模式
; j8 |3 i; Z1 d* S" e5 T# _        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
# b* H/ V! n  W* W        // ECAP计数器TSCTR持续计数
" b+ d+ J3 o- M' p) T- I        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
1 t3 N2 k3 s8 h        // 禁用同步输出和同步输入
. @6 ^0 f, ?* l3 g6 ^8 z0 R/ [        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
0 i2 [% i% s3 F+ @. c        // 配置 ECAP 2 为 CAPTURE 模式
; ~& k/ G# q' d        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);2 Z5 p+ x$ m7 Y) C
! h! k3 b; w# \- i
        // 使能中断1 W1 H7 x$ b$ P' }* F; `3 c- H( P
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
6 c  N! ^: X+ S# Q, x, p# [}
% D- f% q2 f# G$ b* Z
1 }( k+ n" V- B/****************************************************************************/
! g& F' d5 L  b/*                                                                          */' j) ^' r7 \1 y
/*              取得捕获结果                                                */
6 i$ N# {/ {& a/ Y4 O( E/*                                                                          */* e9 W8 P# t0 r! _: r+ Q8 _! d
/****************************************************************************/
4 Z& ^* W2 J. `1 o9 S. Wunsigned int ECAPRead(void)2 J4 ]$ x4 p# k- R* l1 k7 k+ X
{  V" p: Z0 H0 _( }1 b# y! t8 T. n
        unsigned int capvalue;9 b, w  {% S4 H
        unsigned long frequency;
& L; W: I3 N$ F1 e2 l+ P$ h4 L
2 P. @" m; ]! w        // Event1 中断标志- b8 d7 }& Z& y4 w3 f3 p
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
  U  n: u4 S1 h" S2 W1 s( O$ l+ t        {7 ]/ {. R) h, x' J% R6 |
                // 取得捕获计数
. n0 g( Y9 v8 c/ g' e' Y+ i                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);# v; [# d! Z7 \1 N% Q7 a& ~
                capvalue = ECAPResult.cap1;
5 ~. l+ g( k# j  E9 B: `$ E; ]% D+ ?: o, \: W! q, @
                // CAPTRUE 模块 228M 时钟主频5 A- `) I9 C) C# Z% H0 b
                frequency  =  228000000/capvalue;* C, ~6 V: m7 y* z
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);( r) j! v( g) A+ Y/ C
+ J6 `, r+ G$ _1 A6 ]
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);  I0 ^. U$ l+ U$ _( H. K# r
//                IntEventClear(SYS_INT_ECAP2);* _& i& G$ Z7 l
        }
6 E3 ^1 t2 c( ^( L  J4 J        return frequency;3 K+ i  V: c3 S# ]4 O2 U# v
}1 A: {4 R5 i; Z

作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
) J0 t3 E. l  X% 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