嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家% [) j; D% `6 Q' [2 J

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
/ v. V& {7 P7 {9 M' h$ r/*                                                                          */; l* v5 W: {2 I9 A
/*              宏定义                                                      */
( A0 D1 T6 v; E) n$ }- M  L& ]/*                                                                          */
* ^* f2 q2 A3 y6 S/ i/****************************************************************************/! @" D- M6 r% F; y+ }% Y9 @( G
// 软件断点/ y7 R) d0 @/ G
#define SW_BREAKPOINT     asm(" SWBP 0 ");3 i# }  l/ I6 Z+ p+ W, b2 d

6 A: {) H- i- s$ K5 e// 时钟分频
! K' _7 H  W" l' W' A  M7 g7 |#define CLOCK_DIV_VAL     228
: ^% O5 a0 e! _/ Y
' |/ O2 Z8 B* I$ Y' i: S- _/****************************************************************************/
! F- ~8 ^. x0 m, ~5 x/*                                                                          */2 |+ T) }9 Z1 A1 e3 A; y2 e
/*              全局变量                                                    */
+ h) r7 E2 |( L7 O5 I/*                                                                          */6 W, \! _$ U* O5 m
/****************************************************************************/
! k3 K5 P5 J# ?$ n6 ]ECAPCONTEXT ECAPResult;
0 F6 U1 c2 g" a. a  q8 T2 c2 x! m
/****************************************************************************/
; E. d+ N5 `$ M/*                                                                          */
/ f% f% N3 L  b: u7 C/*              函数声明                                                    */
5 L& Z5 G6 L' t9 N/*                                                                          */
3 o, t6 I& o: ?7 l/****************************************************************************// P6 ?" c5 @0 W& A8 u5 C
// 外设使能配置0 o% f$ a4 [. N# f; p
void PSCInit(void);
5 }6 t! U; Z' l/ ~; w% @# x( D8 Z
" e1 a6 x; J, u- ?// GPIO 管脚复用配置% S1 G$ A  _: u8 s) e2 s
void GPIOBankPinMuxSet();1 a/ U" `/ w0 u& h& ]% J: p4 u

# ?4 f$ e% f: f/ L// 产生波形
" s1 V' G6 i. {* A: b, _$ Ovoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);2 p4 h7 `; I/ J- w$ o4 P
void ChopperWaveform(void);
# D4 ^6 `3 ~/ X2 X/ r( `! Y9 J: }; [& M2 e& [/ J
// ECAP初始化和读函数
7 r# b" |' ^. I  L5 ivoid ECAPInit(void);
# O1 N# l# {9 y" q) Gunsigned int ECAPRead(void);
. b! P* v$ b& y7 H
: c8 c' _" B$ T  Y* D, r//ARM 中断初始化
: \; o) T0 d5 |% Z) w& A* bvoid InterruptInit(void);
0 C( j% I7 m5 x! M  \
% S. t7 o4 ^4 n& l! \7 g! w// PWM 中断初始化, t1 [$ n  C4 ~7 m$ F7 ~5 ]
void PWMInterruptInit(void);% p" e5 X+ v$ o9 @1 o
// 中断服务函数
3 P* _! G$ _1 E; I7 c% ~1 m// PWM 事件
$ a! \& {; y) |* Q, Z- mvoid PWMEventIsr(void);
$ s7 r( _2 h$ H# a( T; B// PWM 错误控制事件
/ j; C1 S2 P7 Y/ l# K: Rvoid PWMTZIsr(void);
7 ~2 H& j2 z* v9 n( y$ h* d: |, }/ Z# J  q
/****************************************************************************/- _; a" k+ U! y) \9 u5 ~
/*                                                                          */4 K. S7 J9 t; d3 X: D/ }
/*              主函数                                                      */9 s' V4 h# \: [
/*                                                                          */" ^* P6 h/ h$ B; L
/****************************************************************************/
% O% e( `4 ^; Jint main(void)
4 x; L9 w' r3 o{& W2 r+ P' P0 E) m
        // 外设使能配置
$ z# L' t, Z( S2 L  p4 h        PSCInit();
) P9 V. n* [# I1 O$ b2 J* J, |0 M( L" C" t5 |" |5 p8 [
        // 初始化串口终端 使用串口2
/ k% Q; W* Y* r" z/ l. k* }- I        UARTStdioInit();
- J$ r" Y0 {; c7 s- J        & i( \- w; M! W# V, F4 m5 h# j! q) d
        // GPIO 管脚复用配置
' ~! [) m  _  u' e4 X6 B        GPIOBankPinMuxSet();% J' f2 n% [+ r1 o
$ H) f- o' b. ?0 g6 @# r
        // ARM 中断初始化
7 a/ x/ x6 w  u) ?" O# H! w        InterruptInit();
/ r( S2 J4 q: d, U* L1 ^5 X# [2 w9 J) `# q+ A/ j$ ^
        // PWM 中断初始化
! U$ V$ u, P6 Z+ k! ^+ y        PWMInterruptInit();) @/ s. |5 n( U: N

* g! R0 ?; y2 w% p3 m. g        unsigned char i;
5 {3 ^: j! t( _9 A& @# \        unsigned int j;/ y% \, P8 D  @& K! E2 S1 l
5 c: z/ p. C$ h+ j. P- Z  j
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
; }7 z" w9 c3 b1 n" ]        UARTPuts("------------------------------------------------------------\r\n", -1);6 q6 L5 g1 o" V( ~; I
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);8 s" q- @( p, V( n: Y
        // 产生波形
$ `# x* S) v8 {9 j        PWM1ABasic(25000,50);
  R2 Y( {% k2 K  f( P$ a* m$ W
2 Q* {& q" N( Z        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
: y8 x( w" W. ?6 R) d5 X        UARTPuts("------------------------------------------------------------\r\n", -1);
, Z) E1 a: p# r3 [. K1 F: F+ K% d4 o! s  g9 c' n

* y& |3 ~! u3 j9 `% B, M' O& a
4 \. F; k# \) z* W0 j) _        UARTPuts("------------------------------------------------------------\r\n", -1);
: D( k1 ?( d9 O. O4 s, c$ s8 ]        UARTPuts("                    C6748 ECAP Test\r\n", -1);
' c6 t: o5 w' d+ `4 r5 r9 F        // ECAP 捕获初始化
+ W6 `2 Z" x  i$ |+ K        ECAPInit();, L0 `+ u5 C  Q, U$ d& @6 u" H7 l0 m
        UARTPuts("Initialize ECAP.......\r\n",-1);0 n7 M* q; [& `2 }2 d1 j
        for(i=0;i<5;i++)
, o% |- E3 |% Y6 T7 C        {' D+ g# Z! F( L5 Y* K1 t# w. B  H; n. z
                    for(j=0x00FFFFFF;j>0;j--);            // 延时
0 X3 r% B; S$ o6 y# I8 d/ ~. h! Y' {6 g3 \                    ECAPRead();
1 F6 S! \8 \8 I. `& W( d6 R  y7 L        }
# V- i2 j2 k2 i. L7 A$ C# |$ k        UARTPuts("\r\n",-1);- _) W- `( @' ~+ w% X6 u; z0 j# W
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);- r+ h& B7 \7 A" d
        UARTPuts("------------------------------------------------------------\r\n", -1);; r; v( x0 t' U0 L# k2 f: T& Q
$ G9 |6 q9 N0 d& Y0 ]- d
        // 主循环
: x5 k! i0 _/ h, l! _        for(;;)2 z3 O! S- |; V, u' R
        {
" B+ y' N( C6 G  v# \7 y2 W- S  ?$ d6 y6 D" t9 u/ L
        }! I% l. c2 u9 y9 m( x$ \
}
6 R4 p' i" j9 X
. [; ]& k! \& e0 E# o: n" c/****************************************************************************/
( k6 j# Q/ p3 B% e. `3 `2 F/*                                                                          */' A7 l! c, C, @9 ^
/*              PSC 初始化                                                  */- D+ l; M' l7 q6 }% h+ _
/*                                                                          */
, N; r9 [4 t) U+ `/****************************************************************************/
. {8 g& J" V2 m5 W; p( Ivoid PSCInit(void)' B/ y8 Y: h; D- {& u
{& X  _& `8 `# X7 y
        // 使能  EHRPWM 和 ECAP 模块
4 I+ o4 ?# V# `5 ?        // 对相应外设模块的使能也可以在 BootLoader 中完成7 ^% K( R$ d6 h$ p- }8 `3 w
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);5 V$ B; G6 |) ?; U) _
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
  o0 c6 y! G- r7 A. R0 O7 o}4 J& t# r; X+ [; b/ c
9 Y4 P( I- r  g6 l( i
/****************************************************************************/, q' t8 |- S5 a0 |
/*                                                                          */
) a' ~7 x8 u' {/*              GPIO 管脚复用配置                                           */
1 K' W: S8 g+ |! b% g/*                                                                          */
- N- J! `% r- S. }8 a, D/****************************************************************************/6 l+ b+ x% X- e" l5 Z( J! T
void GPIOBankPinMuxSet(void)! j8 T6 j% U  `$ ~
{$ q4 O9 F0 F( e& M: D; J4 O/ r* w- s
        EHRPWM1PinMuxSetup();
5 _; ?' M; J! `( g  Y$ O$ A; A# o! p
5 w' C! ^- X8 @        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
3 y& S0 G- z2 `: q; z% j        // 作为捕获功能时管脚方向为输入
. v8 v; `  H& U$ L6 U6 @        // 作为辅助脉宽调制时管脚方向为输出1 w# ?9 m9 \$ [5 d
    // ECAP2 / APWM2% K9 k2 x$ k5 k4 C( E; P* Z2 Q' ^
        ECAPPinMuxSetup(2);
! T% |! h/ I. l9 i/ b# p1 O; X$ l2 I  R3 R7 J8 d0 s( F
        // ECAP2 / APWM2方向设置为输入
: u( I+ ], a3 A3 i3 @. h0 i% X) A6 [        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]3 S4 C) o' A0 @+ j
}
6 r6 z4 L6 t% L4 g: J1 m( ~% F9 @3 R5 R# f, Q5 j
/****************************************************************************/
. i: K1 `! }$ z+ b' L0 V% J  U/*                                                                          */
5 N2 ^  W7 R5 t* w, p* a. C+ u/*              PWM 输出波形                                                */
: F2 ]8 o% q; k3 R6 {$ ?/*                                                                          */! E1 N$ K, t- H5 q6 Z
/****************************************************************************/
% K4 q2 ]8 E/ @) v8 vvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)" X. m' l: w! E1 B
{* g* m' L* ^! t. U
    // 时间基准配置
1 J  H' ]2 q( d) u: H# s0 V5 j1 C5 J  x/ l    // 时钟配置
& M* X- ~3 i' A6 i( `( j    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
. x/ L2 a! X8 @0 j
) X" L9 X. Z5 d) Q! q    // 配置周期
# k8 G% s$ V1 V6 W    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,* M# }) D- F6 w  K+ C, @- E/ D
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
3 F+ @; x+ I& }# M) r4 P: q5 p' u) Z9 z, p+ c9 C0 ^; W+ _% \( Z
    // 禁用输入同步信号, ~/ Y8 f: V: U; d4 B& m: _6 l
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
* P; R' I. p, L$ I/ N3 ?1 x' |- K- N" C- f
    // 禁用输出同步信号/ x1 P6 S3 M! j. B* C; |
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
  [4 f5 D+ n- n6 r, Y
* k" ~; [7 n5 I) Q& n    // 仿真(DEBUG)模式行为配置4 V2 A+ L& t) z' P* U! F* e
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
% N' t9 R, x) Z7 [  a
( C- k: S' F* P5 O& p; {    // 配置计数比较器子模块
& d: ]  ^; Q( e    // 加载比较器 A 值
% E$ Y, e$ p' I$ R    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
' B4 h7 |, `+ T8 J                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);9 _/ Z& V- O! D8 z: w# K, x
1 X# k  C% X, l+ k3 w; n
    // 加载比较器 B 值
* ?1 }# w& F$ S& J9 X0 y- \    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
% l) |) Q. F7 l1 s                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
* d% h! K, c, e4 H% G! k
" D0 I" S* I( i/ U" f% Y. \& z0 q    // 功能限定配置(输出引脚触发方式设定)
' L( g3 t" w& z# ?  q: N    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出8 @5 T1 B1 f5 s: x. H8 i& F
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,8 f6 ?9 g, x! O3 K& c. @! ^
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
, D2 b/ f. k" Z& q. W6 q& X5 W: Y, T                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
# j0 K9 C( Q1 p1 M" ~+ [0 T" W$ ?$ v) g
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
- d3 C6 t4 ?7 y1 N* l! D' W: v! V+ f& A: G    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
4 o( N9 }# c/ ~
% Z. \2 k, F$ s6 C& B  B    // 禁用斩波子模块
7 r6 ^, L% ~" D, g    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);4 z1 s+ n# ~7 L' c0 [/ B
" X! `9 t) h4 F+ G  `5 g' g
    // 禁用错误控制事件
2 H2 ]1 h* b1 F1 m* H- u+ g    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
1 A. v& \* T& J5 _3 _    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
) U; Q) ]4 U. g, }) @, N8 ?% q
    // 事件触发配置$ ]$ |( F( Z2 d+ A; S- R, z# o
    // 每三次事件发生产生中断
  h2 s# z# q- ^! w    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
2 t% ]; V1 ^) x$ t1 I/ @/ U) `    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
, t; d: R' o3 U" q$ L# N% }0 u    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);. J3 }. }* ]  S4 {  j- `
    // 使能中断! X' K2 y" q% o' N8 S5 V' R
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);$ _2 G2 R4 G3 B$ U7 A- y

$ B" p2 x" q) v6 S- M* m    // 禁用高精度子模块2 `8 c5 [% D7 V2 J
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);1 Q9 i8 h& L# u1 O0 y

; @/ R2 o6 H& D6 Y* x/ e+ ^6 q    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
; S3 `2 ?% z+ }, I& ?9 F/ m4 t}9 ~! R# A% B: m6 V3 f
2 G5 ^' {- D6 \- _% j# Z
void ChopperWaveform(void)3 B7 _$ |: P2 L1 h
{
- G2 L( Y) T& J9 n6 i    // 50% 占空比
" t6 v1 ]& E" H! ?$ D' O; T1 N    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
9 L( G4 Z: r9 V    // 4 分频
6 F' v4 O% X- H7 @    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);. h; `  ?$ n: Q$ k9 b5 b
    // 单个脉冲宽度
) W( L( N' W+ ^    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
" K* Z/ X* {4 [    // 使能斩波子模块% m7 Z+ m' Q8 _3 ]! g2 E) Z
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);0 l4 l' B. h5 P% \( @3 P
}, \' e5 R& X8 c, L' k8 \

% Q8 I4 O) t" ~9 \! j- i4 u/****************************************************************************/3 p0 k; ^7 n. X2 S$ r; R1 W( [
/*                                                                          */
1 {3 K/ Z- z, N/*              PWM 中断初始化                                              */0 c" J- R$ r2 i8 w5 N
/*                                                                          */- V/ G2 S# b* i2 e' v
/****************************************************************************/# D) P4 ?% C( {
void PWMInterruptInit(void)" m5 R. G1 H: p" X* J
{2 L7 o* T3 ?3 J, |% i% J
        // 注册中断服务函数' ?" n% H. _! w5 {  j
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);' t" X4 c& w" y$ }, j0 Y, _+ _
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);/ t+ b3 E5 @0 f
5 N! m1 s0 Q* I
        // 映射中断1 a" H% G6 ~# r; I- B  ~- \5 w
        IntChannelSet(SYS_INT_EHRPWM1, 2);! P! m/ S" H% K& J1 K# `( j
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);: X, v$ P6 \4 |0 w" ~1 ^
. U3 l1 D( l* I; A1 k% l
        // 使能中断! s3 R) I0 j' p- e6 A8 _
        IntSystemEnable(SYS_INT_EHRPWM1);6 L9 x3 ~8 E( S
        IntSystemEnable(SYS_INT_EHRPWM1TZ);: `2 x; e6 b$ T1 o9 A( [: u
}0 i* Q7 [2 w% b3 ]; n9 N& A4 K

% t1 c2 ?& M" H7 ?, T8 E/****************************************************************************/, q9 Z/ ^* f: |( K
/*                                                                          */
2 k0 T6 ?) P* b$ F/ f- u( |" U/*              ARM 中断初始化                                              */
) x; c" s) P# X% k4 x* g+ S/*                                                                          */
& R+ l+ r. n  V8 M) v( {2 ]) ~5 i7 ^/****************************************************************************/
: C* B. `% G  f1 qvoid InterruptInit(void)
% w3 X) ^* W; A8 e6 O' {{+ O  O" n+ v/ l6 k+ Y  a, d1 w+ Q
        // 初始化 ARM 中断控制器; s/ Q9 t  U# W" F4 M- q+ ~$ C
        IntAINTCInit();; |: ^2 {- }# {3 s: Q$ E" }

8 a. t; j2 h) [) [0 ^        // 使能 IRQ(CPSR)
5 H- b9 z( r' O* V8 h# H        IntMasterIRQEnable();1 Y* s6 G6 i2 |* c3 F
9 f4 h9 _+ n& r5 z/ P6 }) P$ u
        // 使能中断(AINTC GER)
; D. x8 k/ u3 \  q4 [1 M        IntGlobalEnable();$ V+ V, ?6 ^" m; v* J3 O1 z

$ p2 A/ u9 v; q8 `  o% W        // 使能中断(AINTC HIER)9 M+ `, o1 q: y7 f. W
        IntIRQEnable();
6 V( E* q" |! [$ N}
% c9 t4 _4 \9 k4 j  u6 Q8 v
3 l: C( c$ l- m% @, H0 J8 U3 c$ @
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/
4 {2 r$ p# {$ n$ a  r$ _/*                                                                          */
1 X- G( e( ^5 Q/ l, G" H( d/*              中断服务函数                                                */
3 }9 u& B' a. b/ t8 a/*                                                                          */! b: g7 J) `0 e' ^% q
/****************************************************************************/
5 p$ l8 {0 i' Pvoid PWMEventIsr(void)8 M1 Z* |1 I8 Y, g+ G
{2 B# \- v5 x: \; t- F6 @) b( c
        IntSystemStatusClear(SYS_INT_EHRPWM1);4 ~9 F+ {- B7 @% K# u1 P
# H' x" N4 p2 S7 L* C
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);( n- O% g/ z9 n# z
}
6 ]  I) V9 Z4 d6 [: b, D1 s3 k0 u/ z4 y' B- p- I5 x4 T6 a
void PWMTZIsr(void)
; Y6 P! P9 Z7 x0 j+ J{0 \# X6 F& L. G9 d. h! I
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);" M( Y, e3 O0 h' j7 C

8 U8 L: g: ^. q* W4 ]0 N8 W    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
9 j: {! B" A: [( _7 }}; Y- r3 J. Y: }9 |
- R  l: E2 q% `6 @
/****************************************************************************/& k2 N: R' X- B& P- X, y4 W
/*                                                                          */
" H, S' J5 _+ J% ~+ R1 w9 M/*              初始化捕获模块                                              */9 W) I0 ?/ e  o5 p* {
/*                                                                          */2 k! j' P; U# y, b. h" W5 z" V
/****************************************************************************/
0 J' q" b( {5 {- k1 \( x+ K8 Y6 Yvoid ECAPInit(void)2 J9 t% {4 F/ o
{
( `# [$ w1 S: g- v9 {8 h7 V  ]        /*-----设置 ECCTL1-----*/- G$ a1 U- n" C2 Z5 Z' n6 |
        // 使能CAP寄存器装载3 p2 A" ]$ _) `# A3 ~: P& B
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);+ G. V6 B) C- ?2 L% \
        // 设置预分频值.
8 ^% ?4 A7 q% }4 P        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);* ]. G" @6 M/ f& a
        // 上升沿触发捕获事件
& A$ n$ S) o7 e        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
& Y% {8 T' O: ^6 T1 ]* A+ Z( T6 \, w        // 输入捕获后重新装载计数器值.
$ x7 E9 d3 ~3 V, |, c        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
- H/ |# a! l9 f; y7 K1 O3 H/ b  Z. d7 `6 E
        /*-----设置 ECCTL2-----*/
! u1 \, D% o& H3 T3 c+ n        // 连续模式6 a/ A. W/ G" L& u; R( C$ R
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);6 m, s+ A$ J" y5 W7 L0 s
        // ECAP计数器TSCTR持续计数
5 R" G) B$ D7 F" B+ k        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
' c$ d0 {. b0 T4 p. t' B        // 禁用同步输出和同步输入
/ p+ Q9 u! [1 B& ~. v. s- N8 b        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);7 [# a9 s+ i( T6 R% _
        // 配置 ECAP 2 为 CAPTURE 模式
+ ]6 m! Q  S2 W! P" G0 p) f        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
+ y+ B2 [, H: k. y9 C7 ^2 E0 F+ R! e7 J
        // 使能中断
. c$ u$ Q1 t8 _% H. S% C//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);( F4 t6 c* q7 w& D7 O
}% q+ Z1 C* ?9 g

) ^& _& ~8 n8 e; r2 Y1 t/****************************************************************************/; Y$ @! z- g6 R, N$ [+ t
/*                                                                          */& E8 y+ J  `5 T. U
/*              取得捕获结果                                                */8 m% f; P5 Q! ?8 O2 c
/*                                                                          */. E# q: Q% {9 l1 u7 t/ y4 D( V
/****************************************************************************/* G. \& [2 I6 `, J# Q) Y
unsigned int ECAPRead(void)6 N1 }6 x% N/ Z: m3 z, A
{3 T, f7 G# u$ b; H5 O
        unsigned int capvalue;' R- m$ r2 x8 y/ q2 x
        unsigned long frequency;& {  K& t* R! p5 t: l# q* }: N

8 @7 ~$ A  p7 C( ^* E        // Event1 中断标志
6 T1 H7 x+ j+ Q: A        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))0 l8 s3 w1 Z. b, G6 p$ ]$ c
        {
& |% F  S- |2 m6 Q% z: a                // 取得捕获计数" I/ {1 b" u+ w! I! J
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
! t- Z3 r6 ^1 R2 V; F+ n$ q                capvalue = ECAPResult.cap1;
% R1 z. h+ s8 O+ ^1 A# K) D7 D- ]/ I8 w" m: _$ M7 ?9 V5 `" a  c# k7 O
                // CAPTRUE 模块 228M 时钟主频& g6 b4 \3 @0 [" q. }" n6 z2 L- \- E
                frequency  =  228000000/capvalue;" q) j  w% [3 M2 d! G  G
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);! y- c7 A) S) Q+ Q. D' A
3 N% U( ]# R. j1 Y) S8 a
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
- g9 w  ]4 x; ?( C, D- i7 o//                IntEventClear(SYS_INT_ECAP2);
  B* I) S" E: c0 |4 b; n: Z        }3 _! L  s  s$ A7 L) f3 m" j
        return frequency;
9 s% R; b' M1 ^- k+ b7 k}
6 _+ m# {1 k8 J; P
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
' v& m5 _0 s4 v3 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