嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家' B  L  M4 a; b7 ~! H: A3 Z

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
- V( R' R% v5 I1 [* p/*                                                                          */
5 Q. Y# S$ O! w" L/*              宏定义                                                      */9 {' J# x* h) e, g9 N% m! ?9 Z
/*                                                                          */) F: h  |, R( m
/****************************************************************************/
6 H2 s* e* i: t// 软件断点
$ Z0 i' z* ~7 F4 U#define SW_BREAKPOINT     asm(" SWBP 0 ");5 W! O5 W1 q/ e- W

4 j" y/ i; B) N// 时钟分频
- `4 T) Z3 V% `$ y% I0 e" Y#define CLOCK_DIV_VAL     228
# t7 B& U/ t- S2 D5 y9 F
  O% `7 d8 A7 V% A6 t* k( {( _; V/****************************************************************************/6 Z& l. t0 G, B6 Y: c% R2 Q8 R4 M
/*                                                                          */
  r2 U1 \6 u# m" z1 M% b) `/*              全局变量                                                    */0 v, Z( B+ K3 _  H( j$ I5 Q% m
/*                                                                          */! R) M4 O6 w* y* ~5 h
/****************************************************************************/
  \) X0 Y& |" T! b' W0 Q( CECAPCONTEXT ECAPResult;* i( ^: Q0 K! y
6 j' r7 O! z# V0 J; u/ A9 g! |
/****************************************************************************/; p* V* s4 P4 c# S# _& T+ v
/*                                                                          */
3 g) U0 W! C" Q4 @2 |6 d/*              函数声明                                                    */
# v  n) y; J) g+ _! F/*                                                                          */7 |! v2 _6 w! K" n
/****************************************************************************/1 Q9 H7 W; O5 t$ F! g' b
// 外设使能配置
* N* f8 g0 ~% C% q1 hvoid PSCInit(void);$ N) T0 W$ f, v2 ?& `
5 }! }5 d. x7 s9 T  \5 {. u
// GPIO 管脚复用配置
+ ]* Z! h" `- c1 Tvoid GPIOBankPinMuxSet();) N0 d7 c9 N) S$ p  J7 |* t

0 s: m8 s# y" i( F// 产生波形
$ b( N. C! G, X; ], m: ]! ~. Evoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
4 n! P! ~  I; O. n" V  [void ChopperWaveform(void);
" G1 k1 l7 C3 h. m$ K8 `' B  s, n, x# b( W! g# T
// ECAP初始化和读函数% B1 ~7 Z' U9 g% ~% K0 ~
void ECAPInit(void);
: y" m& E6 e( \3 ?unsigned int ECAPRead(void);8 g! J- O6 Y( W  V- k+ _2 {& \

0 E5 w- `& ]* w! U0 k. T; C//ARM 中断初始化2 a$ Z* G3 X; A6 ^, N. p: P. {
void InterruptInit(void);# h6 E/ C/ X$ h0 F/ A

- P9 f3 Z  ~' [! k6 C# D5 w// PWM 中断初始化5 M* l1 O' G# Q1 G( ^/ |
void PWMInterruptInit(void);$ ~+ _& f, `+ \
// 中断服务函数
0 g$ d4 @$ h' s: [( m+ E// PWM 事件  s. k6 L& t3 j5 w1 U3 J1 w
void PWMEventIsr(void);/ ]4 J. A& e% K
// PWM 错误控制事件- R  r' {+ f! u: h
void PWMTZIsr(void);
8 S, ]4 `; s8 N$ B9 D6 K$ w) c
" s! x, {, s) C" W0 J8 H1 q/****************************************************************************/
7 s; e! m  s- h4 o6 o/*                                                                          */! r/ B' Y( m5 q$ n
/*              主函数                                                      */& U' I, U+ s8 n" ~" y' t
/*                                                                          */: @9 F* |( f4 P/ ]) X6 x( @7 |
/****************************************************************************/
5 }$ \. W1 f/ e6 h+ a' s, f4 Cint main(void)
4 Q- m! G  m% ~+ e# v$ x{
- X, k) R0 k7 N, M7 c: c        // 外设使能配置4 H7 }4 g" \0 Z1 K1 @
        PSCInit();
7 B+ |" H& e4 s9 `% H0 V; [& W# K' k% \2 I. v" s0 \1 V* R% P* h! t
        // 初始化串口终端 使用串口2
- C3 K* [* z' u# A        UARTStdioInit();0 R. a" A5 O& N) r
        % w% n' w* r5 z4 d6 [/ {. {
        // GPIO 管脚复用配置
: {  Y4 U2 P( k) L6 V5 q        GPIOBankPinMuxSet();/ }1 O; S$ c2 ?& p. I* ]
/ f2 c0 p* `5 u6 ~! o" b# r
        // ARM 中断初始化6 p" L, o% ~! M, J2 z' \* \
        InterruptInit();
" B: X" `& Y8 P$ p4 A" t9 L# p6 s( i- I
        // PWM 中断初始化
9 l% G8 J3 `- p. r4 A4 i        PWMInterruptInit();) r+ q8 g% q2 M' h" G9 ^  t

6 u. r, _8 J( [$ H        unsigned char i;& O! ~9 A: {6 {
        unsigned int j;8 _& I& h4 @6 y& u1 z9 n  S
0 k2 w- q+ x8 E" [1 r- ~
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
. y- M4 w0 r$ h2 ^! X" ?# @        UARTPuts("------------------------------------------------------------\r\n", -1);
5 ^* q* A" R" `1 v3 A. ]        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);$ D9 n: X9 s8 Q) ^! \/ D* J
        // 产生波形8 D- r( `1 U$ @
        PWM1ABasic(25000,50);
  z3 M* ^" d4 S2 l3 y1 @3 o1 B: M
! ]  Q/ R3 C5 Z) P2 w, m        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);5 ~- n* e, g% p, f+ f; @( v/ R
        UARTPuts("------------------------------------------------------------\r\n", -1);
. ]5 O4 `% ]- H, u9 E3 g
( C: B# e6 F1 @
) Z$ g* b8 p7 }1 x( L% }/ z8 K
        UARTPuts("------------------------------------------------------------\r\n", -1);: O  N5 A3 Y- d& y) s
        UARTPuts("                    C6748 ECAP Test\r\n", -1);4 C" w! H& \$ Z; ]3 g/ x
        // ECAP 捕获初始化
: j) x0 M+ I. F+ S) W9 y" r        ECAPInit();
4 t$ h! {' ~2 y- B" x        UARTPuts("Initialize ECAP.......\r\n",-1);; [8 K) Z* N% b% y# L& }& J; V9 ]
        for(i=0;i<5;i++)' a% m, P0 r5 f7 w! Y; T# V
        {8 [1 h2 k% J2 x! G  p0 G
                    for(j=0x00FFFFFF;j>0;j--);            // 延时( L5 r2 m# ]) O- U! @' _3 r
                    ECAPRead();# \8 F% d" `/ l" @5 O
        }
* v  Y7 q. U( A) K! J        UARTPuts("\r\n",-1);' E( a) R/ z/ C; r+ }3 y
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);9 R( d- J6 q0 F+ x8 z8 M! D) t3 r. E/ {2 \
        UARTPuts("------------------------------------------------------------\r\n", -1);" p% S$ Z- c+ d, I$ l" M
5 b- U9 n5 ]0 H( L, P2 E4 j
        // 主循环. ?' t- X8 Y- s
        for(;;). Q- `8 D5 Y0 k$ d6 a" B
        {4 X1 X# }$ B& Y

5 }" B1 L0 s! P( l  D2 ?# s        }
( q4 o6 d" n2 x  e! [/ h5 e; H: M8 }}
6 f2 a; {" b. s7 S4 i9 j0 D; Q0 H* t
/****************************************************************************/
& k$ @- s6 p1 g/*                                                                          */
) d/ A! E) ?% v. d9 t: W/*              PSC 初始化                                                  */5 b5 l" a" E2 [9 Z+ ?2 m3 |5 g
/*                                                                          */& b8 L. `2 X7 ^! L% d
/****************************************************************************/
& n3 L, H7 O) B4 j$ ?& f* pvoid PSCInit(void)1 \2 d9 c) V. H  c
{
1 _' G. }9 f/ r) q3 [" y( X$ u        // 使能  EHRPWM 和 ECAP 模块! l: V9 r7 V$ U
        // 对相应外设模块的使能也可以在 BootLoader 中完成
5 t- U( T: }4 a3 m) E# r    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
1 z/ W& Q# K& C  s    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);8 R* ?/ n, }1 J9 L: c" r
}
8 j) j% _6 q6 m& ?9 q
7 Y7 t* z4 A  @5 Q5 {1 J/****************************************************************************/7 R8 e1 I- N% S) I+ S
/*                                                                          */
+ Q7 h' l' H! C, Q; n' y! C/*              GPIO 管脚复用配置                                           */( }5 Y2 f' Z) a! ~: d
/*                                                                          */. f- U6 n; i1 c. R& {
/****************************************************************************/
# u) c4 j& Q2 Q# t" E3 ?void GPIOBankPinMuxSet(void)- Z5 ?* L- F( E8 b- D0 T3 s8 h
{
5 Z+ n4 e/ a) g* X. h; E( I# `: G        EHRPWM1PinMuxSetup();0 `( F; K  U3 b& t2 w

- Z, X/ ~7 P* @1 F" K        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
  n: k# t( n2 m% g" m        // 作为捕获功能时管脚方向为输入8 F, ^3 }% l2 e% w7 a6 @
        // 作为辅助脉宽调制时管脚方向为输出- ~) N1 ^) t, O$ y/ S3 j
    // ECAP2 / APWM2. V0 @) Y# m6 `; U) K6 H( x
        ECAPPinMuxSetup(2);: X' J$ N; f( D" z' n. P4 j

5 Q* y- R9 U! N1 n( a/ O        // ECAP2 / APWM2方向设置为输入* ~9 }# A  r* S# A/ ]
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]% C3 H* Q+ \3 B, i9 K
}6 j. l: G/ i9 V7 _) K4 H* G
& s: _( |( M0 k% K6 H1 N# S
/****************************************************************************/5 i/ K- }, |' q" l- @
/*                                                                          */
; P. R# g! ]% F! W1 D. q# v% z9 [/*              PWM 输出波形                                                */
! R: c8 n8 U5 }+ h9 h9 @/*                                                                          */
5 I2 {% n7 e( D, P/****************************************************************************/! P+ }# O- @/ w5 t
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)6 T) ]/ L$ b! P" q+ l
{
1 U3 ~7 {8 A7 [    // 时间基准配置
0 Q) l& m# r% g5 P" L/ d* f    // 时钟配置
; @- o# Y( @% P& s    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
# W( Z% D0 G& \7 ]9 ~0 O6 K1 p" A  W3 v# K4 W6 H6 @
    // 配置周期# \5 n- {. s1 j
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
* |6 U- V5 C. w) E7 J                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);, {! s: R! Q; ~8 V  {
! b  J$ R+ B: J( T( l3 i
    // 禁用输入同步信号
) p1 J+ ~% d- n" @6 R2 |    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);6 A, p* }: U. E" L% R& H$ R

0 i" J5 f4 Q  L. p, Q' n4 A9 @    // 禁用输出同步信号
6 ^' h4 ~$ y) e0 A# P. G, w    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);) E. k  l. o  k" Q+ Z

# K4 H/ ~1 e9 D2 e    // 仿真(DEBUG)模式行为配置
8 p- }2 h* g4 G8 ?+ g) V    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
& e7 q5 C4 V- V2 f6 U
# i! j. Z. q, Y" N    // 配置计数比较器子模块* W7 y# ~2 u0 W  U# W1 a/ e
    // 加载比较器 A 值
1 ?; y6 }1 ]! {2 K3 K! v6 W: c& Q    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,, I4 t$ E/ I1 G) t! [- @
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);! ^7 p0 s, A) V5 Q7 w6 A, |1 U. ?

( j- J* U( g. k  D    // 加载比较器 B 值8 P5 n1 c% U) `; N5 ?! l$ y
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,. X* K+ [! \7 [2 |1 h* T
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
" M6 U$ o' A' L: J) g( j
; P0 J) U5 I" M    // 功能限定配置(输出引脚触发方式设定)8 {' U7 Z( n/ {7 h$ Q2 d
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出; ]8 x. y# v  y8 |
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING," G3 y1 f: r* X. p" Z
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,2 B5 d# f3 F4 J$ j) [
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);$ T5 R. M6 \* b

# T: h3 S- p0 m7 F    // 禁用(旁路,信号直接输出到斩波子模块)死区模块0 E4 m$ Q& i# e/ h8 q' ^# E
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
6 m; {) P! g. N# T  _. {" ?5 w; D, `! m' l, M, f
    // 禁用斩波子模块* ~, |) t3 Q% {- n: F
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
- n" L2 _5 o. _8 Q& H4 u9 t* C! t. E3 O3 I( ?! R# y. r; Y/ z
    // 禁用错误控制事件' o3 Z9 H& I  u# @- o& G. P7 e5 k4 r
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);; ]0 v. p7 s( C
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
& U$ g7 |0 }& c) M
& h9 A2 H) v$ f, B: |    // 事件触发配置1 ]/ H  m' g$ d4 ~. i& B9 `
    // 每三次事件发生产生中断
) B; ?2 [; _3 {5 r, A    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);3 ]' D% Z' k. p$ n- w* G, K. h  z
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件1 H# j6 Z: E& _/ I
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
" I' y# s2 R! P; x$ S( W3 j/ R    // 使能中断' g' f5 e- `* q
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
$ J) E: G/ r0 }. }/ O6 [! M+ v4 s- I1 n, Z
    // 禁用高精度子模块3 ?4 I* e5 I7 o& Z0 U
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
' A' U5 Q# }; i0 }1 q. c) @: [5 C! h1 g6 z* u
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
  v( u2 R# R2 u1 T9 U7 X% O( A}
6 Y" L8 @/ x& o3 X1 T1 e  Y. Y& |
void ChopperWaveform(void)5 W2 m5 C+ w5 [4 f. m0 S" O
{
. Y: h& S, @, S, c    // 50% 占空比3 M$ ~7 R+ P& ]; \4 e2 c" [8 j. k
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
+ Z% m* Q8 G- ]6 ]  k+ ~9 z    // 4 分频" h2 U, d3 W' [! ~/ m: Z' I: v
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);; N5 a/ u. J" m1 l
    // 单个脉冲宽度$ C4 L8 I; ~# b
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);2 [) Y& L9 a6 E
    // 使能斩波子模块
6 f8 h2 W+ j8 ?! R    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);) i& E+ p) Z, F" h" {3 l
}
7 I! R2 ]$ j+ B( Y9 N. D0 X4 `* i( ?9 y4 c9 P% L
/****************************************************************************/
, c; N, A. q: _7 H1 u1 k/*                                                                          */0 W0 `- I5 W0 i7 N
/*              PWM 中断初始化                                              */
2 V: ]: o4 l4 F; p; x2 D1 c) z9 a/*                                                                          */
# h0 ?2 i8 D. c" O6 S7 J/****************************************************************************/
! J& O% C/ Z" ovoid PWMInterruptInit(void)
" I8 a/ X; b% R4 M  _6 V$ \{
0 X* k) e- r) ?        // 注册中断服务函数
) u" h" G/ U% T* _2 X        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);0 I; B$ O- q, Z; O: G4 j1 q
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
5 z. h, p( \0 j3 S" }6 {
( q% F5 ?; T/ W/ ^) n        // 映射中断) y; x; J4 B) ]( _
        IntChannelSet(SYS_INT_EHRPWM1, 2);
) ~) X# j# @* w        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
: ]& K0 H2 w( t7 O* F. F; k3 C2 r1 u. `* D" Q
        // 使能中断
9 P- O* q/ n1 k, F9 c: S, ~" e        IntSystemEnable(SYS_INT_EHRPWM1);3 @: B! N* V* w. c; X) q
        IntSystemEnable(SYS_INT_EHRPWM1TZ);
" J' R/ ~+ {, t% p$ Q}+ f- X- I4 B) A  j
" j% e& G/ ~. r* A! V
/****************************************************************************/: o3 L' \& i" h. u
/*                                                                          */9 i7 @* h% E. S9 u! x- e
/*              ARM 中断初始化                                              */7 i6 @% i- S9 T( C% c7 m
/*                                                                          */
/ e8 f4 R& G1 q* B  i: ]/****************************************************************************/' Z0 v4 q* I: p6 H+ H5 F) A, a4 w
void InterruptInit(void)
6 C' B9 _0 l) a" ?9 Q{' D& H! K. B4 q0 g6 }5 d
        // 初始化 ARM 中断控制器2 Q7 U) ^9 X8 n5 d0 m
        IntAINTCInit();
' F$ X& ~& k  \
3 \3 Q$ U/ _; l8 Y- w        // 使能 IRQ(CPSR)& @/ T; e" v' o5 Q8 k: \5 \# {
        IntMasterIRQEnable();. V" B/ [3 z0 |" f5 [! [  P

& k% m: `- A6 h        // 使能中断(AINTC GER)) S0 L) h/ [( I& j2 @  f
        IntGlobalEnable();7 M" S" ~4 F& {
' c4 Y* Y/ g: a
        // 使能中断(AINTC HIER)0 G" k+ g/ [% m( V
        IntIRQEnable();
1 F+ f! n2 x3 R# @& s}
, g3 q' D8 ^, B  k  T6 W
, n+ ]4 {0 Q9 l
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/
% |' a2 Y. G5 Y/*                                                                          */$ v! ?" t4 M8 Z) x" w' Q! |
/*              中断服务函数                                                */0 P) K+ F. b" x& D0 l7 ?7 O1 Z
/*                                                                          */8 O( S( H0 V: o! R+ P! I9 `
/****************************************************************************/: u5 r; ~7 c, _3 J. U# R2 E1 b
void PWMEventIsr(void)' @# k) l8 G0 j+ N3 t
{, N6 Y  g3 {7 P% D( F
        IntSystemStatusClear(SYS_INT_EHRPWM1);# J1 R/ c+ I* E, V5 L6 s- k: A
; G! c, ]( I% {3 a
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
; r4 Y1 N1 C* m}" |- f) G3 i5 g+ b. I
7 y) L8 J/ I% ]) Y. b
void PWMTZIsr(void)$ i) W( P+ J: C' d5 h6 m, {
{( ^0 O, }5 E5 ^1 |7 x. i  _
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
; ?; \7 V7 Z$ n2 V' h" v, f4 b2 Z/ d# ~9 J2 w* T3 T" Q
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);. t) a5 N+ J4 J, F, ~3 S- b/ n
}
1 `# z" c' Q# X
2 R( T) E0 _6 s6 ]6 ^$ v& N/****************************************************************************/
) m; v1 o6 c& e/*                                                                          */. [( M6 g1 Y5 x. T5 P, e! ~: T
/*              初始化捕获模块                                              */
' u. W4 e! q! t+ H2 W7 ^/*                                                                          */9 W3 Q: O( F" x( q( v4 Q1 `9 y' l6 \
/****************************************************************************/
; e7 M. v' Q, \$ `1 c1 h( X* @8 C  Evoid ECAPInit(void), \0 R3 Q. x7 `, T" A2 l9 b
{& [2 a5 f. E# w1 N% f
        /*-----设置 ECCTL1-----*/3 a& I* w1 \2 T  K
        // 使能CAP寄存器装载( j5 q# y0 O( K9 A) [4 B
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
1 N9 a7 T8 r9 Y/ y9 n; G, `* |8 n( Y        // 设置预分频值.
- d4 P" X2 h. k( J        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
9 Y1 Y. t2 u! Z. R2 F  p. ?3 @. ]0 Y        // 上升沿触发捕获事件
- C1 ~. M, Y$ n# i) Z        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
0 C" K1 U) n7 ]' w. [* {0 Q9 P        // 输入捕获后重新装载计数器值.
, f" C$ w3 Q+ m3 d+ g/ y        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);$ j9 L# x& u) j' f( i
/ M4 v: k) C7 m5 E$ d2 K
        /*-----设置 ECCTL2-----*/% v. [' i  `8 v; j6 T4 k
        // 连续模式+ y2 O/ p/ U; L/ g$ o& c0 P% g# {
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
! `& i% n$ Z& t, f: z% S! }        // ECAP计数器TSCTR持续计数9 P1 D2 {4 w6 F7 k# j
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
, l* s/ n. _4 U2 V5 b        // 禁用同步输出和同步输入( o5 I( v8 @, m0 h" k9 p
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
: [: W. g  P- o; E# p' I  O. f        // 配置 ECAP 2 为 CAPTURE 模式" r+ R; H  |# U/ }
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);" b5 ~* o! X7 H6 n/ R1 G
9 E( t# B- Y  O$ ]" J) X
        // 使能中断
$ U+ Q+ B/ s9 t2 x* o9 @# s2 `; E" V//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);" J: l4 {4 q" e
}8 R2 ]8 A, N7 R: g$ Q9 \

& R4 K" ?& h! z- W/****************************************************************************/
- |4 b3 F: S% [0 i  c: K" S5 ^/*                                                                          */
, V' V& F; D& q: e1 s) o/ Y2 }/*              取得捕获结果                                                */$ E& u0 T8 r4 c9 W! a* t
/*                                                                          */
. j$ H  G4 Q$ z/****************************************************************************/
! z* s6 E3 N  K' z1 ]* ^unsigned int ECAPRead(void)
& Y- M6 K! F1 e. v) s) s. ~: w{. N5 ^& q' K, V% Y* [5 [6 x
        unsigned int capvalue;( [; y8 j! G# x; t) R7 O# Y0 h
        unsigned long frequency;! A2 ?2 g5 B. R/ @
5 Q- N1 ^" x6 Z5 f+ ~
        // Event1 中断标志
! S3 I/ g; R/ K, x9 B        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT)); f  }) K" s8 i+ |7 y6 l8 Z4 T
        {" D8 |9 u6 S9 f0 q0 v: l
                // 取得捕获计数
4 u+ m! ~6 ^; ~8 M  B" O                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
7 m! |: X6 c4 ]3 @( \0 p                capvalue = ECAPResult.cap1;
- j8 Q; p; H# d5 G8 p1 k7 C9 ]
% Y) \! d9 N6 n7 h0 d& v                // CAPTRUE 模块 228M 时钟主频" H8 _7 b! N5 }6 R' V) n9 q5 W1 E5 v
                frequency  =  228000000/capvalue;
) u' b) Z0 ^/ q. [7 U$ T) k                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);( k' f" b/ {, A  k# Y$ x+ K

( ]3 F: Z2 ?) Y/ k" [# {* B/ {                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);' a4 q8 X, ^0 X& |. w0 R
//                IntEventClear(SYS_INT_ECAP2);% y; ^9 d+ A5 J1 @0 x1 O0 H% {
        }
. l: U3 d- n! P3 o7 x; s) g7 b        return frequency;
/ a/ W; S# y9 i  c) K+ a! ^}. X" D, t( R9 D7 Q

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