嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
8 U$ c$ w0 p7 M3 h& S
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/5 V' A) [5 ]' s4 k' \4 Q2 {- K
/*                                                                          */% C; r0 i( s3 `, f/ Q9 y
/*              宏定义                                                      */
- `6 L2 f5 f0 s9 a0 e/*                                                                          */
' U# Y! N5 K) T! l& B. W: J6 P; v/****************************************************************************/# s% B+ ?- ]" i5 D* x
// 软件断点  w* P7 |* [4 `9 u% k, [/ M3 o! t
#define SW_BREAKPOINT     asm(" SWBP 0 ");9 p5 a8 ^2 n: C7 O( K" U& d

' \" }  ?7 @& ?3 i8 a7 ~$ L( v// 时钟分频
2 P, Q! G0 E' f/ Q#define CLOCK_DIV_VAL     228, f( s* p8 C2 d0 X
' z7 z5 w: ~$ J+ k9 h0 I
/****************************************************************************/+ R. E* Z/ {( h1 Z
/*                                                                          */
; @% p7 E7 c& k6 V: C6 {/*              全局变量                                                    */
( T. J. p" P( s7 C8 Y8 T& a/*                                                                          */. n: {# T; x- P, E
/****************************************************************************/" W! N8 a& L0 h( ?
ECAPCONTEXT ECAPResult;( \7 H5 p# Q7 J1 l0 O8 M5 n

- \# D. M6 U) r8 r/****************************************************************************/4 T) O* p% s9 o1 I  P
/*                                                                          */; L! w) F& R, H" i8 x  T! t* H
/*              函数声明                                                    */
8 h( p( z, |0 L* ~/*                                                                          */" J# ]7 n! H0 F  x* l% @, }7 O8 Z
/****************************************************************************/# B  R" q# R9 E- d7 I7 P
// 外设使能配置4 \- ^6 t: Y4 D9 `
void PSCInit(void);
' c# \; x2 d3 f2 Z! z( w, w1 l0 j* t9 J$ h" h0 n+ I4 i: d" ?; _& X
// GPIO 管脚复用配置% o: e' E  [5 H. _& V! `
void GPIOBankPinMuxSet();: k3 a. b# {/ u9 o
& t0 q0 A, @5 J4 l  n
// 产生波形8 T* l% f* r0 a* e& A3 U
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
+ }/ E2 S( D) m0 Y2 K6 H, p9 cvoid ChopperWaveform(void);9 V( u$ \/ @0 q; `& t4 e9 K7 T
& W" h0 g" z4 B9 i1 T" t; F
// ECAP初始化和读函数
0 ]  R  A! E/ X# nvoid ECAPInit(void);: d+ u5 q$ T# Z9 F
unsigned int ECAPRead(void);5 W) E. f1 Y( ^+ Y, h3 R
6 P$ e/ _4 d7 m0 V# P
//ARM 中断初始化4 ?8 O# u- b+ y5 C" k
void InterruptInit(void);6 u& V* h# \" ~# w0 ^
7 D% U, r3 Y7 X, b; V+ ^  w
// PWM 中断初始化
$ f: a: \" m& a8 Ovoid PWMInterruptInit(void);' _7 ]- ~- h3 G
// 中断服务函数
" V; c" W2 r: @% s% z) `// PWM 事件9 @, p/ S. c  E$ J6 |" x! g; l
void PWMEventIsr(void);
0 t# C6 p0 \" ^// PWM 错误控制事件. Y# _) p5 o5 z6 w, i' \
void PWMTZIsr(void);
/ v2 j' d) |0 y+ D2 ~. U
$ N, a3 q# G/ P. N5 u/****************************************************************************/
# G2 K# l5 g2 b1 J/*                                                                          */- c/ Q0 j+ V1 v, m3 P) [% C2 G: F
/*              主函数                                                      */
8 A9 E! N3 r0 k& V. }1 i& C. E/*                                                                          */( B' }  X; Q. U' h( W, H
/****************************************************************************/+ ^7 l( }; }; _& K
int main(void)) T  |" Z+ k' _" z3 I$ x% O7 h
{; g0 M. u  s( j' I+ I, h
        // 外设使能配置( ~' I# Y/ @% ^  M
        PSCInit();
% L' W8 z8 b' e/ U) x) w3 {/ u$ W5 E: e: [
        // 初始化串口终端 使用串口2
6 t  h5 q( i- I% a0 ]; C        UARTStdioInit();% Q# ~& [" c" c. \
        4 {; J; e. _! j* J0 G
        // GPIO 管脚复用配置
' z3 D7 ?: d2 O1 I  Q* ?5 q# T" R0 n        GPIOBankPinMuxSet();$ _0 b- }$ ?# X  d' ?( t/ d. k; l
& v! v9 |+ n4 R( ~5 T+ s; _
        // ARM 中断初始化3 \9 V* p2 R* r5 B; o! e
        InterruptInit();. f) p; u6 E9 A* q0 M& g' w

3 c8 [, d6 j8 _        // PWM 中断初始化; S3 ?) N: x$ g
        PWMInterruptInit();
* S- n, Q! P2 G
8 w. q. Q2 H0 N+ m! }1 H        unsigned char i;2 E! \; {3 w2 t! d. y% B& [9 M
        unsigned int j;1 i( D9 ?* u) B  ]  e
- h7 E* M! s3 h! F( d3 G
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);, m) \6 l  w( l6 m2 L" A+ H
        UARTPuts("------------------------------------------------------------\r\n", -1);
6 t$ I. W7 O4 P2 H+ ~( B7 H! n: o/ l        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
, J- d9 a& l$ j; V" b3 |        // 产生波形/ y! l: n+ p, z$ l& c
        PWM1ABasic(25000,50);: P  `# g; B5 _/ ~8 E) \& Q
+ ?+ J! B$ t  Y7 S# I4 n
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);# w# ~( j+ K  K# `2 r; y9 k& G
        UARTPuts("------------------------------------------------------------\r\n", -1);
* [( o1 R9 c$ G: {8 V! S, z4 b* ~
- G; |8 \& w4 c% x6 F) n
: j  Z8 N9 \- [: r+ y
        UARTPuts("------------------------------------------------------------\r\n", -1);8 S# f: e0 _, R3 S
        UARTPuts("                    C6748 ECAP Test\r\n", -1);7 g! F  P3 q# T& T! K  o$ {" f
        // ECAP 捕获初始化, R) ^" s. t: R: R- |
        ECAPInit();
, b  s& n( R7 t  `1 s        UARTPuts("Initialize ECAP.......\r\n",-1);
% @- [) Y# L; {+ }3 |8 P! Y6 F1 d/ k        for(i=0;i<5;i++)6 Y# {( T  b5 V5 H* _1 C2 ]  w
        {) d2 Q( j3 f2 |9 y/ q" q
                    for(j=0x00FFFFFF;j>0;j--);            // 延时
9 q# R& }2 o# p, ^1 l; b                    ECAPRead();% D! N& s2 C0 I" F: U
        }/ d! [- u) \3 E! a! q. c2 K
        UARTPuts("\r\n",-1);- l3 P0 l' B, S5 O
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);! x4 Q- s' j# l8 Q1 d
        UARTPuts("------------------------------------------------------------\r\n", -1);$ B" f0 M5 X) B4 p

$ g; e% w2 J3 m0 s# y, _        // 主循环
1 K& v, w- a0 e9 s+ b$ `' d- L        for(;;)+ t3 N" R$ _" c: }% b" R
        {2 T) c* L3 r' O$ l

- D5 b9 q% T* p  x2 l/ F3 Q        }
/ Q9 W6 c; @% A8 K: I}8 d/ n1 l+ [5 X; e' K7 V& Q

  d: e; L' j! R9 c/****************************************************************************/
) v- q% o* K/ m$ F/*                                                                          */
" _+ @& l/ T. w1 n2 m/*              PSC 初始化                                                  */
" [8 z; |6 \1 Y  y$ D& a/*                                                                          */
* f( U: T/ X+ I# ]' P/****************************************************************************/
6 i2 I0 o# q# `, R* g- W: R3 A8 Cvoid PSCInit(void)  q* L+ `% N* M1 l1 F; R9 o
{
6 R! y8 Z. @2 u# `+ o% L        // 使能  EHRPWM 和 ECAP 模块
9 @) _4 |  i0 |        // 对相应外设模块的使能也可以在 BootLoader 中完成5 n1 E) w, `9 }) J8 [2 V
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);- k& O  B7 d/ ]& \3 I
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
# Y6 I/ `$ [9 q: H' A$ T* t}
- q2 h4 s. I1 H- T4 X7 w; L; V' `7 L+ _0 x
/****************************************************************************/
5 e" u4 q* O$ C8 g5 z( I7 u$ j/ ^  P/*                                                                          */* C' C. G0 H2 t/ l' U2 b& d
/*              GPIO 管脚复用配置                                           */% P$ n( N0 Z4 e; M# ^
/*                                                                          */2 w2 ]/ i1 i% e) H
/****************************************************************************/
$ t1 O9 ^, U; tvoid GPIOBankPinMuxSet(void)$ {/ o3 c  C" v4 W1 L  M. B9 `
{
( u/ ^. V( g* R) N! d/ g1 m        EHRPWM1PinMuxSetup();! e7 x: i: g6 N  y: ^
8 t9 }9 y% a- B% L. v9 m# k
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
! y! z' b7 y9 F0 ^% {+ G        // 作为捕获功能时管脚方向为输入4 g1 [( L( u1 c8 i; M
        // 作为辅助脉宽调制时管脚方向为输出
0 L  D1 i) I4 b, |* `* \    // ECAP2 / APWM28 |7 h( r5 q. n5 u
        ECAPPinMuxSetup(2);- Y' d( X; B" `( K
7 Z* i# G; {# A
        // ECAP2 / APWM2方向设置为输入
$ K! b+ p! M, d, y# y6 r        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
1 ]; X2 ]) l9 c5 g4 H}; t$ a& b2 g# w8 `* ^1 r

& n7 m# ~8 e/ T- S/****************************************************************************/
/ [+ i+ D: u3 ~# L9 L, N$ ]/*                                                                          */4 c" }! f! Y  `$ E1 g: t
/*              PWM 输出波形                                                */: L2 I! ^$ ?% A5 `7 s
/*                                                                          */0 G4 B! y  [& U# S- z
/****************************************************************************/
) S' T& P4 L% ?; S4 ovoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
. I# I* M% x  ?$ E{: {0 T& V& S2 g& m9 ^; h
    // 时间基准配置
/ R8 Y% I/ ?1 s& B3 G4 w' U    // 时钟配置
1 r4 I1 Y- u: g$ O3 x    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);1 w0 ]- h7 A7 m& {" [, Q% R6 r

6 E: B5 J' r2 B6 o: J& q    // 配置周期
5 o+ }( {7 @7 k( Q% w    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,! {7 k3 E- u( c
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
4 [' K9 \- K7 g6 P
# U( t5 X( R& m5 w8 _& v    // 禁用输入同步信号
; P/ z3 \' H8 T8 I6 {% Z2 x# L0 i    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);! p2 Z0 Q- f0 l0 O

) e0 X% d3 r$ ~# w7 _! {    // 禁用输出同步信号
+ {# I7 t" w4 B7 I& U  J    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);/ ~. R6 x' N& w$ q8 K
$ N+ z2 S; Q$ h% j
    // 仿真(DEBUG)模式行为配置2 n8 [. `- f- R6 l% R$ ]
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);; K2 w7 t- r! {0 j

9 e# M' F! I) r9 h$ @# r    // 配置计数比较器子模块# V7 o! x& T; E0 K
    // 加载比较器 A 值/ O7 ?6 u+ F& P' X
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
% i- s0 A3 M. ^9 \# I9 O0 _                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);% t; E( U* N. b3 `) y1 M
6 ^3 c. H5 O0 \" B2 L2 }" C
    // 加载比较器 B 值6 n* }# [) F4 ^0 B( }2 }
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
2 g4 A2 N3 _$ f3 E8 r% o& M3 g+ x6 M                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
* y  ]% b+ }2 W5 z1 o' x' @0 Q
# B* |0 j) Z; m; I4 I4 ~    // 功能限定配置(输出引脚触发方式设定)
4 [& I- J5 e8 T  i4 i    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出- J+ `& X- j" @7 [! T- |8 w
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
' i  `! f* G9 q+ E4 h& e+ E$ b                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
1 C! s2 e. p* u6 N* X; h, r/ k7 `/ Q                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
3 S) P# V8 m# G6 J1 Y0 Y
, T% ~0 y3 }/ Q* a    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
( n0 D/ a& V6 v$ e  K$ e    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);2 d% D; y3 i% n3 p1 p- c! y
2 s  N. d( e  w/ Y
    // 禁用斩波子模块
( U; h1 M& ]7 `5 u1 C7 H/ \    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);+ N* K( i- P0 `& M0 J
% p0 C+ X8 v3 |
    // 禁用错误控制事件
7 d! b- K2 i5 O" @    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);" b4 T( L! r' h6 b6 y# v9 S. D
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);% I) l9 P8 d+ P0 d

+ H2 `! @4 [0 n& z. o/ S    // 事件触发配置/ c, f/ F9 I. W! H2 X9 O
    // 每三次事件发生产生中断
$ n5 ?4 ^$ B2 _% V( f% K    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);+ r4 O# q6 x! a  ]9 t
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
' D# v# I5 p" K  {' _" }    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);, }+ c% k& y( s# W
    // 使能中断1 m' a; @# U* F: @, H) v5 S2 K7 b8 i
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
. m0 F* [, ?2 L+ H) e! p7 b8 g1 I) |# B( `  y$ b: s3 R
    // 禁用高精度子模块
- [1 i( u# n% w    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
* n3 P5 Q1 v; y
( ^6 U3 ^3 x8 W3 p3 J6 d    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
( a& |/ o% Q. i. h# n$ W}! w. W/ c' x& h8 a& x+ J  `- \, \
6 @" g0 n3 ?( _, \% W3 J5 u$ |
void ChopperWaveform(void)( T; A% }% M+ }& U
{! y) d. Q/ C" g2 l/ V, [
    // 50% 占空比
- }, Z6 S- {6 {: B- {1 G6 p    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);1 T# S% a, G- N; P7 M
    // 4 分频; w9 S0 x( x- P
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);+ }; l/ q3 ?5 i' \, V' v
    // 单个脉冲宽度
* T- O$ U0 q* h8 o( I! R( I/ J7 F    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);/ H* d2 j) y3 m3 i2 s  ~! g3 V
    // 使能斩波子模块
6 {( P8 C! P, X) v) N( L4 y! p    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
; T4 ?$ h- @% k5 t- O0 ~}. y6 f( p0 `+ F4 p& s

, u( t& r! ]; o9 C, m) _/****************************************************************************/
% ?/ G& Z9 n6 H; w/*                                                                          */* \. N; h/ c9 _+ O$ |
/*              PWM 中断初始化                                              */
% {% v0 ^  w9 d3 b1 Y) h3 n: x/*                                                                          */) _4 n! t. x% X5 O
/****************************************************************************/$ p1 L; h" \2 B' I
void PWMInterruptInit(void)
, ]0 i1 l! a, L" [4 c3 S. {{/ R6 \( M' `. ^; w
        // 注册中断服务函数4 K- R! @6 c# z1 g; T
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);" M- D. C3 p- ?
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
  d. ?* I$ p: O" T* a7 j0 r0 t2 j, R, R# \& h
        // 映射中断
! ?( F; s3 g4 ^5 o9 _! d        IntChannelSet(SYS_INT_EHRPWM1, 2);
3 T8 a- ]9 U- q8 G% A$ ]        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
: p9 j0 a7 X3 z) C1 Y7 |
4 ?" `+ g7 ?0 _; P% V        // 使能中断& O# X3 u9 ^* r4 Y! ]1 R3 y; R; }
        IntSystemEnable(SYS_INT_EHRPWM1);
" W& `, n, B, o+ ^5 l! E        IntSystemEnable(SYS_INT_EHRPWM1TZ);5 Z5 ]) p* c8 M4 B  J) o( U: G" W
}; _' I+ ^" y# m

5 c% n  a" \+ o$ @" X7 C# ~4 p/****************************************************************************/7 H/ u% Z! j0 D' i3 B6 ]
/*                                                                          */
- L% ]' E. {: y% `) `; B. w/*              ARM 中断初始化                                              */
* e9 e1 o, B' R9 U/*                                                                          */0 g/ U0 f7 i, g4 V
/****************************************************************************/  v9 T$ v( w2 q/ h) X
void InterruptInit(void); M; P6 U5 c1 O" l. c
{/ {+ L+ i+ K1 Q8 A# e
        // 初始化 ARM 中断控制器
) v/ A2 d4 T  A7 u7 M9 @4 d        IntAINTCInit();; w7 u$ {& q" A# s  v, S

+ U3 ~6 J6 Z& r        // 使能 IRQ(CPSR)4 S# q4 g' Z! N
        IntMasterIRQEnable();
+ d% F& j" f9 @! {0 d
1 Q8 C5 |, ~: ?5 Z. Z2 `  @        // 使能中断(AINTC GER)- Q2 N- ^+ D" B" _- C' j7 ~" F" k
        IntGlobalEnable();
& R9 C' X7 Y9 l* v
. v  h2 L! c9 Z: I        // 使能中断(AINTC HIER), `% K; W/ s+ Z' n
        IntIRQEnable();
) H% F3 c+ Q) q: b8 i4 `- s}
9 i6 I) f( ?; G
* E$ a: @$ o* e
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/; ~. y* Q$ j; X. J
/*                                                                          */
0 Z* z) p8 a+ W- m. a1 [9 ?2 `/*              中断服务函数                                                */
. B& r; j* C: _9 N( M* A  l/*                                                                          */
' u% d0 w  c3 K1 s/****************************************************************************/. I# G! E- _" \, @8 \' ?/ _' C5 K
void PWMEventIsr(void)
: L3 j. m- E7 s+ W- U0 d8 b; _3 \{: X. K! J# K$ G
        IntSystemStatusClear(SYS_INT_EHRPWM1);
- P$ a% l' |* c) T0 j( ?2 K9 y6 o
- q8 ?; d7 x" s. N# Y, h+ T% T% s) r    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);' O+ u1 x2 n: \8 u$ R% U
}
: k4 N$ r4 f4 j) N$ t3 i
9 Q$ ^3 g) I0 i) hvoid PWMTZIsr(void)
  q; S( p% s" m* |" K& j$ p{
2 o, f# R3 ]/ l" ], l        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
! B0 z. C9 n+ r. _: g# v8 |3 f& b9 M+ M/ P2 b0 @7 _+ {
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);1 G% D5 x7 N, _/ k
}2 ]. {' K: r+ l# B0 ?* r5 ?; E* V

. B6 n. x. o0 a& l8 g$ D6 |/****************************************************************************/
7 x2 e( K: w7 H3 o( E/*                                                                          */3 o! j* F7 p: }  E
/*              初始化捕获模块                                              */
3 E6 q( _7 U: {8 @, A5 d/*                                                                          */
4 `# O+ t: b7 W, v( T- F/****************************************************************************/$ X) x0 {0 A4 H, N! C8 i! b- h
void ECAPInit(void)% p2 n0 \1 U) v0 J/ m4 {0 e  I
{$ @# o+ c0 X5 t; u' p
        /*-----设置 ECCTL1-----*/! F2 s% G) r+ E( b  `2 q) {+ k4 S
        // 使能CAP寄存器装载
6 ?& D1 M% N& g* z2 J        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);  ~. F2 t( U- m5 [, r
        // 设置预分频值.. s. i+ J1 s/ g! N% Q
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);% N$ l! M5 g" r9 I
        // 上升沿触发捕获事件& U- a  N+ p0 o5 Q& V
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);- v0 K2 q2 q; h5 o; e6 D! m
        // 输入捕获后重新装载计数器值.9 ~" L9 D9 }0 k) o3 e& ^
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);3 I2 o: J& Z5 t0 g: I' ~
+ p5 N; t! z4 g
        /*-----设置 ECCTL2-----*/
3 Z5 p  s# B- J, I        // 连续模式# |  G8 k; o$ s
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
# C% ~+ W! p/ h6 A9 K        // ECAP计数器TSCTR持续计数4 y" {/ M' ~* g; m
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);+ ]. `# P/ j) ~8 }) J
        // 禁用同步输出和同步输入
! |% y  ]2 I9 ^! c% c        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);5 p/ D$ x. x5 d( D3 a
        // 配置 ECAP 2 为 CAPTURE 模式
/ U) N  R7 J' J1 N        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
/ }# h2 M/ ~0 [+ W% ^0 R) k3 ^
/ j9 e0 s) t3 P0 m- Q: s0 p/ z        // 使能中断% N; k% _1 W$ y, O6 L! F
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);& D& F) ~, \. i* o: t# {' D0 l( F
}
3 q( r; h) b; B1 [6 H4 G; @
. Y( Q8 J/ }; I) u: T/****************************************************************************/5 b. ]( k7 d: ]
/*                                                                          */
) L" y; u2 s2 ?( P8 ?/*              取得捕获结果                                                */
; t  I4 @* [/ h% ?& |  N/*                                                                          */
' e/ S# P4 s% a5 l: h1 B: G/****************************************************************************/: R) g+ F& o$ U6 e
unsigned int ECAPRead(void)
* n9 ^& L0 [& Q6 c9 [{+ Y6 h1 t+ n4 b0 x" E: B8 s
        unsigned int capvalue;" ?& l2 ^6 z% P( _: [8 b
        unsigned long frequency;% f" e4 O5 h+ I" S$ @) U& ?2 Y
+ S7 Q: s0 Y  R% y4 a7 H- R. ?
        // Event1 中断标志
3 r8 y4 V" T" f+ ]( v: c5 f        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))2 l1 |7 r" F3 G  m4 v. g
        {
, X+ J7 W# g7 Q5 w4 `5 F                // 取得捕获计数. i" A+ v! c2 D5 d
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
6 i/ |4 W6 j0 t3 y- D! M                capvalue = ECAPResult.cap1;
5 E9 K- C: x* R+ o; s
' I+ r! P, i- y7 }: f6 U                // CAPTRUE 模块 228M 时钟主频
9 M/ u7 R- N7 j                frequency  =  228000000/capvalue;
8 X' O% B& A/ B# z                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);1 h. \0 t1 A5 g; [# A( e# `7 h
1 ^: o# r9 \: P( V0 F' S' z
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);' W  U, K; i- Z7 H
//                IntEventClear(SYS_INT_ECAP2);) \$ O! }* ]* s4 L0 E: U2 m4 \: x3 F& {
        }
9 h8 n% l( k2 j' o( Y( H        return frequency;
% r. v5 S* p4 T4 ]; G}
3 g$ ?; D" k( c; z
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
+ N% p: L  O, V) `( 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