嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
( r( c! c9 z8 ]' a3 [! e9 y, f
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/3 U. T/ \+ _+ S! y6 C+ Z. M& Q
/*                                                                          */
; \2 e; Y- Q, f* o; W/*              宏定义                                                      */
! W1 n! ]; C6 ~. S0 M/*                                                                          */+ l  e+ M2 ~2 f- f3 k
/****************************************************************************/
3 R2 u  H' r  p+ {8 v// 软件断点, r/ G- y! A+ _4 e& N, ]- ~, J
#define SW_BREAKPOINT     asm(" SWBP 0 ");4 c& Y! j' X. @

" E$ g8 r" m! m! l$ p8 h, C. e// 时钟分频; E" P( v0 Z1 N1 T
#define CLOCK_DIV_VAL     228" _% |, y0 r4 ?2 s' u2 d" H7 x
( H# u$ }0 F& H+ u, a3 ]# \
/****************************************************************************/
6 K8 a- M0 n8 X" }( m/*                                                                          */
! Q: b% O9 A0 g& H: T+ s/*              全局变量                                                    */
, O7 z4 h; l# t5 J/*                                                                          *// m# L# Q9 a1 q2 Y2 s: H$ b
/****************************************************************************/
$ z/ A# T+ V) @! ^2 g. }ECAPCONTEXT ECAPResult;
9 D4 ^  r. X  u: U8 c; T+ S
7 n$ u7 N- R+ n4 y& Q0 t9 u/****************************************************************************/$ ~" H  t; @# f8 l) D! b, O+ f& z
/*                                                                          */' t, ^& @. Y# g' E3 v
/*              函数声明                                                    */$ C# Y# K2 g9 T. j2 N- f# K
/*                                                                          */
3 k+ Y8 b, H' Q9 f! B/****************************************************************************/5 C! `, E$ o. H6 A
// 外设使能配置. e& i" Y7 H0 ^  y
void PSCInit(void);) U6 E+ s, f" `" c
/ \3 C; b* S( b( X. i' d: N' O
// GPIO 管脚复用配置3 W" L/ P5 l& }" ]4 P
void GPIOBankPinMuxSet();0 X1 V; A- }8 N3 k4 f

7 f7 B( L2 n$ i6 i8 b// 产生波形6 u# y* s) Q; o6 n, K) R7 ?$ @
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
% h+ C* b, r7 A; a$ Y0 ~% \" Kvoid ChopperWaveform(void);" H& R& f8 ^$ e- Y) M* C
2 ]* k% L7 H& h& L" K6 W6 c  m
// ECAP初始化和读函数
0 V/ ^- T, L& S# o: a9 @! g% ?void ECAPInit(void);
! S( f7 V  l& G, I' Q; {+ qunsigned int ECAPRead(void);
4 o( o, \. {* Q5 d1 _7 e' S" i' b* T! o1 j4 W- ~* [
//ARM 中断初始化0 ]  D. |& j/ D; `: {2 X5 w
void InterruptInit(void);2 l: z6 p5 N, Q0 D: k
7 V# a6 i$ }/ q$ j0 z. B
// PWM 中断初始化2 z( c* T7 v+ F, a) O
void PWMInterruptInit(void);
5 {' Z2 K# x  z' x5 \" @/ `3 Z4 m& E// 中断服务函数7 k; s$ e0 z; K" S" b9 U; x: |
// PWM 事件
, e, X8 v, G- a0 E- }void PWMEventIsr(void);
% e+ {7 F; V& w& d$ l7 z// PWM 错误控制事件( a0 L: q1 G+ f) c2 |3 H4 y
void PWMTZIsr(void);% L7 I5 c8 k& E- _! f- P
  _" i4 w! U5 K& q
/****************************************************************************// v2 u* V! [; @* b
/*                                                                          */+ a: q( I- }' K, T  r  H- s
/*              主函数                                                      */% |. M/ P) e- \( T: K9 x5 \
/*                                                                          */0 w  W4 Z' H, J* [* j% Q& i
/****************************************************************************/
% ~$ u" Q4 ~/ J* Qint main(void)5 l( }) N/ O3 {6 Q% l& c" }4 I1 B
{
' S8 n& j/ o2 x2 U1 I' S        // 外设使能配置, ~& s2 c9 p4 b5 F  O
        PSCInit();1 r; |) b1 D1 m- T
( d' M+ g, ^  o: d' g  F$ e0 @
        // 初始化串口终端 使用串口2
; Y( ?9 d  k5 A0 d8 P        UARTStdioInit();: i; \+ l2 Q' c, `. l
        + o# j* T+ z0 b' K7 A
        // GPIO 管脚复用配置
1 q, x1 |, m' k; S$ O2 W& E4 q( u        GPIOBankPinMuxSet();7 Z# G8 W+ s# H8 w- T

( [' g" G4 u: I& ~+ Q        // ARM 中断初始化$ n, ~7 _* R% ?
        InterruptInit();
; Q5 Z8 H4 O: s/ e, h" Q$ r3 Z3 Z$ H; n* R. C
        // PWM 中断初始化
' `/ g0 b. Y  q        PWMInterruptInit();5 U* [9 ?& y& i( l) N
: R8 D1 F& V2 b# n) ?; y
        unsigned char i;
2 p2 k2 |) \5 F: o( u' J        unsigned int j;
& ~. |  i. U( x0 o3 R, b, `: b1 {
' h+ c. q$ ]. Z, z% O$ H& b) R! [        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
+ n) E& P  E9 H- M+ [- O: u        UARTPuts("------------------------------------------------------------\r\n", -1);3 R+ M9 V' t7 q$ {' W
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);' s: H) w7 w! s* {7 k0 X3 p7 d
        // 产生波形
' j  P! N8 x6 Z  g1 e* _0 S* @        PWM1ABasic(25000,50);! }! `2 f9 }; Z, P% O4 F

* ]5 m& f$ }/ t1 w5 ]        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
& D4 J' w) }( A8 Z& U, F. r2 u        UARTPuts("------------------------------------------------------------\r\n", -1);
* E8 |% Z  K) B. h# [  m1 Z5 _! r1 Y% q' j6 Y! G) M0 q! Y* n; y
" d9 L9 Q  b2 w# P4 d* ]! Z# r
1 t4 W$ o- \9 _6 s0 h: M6 [6 q
        UARTPuts("------------------------------------------------------------\r\n", -1);
4 P9 Y3 C" l/ \' y! \        UARTPuts("                    C6748 ECAP Test\r\n", -1);) c  c+ r3 _: T5 [5 Q4 W, h
        // ECAP 捕获初始化
2 t" Y% K/ [# ]9 V        ECAPInit();
* c' Q3 G/ ?# V% D        UARTPuts("Initialize ECAP.......\r\n",-1);/ w/ Y5 m3 z( w: H  t
        for(i=0;i<5;i++)$ p8 U2 n- w- A+ K8 T2 `
        {- R" _( M7 a% Z3 k: V- c
                    for(j=0x00FFFFFF;j>0;j--);            // 延时
8 x( O7 ]% h  n" b. O9 R                    ECAPRead();
8 e: N8 N9 P- ?( L        }/ m) l- `% q: s5 d
        UARTPuts("\r\n",-1);
4 v4 y' c. I" \+ A- w0 I        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
& b- Y7 _% ~* V& d8 n        UARTPuts("------------------------------------------------------------\r\n", -1);
# v' a2 P. f$ R3 f
& K# m( S! _  ?' d5 ^, J        // 主循环
& i. @) t4 D8 e/ ]/ D        for(;;)
& j, v5 h& E0 G( |2 w9 M        {
# O* I( P1 T/ }. k0 r( ~8 ]3 G" {9 C  L8 s2 @$ K
        }
- w+ D1 D% u* U}: v8 ]+ q! L: w1 D4 i1 Y7 u
2 c8 S# m$ i2 b" ^
/****************************************************************************/
2 ]# t# C5 x0 b/*                                                                          */
1 R+ m- _+ c0 d9 b8 S/*              PSC 初始化                                                  */
! D6 v: Y5 |2 ~; B% a( x! L9 Z/*                                                                          */
' F0 s: {: U8 ^; C+ W; x4 n9 T/****************************************************************************/
( b+ Z1 c# T% J: j* W( R4 e  wvoid PSCInit(void)* |) O# S/ r3 G1 o
{$ n0 |$ x7 k  t
        // 使能  EHRPWM 和 ECAP 模块; }. x) G0 v. D
        // 对相应外设模块的使能也可以在 BootLoader 中完成
, \" ~  e, D9 w* _4 \1 e1 I8 s    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);! l, _) q* o/ `) W# w0 ]4 H# i% G
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
. t; X) D; R0 P9 `. r& i& I/ ^7 o}& Z) ^5 B, W2 z
+ Z# v- i; w2 O1 ]! o+ H  G1 b. u
/****************************************************************************/
; V- @# i0 R7 d1 A" R8 y/*                                                                          */2 ~% p4 @( u5 D
/*              GPIO 管脚复用配置                                           */
4 T9 {) H# G" w* |( D# ]1 c+ M/ m/*                                                                          */0 l2 u: y3 N$ z& J
/****************************************************************************/
8 n2 o) P' n8 h' w" K& E6 Rvoid GPIOBankPinMuxSet(void)
& G) z$ @9 ]% }{
2 V: [4 b! {+ U/ ]+ S5 k        EHRPWM1PinMuxSetup();, ~% H+ a- x& M8 ^

  H5 Z8 ?1 \3 ]# W        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
; b4 j7 K( M; G" j- U7 M6 k+ O        // 作为捕获功能时管脚方向为输入3 |( `8 P. V  Z$ \# q
        // 作为辅助脉宽调制时管脚方向为输出& g9 ~! Y6 w/ e2 B$ p# Q( }( H$ ?
    // ECAP2 / APWM2# B* A7 ]% ~6 U. Q
        ECAPPinMuxSetup(2);
8 m1 g7 R7 z' E0 z7 a  T7 K0 m8 }+ q7 n
        // ECAP2 / APWM2方向设置为输入6 n! G6 ?1 E# J$ a
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]( r% g4 Z$ G( e7 ]7 k: {' L
}: r$ [6 p9 k- d
4 b) m; _! ?" ^  i$ u! R' \) X
/****************************************************************************/
& u, P- z2 ?' s2 ]* v; ^/*                                                                          */$ l) t8 k) X4 }( E3 g8 A2 ~! s
/*              PWM 输出波形                                                */
7 G4 |8 ~0 q$ @' ~+ x0 r/*                                                                          */  g& M( V7 Q) O; S
/****************************************************************************/
, b: L7 J* x' m; d/ Xvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio); n- D4 v1 _- _. {
{
5 b$ I8 \+ R% p    // 时间基准配置5 C$ l" c" t1 T3 {0 w0 v0 \
    // 时钟配置
$ P* o# D; s5 @% B- {    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
- j) B& G! [2 {' g6 y' P
( J2 e: ~9 N0 c, Y9 b0 ~. W    // 配置周期
1 G. W+ {& k. U2 d7 U/ Q% P    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,# d, V& m2 ^0 O6 ?
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
) ]5 ^- e* R, T, B: u
% b# u/ W( j; P9 v" a    // 禁用输入同步信号: F0 F) c; E* `
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);3 r8 `2 T5 m$ Y% [% b
* O: t6 q7 M2 D* y. s
    // 禁用输出同步信号7 ]" z$ {# ~% ^8 ~. h
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
6 V+ {1 D2 D* d. R  i$ E7 P; ?7 m9 |5 {3 b5 Y
    // 仿真(DEBUG)模式行为配置+ ]+ j0 e/ O* s* e
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
) N( i: j  [6 {! ?3 J
. d$ A  S/ B. p' R5 e# L    // 配置计数比较器子模块
$ ?1 y. j+ c2 M9 X+ q    // 加载比较器 A 值% |8 C' z" \. A( _$ B4 {
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
' L9 U" c* W, ~; F7 C. K8 n9 a% U. H                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
  A% m: h( G; M6 g# e5 }$ _8 e2 b! F( s( Z) v# q. D$ C
    // 加载比较器 B 值% x; \' Z* B6 c) a: C- R
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE," f. f  z) `" C- h. A+ z0 h0 I9 B
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
) `  K7 o$ t9 z. h# W
: D* v) d% Z: {8 h- _    // 功能限定配置(输出引脚触发方式设定); N% t% a" ]: z: ~& }( E* f! }
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出, V/ p) G' I& T- t
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
6 r6 r& A/ X. ^. B7 Q6 w3 D2 F                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
7 Q' e$ Q! d$ F# p1 r                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);4 z5 |7 T* B% {2 ]" r) I# ]2 s
/ P4 O3 r3 B  i$ }* a
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块" X9 W! e( `- l( U) q6 a3 j1 j6 ^
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);* T2 z- J8 c# l6 E  v# a" Q* A
& X: V. B! T8 w8 m
    // 禁用斩波子模块+ [4 a: a8 ^, @; ?% G
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);8 Q4 ^7 H6 L4 y( {1 E; b9 j
  l6 r( \8 d, u( U6 B+ U  j
    // 禁用错误控制事件
& a0 i3 a& W0 R1 o0 l9 W2 |    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
: X, i/ B8 J' u    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);* {8 w' |# |. q' Y9 Z

& W* l8 f- K0 ]  ?" F- n% z    // 事件触发配置
& p8 U. D5 \! N2 W# b) A  y) c' ?# t: M    // 每三次事件发生产生中断
6 z' G* \( D7 [- n% J9 e    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);4 e6 f9 _: f5 N2 h- {; k
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
4 p! C& i( ]2 L* V' B) K    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
7 u( U3 _6 {3 U  K- {- V- B    // 使能中断
* |7 j$ k) I& ~8 A( p- \! p    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
! z: i3 k& P9 F" S9 g
! i" g) l3 J5 P    // 禁用高精度子模块
7 L  ^6 a& W! _& u) N    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
4 w# S7 e0 K$ O7 ?  X+ @/ K9 g+ N; ]; ]5 _
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);& I; J8 P, @( o0 ^1 z
}$ G2 k1 C$ J  k2 b0 }! L
9 N/ w; _' N7 n
void ChopperWaveform(void)8 C/ J0 t: D4 o" ^3 f
{( `  t4 @4 Z! a3 c& d  P
    // 50% 占空比- j1 _2 r& {& @- B: b0 i
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
5 s+ b, F* K, G- {1 U    // 4 分频- E6 R! ]) c6 ^/ j) M! J
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
, Q- y' b) ^$ k) J, ^* T    // 单个脉冲宽度
- _, r9 _- ^2 \; ~    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);# v4 s0 k3 }% A. t6 q6 k* ?
    // 使能斩波子模块
9 f% J. x( |' `/ J, P0 [    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);0 p, E  V- _  K/ K2 d8 I% W
}1 x# C/ b0 K% o
1 m+ U/ ~6 o7 u
/****************************************************************************/
, y# l( D$ G3 J( K' \/*                                                                          *// w+ ~4 v) A6 ^
/*              PWM 中断初始化                                              */
. U# k4 H! {. e# y7 T, n: ^/*                                                                          */
, u8 j( o" K/ O4 r3 C/****************************************************************************/( K/ P( z) P2 U; w# ?0 g7 |  ]
void PWMInterruptInit(void)' {$ j$ |; D3 b* U0 P
{
+ P0 I2 v- N& r5 A        // 注册中断服务函数8 O: O  ~1 K4 l+ W# [
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);* v" m+ J% a: V* x/ k. H8 z
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
- [# w/ `4 Q8 ]0 `
' H# ?7 N3 n8 R1 v        // 映射中断3 p. a* F0 {/ s  }: D: |7 \
        IntChannelSet(SYS_INT_EHRPWM1, 2);
! l! [4 T8 f( T% {. L        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
# k' U* Q# h5 l: H' J( h+ V- D9 s- _+ u
        // 使能中断
' T: o+ {, @. g3 p' @3 Z5 H! Q        IntSystemEnable(SYS_INT_EHRPWM1);
/ z; T0 X4 X- f2 S) ~7 |9 E        IntSystemEnable(SYS_INT_EHRPWM1TZ);
; b9 L- D7 G1 C& V# T6 @3 U}: y9 g. R# r  y9 J+ r# O4 w

  I3 H9 z2 v" q7 n0 b/****************************************************************************/
/ S6 J0 m6 Z) E: I  h/*                                                                          */3 j7 R6 O# {* `" e5 P4 T" h3 B
/*              ARM 中断初始化                                              */
7 F0 ?7 C, v4 d/*                                                                          */, t) M) V2 r! f$ w. x' I
/****************************************************************************/
9 i6 P/ l" z4 o% @void InterruptInit(void)7 E' k9 N! h+ H7 |! g
{7 Q- W( }* {/ z( @- N( t- E, L
        // 初始化 ARM 中断控制器1 ?/ [$ t/ @4 o% W9 ]$ _
        IntAINTCInit();
; `" F& ?7 {& E! s0 [* n* t+ w1 J5 r, w/ v$ u- s
        // 使能 IRQ(CPSR)
$ i: _5 l8 M+ B        IntMasterIRQEnable();5 e1 m  N! c+ H
# I0 h" L$ m6 M# g+ V9 A& V% v# J% ~
        // 使能中断(AINTC GER)
9 k2 C3 O& I9 v" X        IntGlobalEnable();/ n8 ]( d* M; |& Z

/ Q4 R, b7 n, X        // 使能中断(AINTC HIER)) ?/ U/ ~6 R2 Q  C' S
        IntIRQEnable();! `  S" D& V. R
}
- E3 K2 c' k) R' l! d& B' v/ ~% V4 h) ~$ S

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/& n3 ^( d7 X6 \+ s% N- z8 j! b/ J
/*                                                                          */' V" J) z+ X9 L: h4 j# L; h& O
/*              中断服务函数                                                */
5 X2 v; M' ?4 Q! N! L5 ~/*                                                                          */% a, j% V, P$ R0 [; j
/****************************************************************************/' Q* `4 R- i) f' u  f  }
void PWMEventIsr(void)
$ u: h3 y8 G# m! T8 a5 ?  D{6 A! W/ Y' K& n3 H
        IntSystemStatusClear(SYS_INT_EHRPWM1);
& |! ~5 O3 E- h# u- Q2 G9 F3 Q$ l" `, v. [. \3 \
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);$ m% b1 h; Q' H/ V/ t3 J. _9 D
}& @( V  ~$ {0 {! I0 i

5 a1 Y& I5 P0 l/ h' Jvoid PWMTZIsr(void)
! e% k7 I, S0 ~8 b2 D{9 k  ?( N8 [& r* x
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
6 _! i/ X% w$ Z* D; X1 A  {" \  p# T$ }8 F0 _$ z
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
; y/ C" ]6 p& H0 d4 i}2 B' d6 P# R8 }) I3 P
. y, T7 C1 ]. o; t+ E; {! Y
/****************************************************************************/
% M) P3 k3 \' B7 ^& H/*                                                                          */6 t6 |6 c0 C9 p7 }$ V* G0 q
/*              初始化捕获模块                                              */" F2 `' S' s3 |) w, X
/*                                                                          */
' Q1 b5 C4 u# c, f6 _+ P/****************************************************************************/
5 I, l3 D4 F; e( I- O6 u& J( d+ cvoid ECAPInit(void)
5 h- T0 I& d4 ^# I& m: S5 l, ]{
( Z* q/ S% m% q9 `8 x        /*-----设置 ECCTL1-----*/
" L" V3 u4 e) G' v9 H1 K        // 使能CAP寄存器装载
: V  j2 M2 E) f& `* ]) \$ L        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
  l4 S: m; s4 ]% a        // 设置预分频值.
5 @# A/ _0 q  r5 t+ F$ R        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);/ T4 n( ^$ \4 i! J5 a7 N3 g
        // 上升沿触发捕获事件
  l; O- }- c2 J0 c! T        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
* g0 n' d8 W  ~        // 输入捕获后重新装载计数器值.
5 H  Z. I4 A) H! B3 ?5 V' N7 Y        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
, S( @5 _/ j1 W  K# q# l  k6 t& u3 m( M
        /*-----设置 ECCTL2-----*/
: a# p; i: {! O7 J# F        // 连续模式4 P" ^7 ^- F2 u, t* v
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
8 y/ [. l+ E8 j' s; S# q9 K  N" K        // ECAP计数器TSCTR持续计数% T4 r1 |3 a7 v4 A+ f  B8 `3 {
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
6 `% N3 |  q9 _* `        // 禁用同步输出和同步输入8 H' p+ j9 L5 l4 F  W( r( `6 |9 C; x
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);$ U# b% f! Q% R) A
        // 配置 ECAP 2 为 CAPTURE 模式
  P! ~" N& z6 D8 h% B6 y; v        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);! q1 P0 e1 d/ E' _( w+ c3 X, w
3 {. O% E% n* D& Q7 B
        // 使能中断2 E. U$ ?# O  H
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);2 {8 k; O- X( m, \7 _! r0 F9 \" O$ z
}
6 `, y! R/ }/ \- k; u
3 [! B' }% e4 l( s% q/****************************************************************************/
. R$ x# S; M5 f4 j7 p' h/*                                                                          */
: r0 u" V. U- Z6 T0 }& P8 p/*              取得捕获结果                                                */
2 w1 \. u$ b0 A( p5 M/*                                                                          */$ f8 X. S6 k5 T' U& u6 [/ v
/****************************************************************************/
+ x7 @  W$ W  `unsigned int ECAPRead(void)
+ W6 y# {* j2 j2 V: c5 y- ~{
* c  j9 A; m0 ^7 u0 @& U        unsigned int capvalue;
9 T: ]- H- _8 K+ ~  g5 l) w        unsigned long frequency;8 `, j. n8 L. |5 C7 n% _

$ F! C4 D! M3 s        // Event1 中断标志. h2 ]8 A3 A, U* h  v
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))' \% r) Z% [! q- b0 V
        {/ X+ c9 j1 C+ t$ {+ [8 v% l
                // 取得捕获计数. b$ z: u; z- k4 }
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);2 y4 S: }5 r8 _' o  `) \
                capvalue = ECAPResult.cap1;
+ K9 g. A0 ~8 L
9 g4 e( I0 }+ k6 @% e. j                // CAPTRUE 模块 228M 时钟主频
: L* f1 D9 H' E8 x: C- A$ T3 M                frequency  =  228000000/capvalue;0 I/ Z3 X" x6 R; z7 t3 @. ]( a
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);  ^5 h" u; R: q2 @1 }
* F' ^/ `& \3 S0 i2 G0 l
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);5 Z) U1 v0 @2 L% {
//                IntEventClear(SYS_INT_ECAP2);; u" t" F4 u8 C: E
        }8 ~' J8 A" g8 ]+ d& Z! [+ ^
        return frequency;: L/ _8 Q! G$ q7 ~* H; {! N% V; W6 {
}
4 O0 O2 a/ F. e
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
) {+ Y/ @2 E3 r# }# G8 E/ w5 |2 y0 w[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