嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家" H; }# U0 ]; M, m

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
$ b; A" K0 P$ f3 V/*                                                                          */5 w0 A6 n; K! {. o+ y, r
/*              宏定义                                                      */
. Q8 {( u' s$ c. s' l8 i& |/*                                                                          */! v" r5 ~3 a; U0 Y/ }  V. J
/****************************************************************************/
" x( S" i( h& B// 软件断点
; |0 x- Q# w' O# M9 N& Q* Z2 |#define SW_BREAKPOINT     asm(" SWBP 0 ");
) n+ O7 a. w  c) j7 q. r( w1 p& o  w
) p: w, Z) q0 d8 ^) }' Q// 时钟分频! b  e0 |' H) F3 o
#define CLOCK_DIV_VAL     228
- D* s# M6 F$ K
: w( y, K# x" a' F) }" |8 M# K/****************************************************************************/
- z6 X% \0 e7 t/*                                                                          */
2 }4 ^  e! Q3 I' O! H, L& ^/*              全局变量                                                    */
6 ], h  U: z! m  j/*                                                                          */$ {$ H1 H2 u' f
/****************************************************************************/
% L- \# Y- Q( q) d2 W5 hECAPCONTEXT ECAPResult;
& A* R7 b. y; i. t4 r9 A. g
) |0 k0 m8 v2 M/****************************************************************************/1 s6 v0 s% N. y, l* D
/*                                                                          */; H% @5 |" S: }9 k( ~+ F4 ?
/*              函数声明                                                    */
( N$ O4 J4 R& W& M* y" s/*                                                                          */, a8 G- ]+ E2 ^- Y4 u. h% S
/****************************************************************************/
. J6 R- f& T- M: e/ N// 外设使能配置* }* ]5 c1 ^6 T6 E% e; A
void PSCInit(void);
, P2 e( R0 F1 r) K% v1 d! q0 I1 F4 c
// GPIO 管脚复用配置/ T1 h$ j! L' U& Y$ h) D) R
void GPIOBankPinMuxSet();6 ]9 }6 C( r' P

; l2 N: I' b$ A// 产生波形5 x# S# ?5 b8 Y1 j, W
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
4 H1 o9 l3 u/ x0 jvoid ChopperWaveform(void);
, R3 s& ^' G  D) Q% A) Q6 {, i
4 [+ W' k& F/ F1 U! q) ~// ECAP初始化和读函数
, |  c6 L; y& G/ p7 d1 V3 jvoid ECAPInit(void);
8 z/ k3 o. r  @* W& t4 ?; s+ t+ iunsigned int ECAPRead(void);
2 L, f) z7 A8 X9 v
& \5 r; O) {0 b: y+ o' J2 B  t//ARM 中断初始化
: P1 d# d. q! ~: A0 rvoid InterruptInit(void);0 ^2 o) b2 M. y. r' I8 p6 Q9 U

/ G' E7 T8 I3 {// PWM 中断初始化9 J$ e* B+ C3 Z( t: K" D
void PWMInterruptInit(void);
1 `( p6 U# _& g0 |. n8 @# ?" \3 `// 中断服务函数. z6 K0 G2 E1 A/ u& {* Q
// PWM 事件
' Y1 a# G% Q' R9 _2 Wvoid PWMEventIsr(void);) z6 A: S5 a- C
// PWM 错误控制事件; Z7 M% N4 m+ W9 ]
void PWMTZIsr(void);' m9 q: L# x' W0 s+ t* ^

9 X8 H3 I3 Z) p* y. f. V( \0 z8 W/****************************************************************************/: ~& Y) z; g7 P" U
/*                                                                          */# |" {" i! \( A% L
/*              主函数                                                      */2 w, }7 ?4 W; [& I- c" h$ L; y
/*                                                                          */# ?# H( I) e9 Q( _$ n: n0 I
/****************************************************************************/6 Y. d4 `; z3 A9 `
int main(void)+ k: S% c7 u& g5 j
{
6 v& J5 J" \! @% x, T        // 外设使能配置
. V# q. {2 C" D        PSCInit();
" E1 E8 E6 W7 V: B5 m8 e9 }2 a3 A: l$ n1 V; k# J* F
        // 初始化串口终端 使用串口2
/ T& _' S# u4 \" D/ w8 C  T2 F4 u        UARTStdioInit();
) s1 `0 [& ?) V& B7 m8 g: c7 b       
  E. d# c" s" P" D* o8 J+ ^        // GPIO 管脚复用配置- _# f5 P7 n) `% m  P  R: _, v
        GPIOBankPinMuxSet();# s* i# j" J+ W. T6 y
9 a+ o6 g. j% n+ }7 N# F
        // ARM 中断初始化
( N0 C" U( g2 h+ [        InterruptInit();- N5 y) [' n9 q$ Q& y8 ~1 ^

: D- E4 m8 ?3 Z        // PWM 中断初始化+ y- `/ F4 K$ U9 f. f% v6 }
        PWMInterruptInit();
6 i5 B8 Q# K2 P  K9 d
9 X4 f: F$ e& C' h        unsigned char i;
& a+ x* m8 Z/ d  [: j        unsigned int j;
4 O; }8 L0 j( T- N: R8 U6 l2 q
: \# ]# `2 v% B2 ]        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
3 J! N5 B" ^. q; T- V- R7 y. L  f) C- I        UARTPuts("------------------------------------------------------------\r\n", -1);
/ s6 e! e* k( c" |; R" K( _. t        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);$ Y* B! W3 F: n6 T- v* {; V5 p
        // 产生波形) F) V& P* x7 P& j6 H3 L: b
        PWM1ABasic(25000,50);$ X" x9 C. c& [+ G7 D

2 }& I5 e+ [4 ~/ c0 D1 ~) Y        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
0 r0 c6 \+ ~2 p! e9 r( y! w8 y        UARTPuts("------------------------------------------------------------\r\n", -1);0 g" X5 R0 ^- |8 D5 X$ ^" S! q
" o# N. g6 r! X7 v, I5 z
, V& e# @- z( v' c. `
2 @/ [3 {4 H$ L5 n! e
        UARTPuts("------------------------------------------------------------\r\n", -1);5 o% z7 H; g8 I( ^3 B4 G2 u# P
        UARTPuts("                    C6748 ECAP Test\r\n", -1);
& {0 A9 C8 q: q: Q3 d        // ECAP 捕获初始化
0 t; |. W+ C' l& v% m& L        ECAPInit();! F# m, s$ e  `$ b
        UARTPuts("Initialize ECAP.......\r\n",-1);
: ]: ~8 S: Y( O        for(i=0;i<5;i++)0 ^- N. d* b  a5 C6 p* z7 K
        {
, x' h/ Q% u% F+ `2 e4 A  U: E                    for(j=0x00FFFFFF;j>0;j--);            // 延时
; d3 {5 `# x. m/ C1 V8 m) q4 d                    ECAPRead();9 ]" Y2 Z, F4 f
        }/ l" j/ r+ K& b% y* I1 a% C
        UARTPuts("\r\n",-1);
4 C2 r2 ?4 y( o% {& C9 O        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
. C% @" i' A  b$ i8 t% T        UARTPuts("------------------------------------------------------------\r\n", -1);
7 ?- s3 l3 q3 z% P& C; d1 R
# D( m* e) |5 L( B1 J$ p0 }        // 主循环
  C) B6 L; Z- E8 `- x8 J        for(;;)/ R% r' |2 n  U! i6 k6 M
        {
3 X( h; b: u" \
/ ^: d0 Y! l0 ~& l$ t        }
% p- p5 B7 K) j( i5 ^}
6 G! k9 _* [7 E
+ ]6 p) f: W) Z5 X( I3 C, t5 s/****************************************************************************/+ U6 t( M1 [5 B: S% S/ U$ j
/*                                                                          */* o3 _- r2 U5 U$ d+ T! t
/*              PSC 初始化                                                  */# u. E, m" ?7 O" V" d0 i& _
/*                                                                          */
  k: _3 o& I" f+ i1 q8 Z/****************************************************************************/
+ J3 ]6 ?9 _/ Z$ J; lvoid PSCInit(void)5 ~, }$ \" }: c6 I4 w# ]0 A
{
; ^" N& z1 O8 K9 \5 n        // 使能  EHRPWM 和 ECAP 模块
( L- \+ ?" N5 M& ]. V8 W        // 对相应外设模块的使能也可以在 BootLoader 中完成7 y- B4 g4 l, |
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
2 N2 T" f1 e6 R5 O) B, P7 v/ b0 ~    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);  K, m, z5 H4 j+ y* @9 X
}3 K/ D  s7 }; d0 ?( x
2 @1 ?; h6 M* }3 [. V
/****************************************************************************/
& H# v9 c. d+ W* ]/*                                                                          */- ]: H5 R" z9 k) }3 R
/*              GPIO 管脚复用配置                                           */
0 _1 T7 y- Z0 h, {/*                                                                          */
3 R& }4 q$ L0 T( w4 Q) x# N: h5 t/****************************************************************************/" H4 h4 c) R% I! F+ D
void GPIOBankPinMuxSet(void)
/ z& a, R  F+ k+ f{
( l+ B: t/ ^1 |* _% k        EHRPWM1PinMuxSetup();* ^" {# \1 D2 U! M, m5 r5 q- o; O

$ k3 _$ r% O/ ]; m        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)2 [6 v; x  J3 [/ W
        // 作为捕获功能时管脚方向为输入
1 X& F8 _0 ~" r8 }: s, K* F8 u        // 作为辅助脉宽调制时管脚方向为输出4 ~4 k9 s  U- W/ H+ b& ?: K1 Z1 H
    // ECAP2 / APWM2
; |0 @3 v+ s6 g$ f+ w        ECAPPinMuxSetup(2);4 S# s/ }( J3 S/ g

& {3 d8 `, M8 H& L, |; d        // ECAP2 / APWM2方向设置为输入/ O. }" o. t- _+ [3 l, n  V. [6 A
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]6 j- N9 I2 z7 i" E3 r( g' P* n. W
}+ D( k' P  a" c

/ C, _1 x" ^$ D6 s/****************************************************************************/! W4 V( j6 \; X, n1 P) ^) C, b
/*                                                                          */
( }+ h+ ~- y- l! h, S8 K# `, a/*              PWM 输出波形                                                */
  |" E  h0 w  p6 T2 p( V3 R% E/*                                                                          */3 Y" e3 h  C- r( A3 @) |0 ]0 `
/****************************************************************************/5 K$ H* h+ t1 c0 A9 m( \
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
: s2 }9 R8 n; u5 A" _8 B  o, ]{
7 T- Q, U) ?4 o. ?% y- `2 k7 f) E    // 时间基准配置
! L  d: p$ z% e* m0 W    // 时钟配置2 @+ @9 ]' N, q% {
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);. R& y" m4 h3 e% C8 v+ ]

7 t# n% H$ a' L    // 配置周期
. L! D. z, {! X$ U    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
. m- E, K  K) e* _  j                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);% P* u8 W7 @) f- e9 Q
) S- A/ }. H* n
    // 禁用输入同步信号: D% h3 I/ j. I3 O9 s
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
' R7 }7 O. A1 T+ R1 p. M, _/ d# D" b/ v+ e) i
    // 禁用输出同步信号; ?* o" P: c2 d
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
( b+ c5 X2 G  K+ A# S( d3 J, Z# a& @0 g/ w4 z- V3 ~2 x
    // 仿真(DEBUG)模式行为配置
4 @) {9 k8 l& t    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
: A- V0 g  ]$ ~$ q" y
1 |" l8 {; t) y6 J# W' l! S    // 配置计数比较器子模块) a; f; O# l) L
    // 加载比较器 A 值% u6 ?8 |) i7 c- q
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,% T# n& \, F5 C, ~* S' _2 y0 |9 H. ^: p
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);, A* _8 G# w  s7 o/ d8 Y
; }, C) B2 S' t5 \) P2 z
    // 加载比较器 B 值, u" w: [* X9 [# g, h
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
, A( w4 h# e" {) k% f1 }4 M% T                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
& S( ?; N4 I. R0 N  q9 W5 I: F) w% I* J7 `! p; U/ s- \/ X
    // 功能限定配置(输出引脚触发方式设定)+ R9 E. ?, ^6 @! r$ G
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出7 b2 a7 S! E$ I) N- G" n: T* W
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
7 O) I  g3 x& m                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,0 D; Q( i! v6 J( N4 ?: N, |
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
! _1 a, Y" U) g6 J% D- J8 ^) Z& s0 Z5 S! K, D! d& u/ U
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
5 K* b% b! h; i4 b    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);: i; b1 z9 @! I' [0 ]0 O; |
$ l% S2 N) R& S. }
    // 禁用斩波子模块
# k' o# R' R; w' y" o5 k& y& m0 X    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
9 _5 m, @# Y% r: x
4 N8 `+ q7 L" z) S+ \0 L    // 禁用错误控制事件
9 z" ?- B+ l0 u5 g/ Q" K    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);6 \, N3 G3 `& w8 }3 F
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
) C. ?4 `" Q  |) ?: X9 b" R" q9 f, R  j
    // 事件触发配置
9 T, h2 q* {( Z9 q& |8 e; ^    // 每三次事件发生产生中断
) A. |# u' v1 m8 B( y1 G. a" t' L    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);1 U8 J& e& k6 c
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
0 }8 s8 g' R& K    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
5 l/ d) J4 @6 o% }3 ~$ F; J    // 使能中断. S3 f, h! b4 ]2 F( {, B) g# I
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);2 d4 s) q+ D% ~4 D8 n
/ ?7 D1 p: J; g8 l) q0 ^+ H
    // 禁用高精度子模块
4 b& V9 Q4 t6 v; O+ t7 k    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
/ f2 i/ _8 ?) w; r' r0 m/ I- F# m3 H; S  ~% j
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
3 S! z1 O1 j: @4 S6 x# ]}3 S1 H2 G/ ]8 k7 F6 M5 `6 g

6 E$ Y7 f6 l0 }, Cvoid ChopperWaveform(void)
. o& k' f4 e# o# c{
( ]. h2 d3 C" ^: [    // 50% 占空比
2 `  q8 R4 X, z, w- c5 m    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);+ `+ x, H" v2 l+ k
    // 4 分频
7 Z  Q* d* F& P3 j    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
* M* ]* ~: A1 T7 ?    // 单个脉冲宽度
& O1 `. Q5 l) @$ m% _  r3 u1 c    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
' c5 {) C& Q* c. D* Q! e- r/ b" A8 l    // 使能斩波子模块
5 n, z; O9 a, }# s/ S; X2 l    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);; k5 O1 D: K. e; }
}
) S4 j" W' I  s5 {7 G" h  Y" ]: H7 \/ H2 i  t% C. \
/****************************************************************************/" b# U# B; t7 i# Z9 e: w
/*                                                                          */
2 ~1 i& E7 N  @- Y* C9 I/*              PWM 中断初始化                                              */
- Y8 s/ r& A; d: K8 e/*                                                                          */( x' k0 o9 R& U/ ?. R0 {  y
/****************************************************************************/6 Q' o6 }, m% `" ~! ~. `
void PWMInterruptInit(void)
- o9 Z" O# d' ~% I& o. N. W3 F& w, F( o{
( {1 G, k; `5 u. E# W        // 注册中断服务函数1 ^- [) G+ ?  }1 I& W7 r
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);7 V9 c! ?% m  h+ U9 k
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);% i( a. @/ C' G+ M9 j

5 ]8 s+ ]! |( p        // 映射中断5 p6 N( S4 Z: V2 y! j
        IntChannelSet(SYS_INT_EHRPWM1, 2);
4 U2 P* D# I9 a$ ]0 t        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);/ z4 O) O' U) [" \! t  G  {
6 M: Z5 O* t  S2 `. E% p
        // 使能中断
' |/ T/ D, }9 N! A        IntSystemEnable(SYS_INT_EHRPWM1);4 q9 X. I  l, D# H/ J
        IntSystemEnable(SYS_INT_EHRPWM1TZ);
$ E: R* p  a) v3 ?0 D}
5 r' U3 d+ W- J- g4 H. y- e/ f( R' q
/****************************************************************************/3 Q. a0 S; {; X0 o9 E. M6 H; F
/*                                                                          */; l# R8 B* P9 \6 b7 W0 p6 c
/*              ARM 中断初始化                                              */; i( ]% Z) b7 o4 R" @
/*                                                                          */
* y# h4 Q, d7 q  b) _, L/****************************************************************************/
! _  H8 J4 Q$ X* A( p! l( Z1 Bvoid InterruptInit(void): f+ k6 M4 ~2 Z4 ?
{* i' P. ^2 q3 a; ~' s( A& \0 r
        // 初始化 ARM 中断控制器9 S) I/ F* z& q3 Z6 M: O
        IntAINTCInit();
6 o% F( e: ?9 A, w% L
! A; x  X9 G- O6 s3 O' U        // 使能 IRQ(CPSR)
+ n2 N. h+ T$ D6 f: d9 q& `3 h* d        IntMasterIRQEnable();: X4 L3 f; f- ~; s$ `
# j( z$ Y- y( T/ m/ h, [  ^0 g) m
        // 使能中断(AINTC GER)0 Z5 q& m0 j9 t/ p; O  m! t' W
        IntGlobalEnable();7 M) H: _0 V3 O: g7 K8 l% f
% ]4 O# G2 O5 }9 I5 ~
        // 使能中断(AINTC HIER)
7 n" \4 ^$ w# u/ E) t        IntIRQEnable();7 N6 w" V6 J% Y. }& [6 }
}
# B! }% l! ~0 c& Y0 Z
2 v+ I( w+ w9 i0 Z2 {* y8 x
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/
# {$ S  z: p* Z$ ~# ]/*                                                                          */' n2 D# h- U( K
/*              中断服务函数                                                */+ h3 o  F: K! z
/*                                                                          */0 }: H& `8 B  I* I" h5 y
/****************************************************************************/% K% E/ l% ?' O- c7 ~2 X3 `/ B
void PWMEventIsr(void)
+ |" R! g) f8 c8 h( S{7 b/ a1 E) b  D; f- @* M. i
        IntSystemStatusClear(SYS_INT_EHRPWM1);
/ j4 a" I  |$ V9 H
2 u" ^& M7 @" y( T' \    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);' K* v3 t! t( w: d, S: I
}9 _& y, Z1 U6 j0 H2 o) T; n
2 I5 {* a( |$ \; b: W
void PWMTZIsr(void)
. ?) y% S2 T: O( K{
0 o$ B" ^7 G2 \1 c/ n. o; I" Z+ w        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);3 P& ?- c9 t# p/ A! V
8 l! W0 e  \# t8 m+ s6 F
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);/ o9 }/ W. t. Z# d  |' K
}5 c: k; R' K; b
/ f5 Q6 w$ v% o: n& H$ s  k
/****************************************************************************/: O; c4 \% L/ ?. m- \8 v4 X$ o
/*                                                                          */: T. _3 Y$ m# B% Z
/*              初始化捕获模块                                              */3 V: ]& i  @. `3 z2 T+ F
/*                                                                          */& W# M$ R! q: P2 u1 L
/****************************************************************************/
7 ?0 q+ `/ \$ q$ P2 ?, |void ECAPInit(void)
- Q9 W/ A! S1 O9 E& k& p{
4 L% W7 C1 d7 w1 h; ?) G) [        /*-----设置 ECCTL1-----*/( R  H/ k/ w- O
        // 使能CAP寄存器装载
0 _; i& F. {! r. y; q" x, i        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);) ?8 R1 b1 I6 ]& l4 N. }* [
        // 设置预分频值.
' ]/ z) k0 D3 B        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);* C' ]7 Y$ ^! F7 M  R8 ?
        // 上升沿触发捕获事件
2 p8 c/ f- W. O5 {, H( Q        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);0 q" d( s5 k# I+ C2 |9 J* U
        // 输入捕获后重新装载计数器值.% G  K4 @! G0 d2 ?7 ~
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
  P: b' l  ~- Y) ]) N) {) s2 h4 O0 |
        /*-----设置 ECCTL2-----*/
: ]7 _+ M- p3 J9 P0 q' l8 n        // 连续模式
8 K0 f2 ]% U$ g4 g9 l. v        ECAPContinousModeConfig(SOC_ECAP_2_REGS);* I; y: T# }. K5 Z% k6 o
        // ECAP计数器TSCTR持续计数
( ~7 k/ G/ d7 p3 _5 `5 _0 ~" l        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
1 t. z5 {9 ~$ ^9 R; C. U9 _        // 禁用同步输出和同步输入
5 w) s5 P0 @# q9 y, i" Q! g        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
3 F  ]9 f" v1 K5 I$ r( r% ^        // 配置 ECAP 2 为 CAPTURE 模式- v# p7 G$ @5 j
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
( X' S/ w1 E+ i0 j1 l1 U, l( N! O) U
        // 使能中断- _) J. @/ {4 h
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
( B* v  ^) B7 A3 d5 C6 `* F+ }5 x8 u}
7 k4 Z1 ^0 H9 q6 K$ g4 m- B+ F2 H2 s& u
/****************************************************************************/
: q- t' f5 V: G* Z/*                                                                          */3 X; i# m: o1 t7 Q. b
/*              取得捕获结果                                                */
5 M6 D3 R; D  a) R2 V' V* n/*                                                                          */
2 m6 `2 L9 @. t0 J' X8 N/****************************************************************************/, h2 y* C: Q9 {( ^
unsigned int ECAPRead(void)% w5 `- J5 @$ [( Y5 W9 ]
{
+ C6 M' A( W% l, ^. R        unsigned int capvalue;
8 j4 p% p" [6 _, ^6 w        unsigned long frequency;
! X* W0 A6 E8 c, @: c9 C% N
  t+ S' {5 x! _9 ~' j/ W        // Event1 中断标志
+ c% U- v  ?# _& ~        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))$ x3 Z4 C4 p& v7 s* F4 r
        {
$ O, Z* ]- f  Y, n3 Y                // 取得捕获计数" F/ U+ \2 m' c2 h
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);, C, Q" t/ B' q, c! e% y0 o
                capvalue = ECAPResult.cap1;
% {" T; y. ^% E0 f
7 y5 K6 o: |7 e5 `, S                // CAPTRUE 模块 228M 时钟主频
: K8 q% n, s8 s. E                frequency  =  228000000/capvalue;2 X# `- E1 ^* Z: F( H
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);0 t, o8 C+ e: ?0 Q  {: _

/ Y; [- X! k( p+ C2 d                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);0 |# [- b9 l- n" `
//                IntEventClear(SYS_INT_ECAP2);
; v; t6 o- B; L+ N0 B! q        }
1 Z- c; p8 r+ `6 {        return frequency;+ f2 L4 e0 Q* k6 j+ F% E, a  f
}
% C8 {: i# W1 j: k
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。" N& G3 Y) y) E7 E3 T' ~
[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