嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家4 C0 z7 w; g" N% p

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
' }  P4 g% ]5 |/*                                                                          */
: H1 a3 n9 q) n" S# P/*              宏定义                                                      */% P6 _3 o9 L' V& g4 j% }- m2 N4 U
/*                                                                          */$ u0 Y% \1 a0 I" L5 J) h
/****************************************************************************/
# q$ L  Z0 I& ?9 y1 i// 软件断点) l' a6 T/ M! i- Y8 Z# D
#define SW_BREAKPOINT     asm(" SWBP 0 ");
$ M& w0 e* n  [! M9 e& |- l7 x) d
0 _8 X3 `! p, l4 n5 c6 ~" t// 时钟分频. V, ?4 U7 g& G' ]' S/ ]9 t& W; D
#define CLOCK_DIV_VAL     2288 p" n" n2 {- Z; s( {  ]" g; p) @
- F( W( k1 e4 T* w2 K- _
/****************************************************************************/' ?/ X0 {& _' A7 Y6 l
/*                                                                          */
& s+ Y( u/ O9 ~% x5 T/*              全局变量                                                    */
# x- H8 g2 |: F5 |% \' J- \# j2 X/*                                                                          */( {; S! N+ _  q- {# S  z4 \
/****************************************************************************/
7 z1 c: w# ]* N1 `& v* p- H, SECAPCONTEXT ECAPResult;
: T; q$ B9 Z( O/ K" k1 N! z5 @" n. D0 j8 E2 U4 A: Q
/****************************************************************************/2 s! ?: U* ~5 R5 {
/*                                                                          */: F& Y% i# d1 H  h
/*              函数声明                                                    */& S$ L9 f% s" q: ?9 p
/*                                                                          */
2 D6 l9 _0 ?" n1 @$ w/****************************************************************************/
, B, h' k/ b, M1 u& d4 I( s, _// 外设使能配置5 Y# H: T- N) p# z- z6 O
void PSCInit(void);
9 q) m3 @% S, `, I0 u3 N5 G# G
9 U7 f) S) b& V+ D0 [4 l* K// GPIO 管脚复用配置% E) {, r$ I- @& E) Q" Q) T
void GPIOBankPinMuxSet();1 Z% ^# l. k$ c9 P% _

9 i" M6 o2 `+ H, Z8 P// 产生波形! E6 O3 m2 |( d. b
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);! K; ^. t6 |2 [
void ChopperWaveform(void);* H8 h4 S& P2 q, f7 N
. X0 `  j5 j' g; u6 @) e
// ECAP初始化和读函数
* ~, G4 i6 Y4 A6 x1 Wvoid ECAPInit(void);8 L# U% h: B4 Z, J. A9 k( J4 p/ p
unsigned int ECAPRead(void);
- o/ r; {6 Y' c& Z& t& S& Q
0 `( D4 ^6 i2 g//ARM 中断初始化- ]& x4 R2 [; E; |3 \5 Z- F
void InterruptInit(void);& D. w, k' c/ R
8 M% }+ n/ S, b9 X/ z
// PWM 中断初始化2 {- o# u" O. f! q. C" W% m# X# t
void PWMInterruptInit(void);
# u) Q, p0 s3 ^5 b& ]3 b8 i( j// 中断服务函数
# }7 @/ c. |2 a8 G& Q// PWM 事件/ u6 X) m, C0 x( l
void PWMEventIsr(void);( b" }6 ?! y& q& ^5 {
// PWM 错误控制事件( y' C* i( X2 x
void PWMTZIsr(void);# r# F9 y, ?  c  Z" g1 w; w
$ p9 p* d& D; S5 \' c# ^1 _* [( G
/****************************************************************************/
4 H6 @1 O1 t* n+ d$ v/*                                                                          */
  m* m: S. y$ G% S, |8 c/*              主函数                                                      */1 L5 \# j: [" D7 c0 t4 {
/*                                                                          */
3 k: Z& h3 X4 n/****************************************************************************/
! @, R1 Q( Y4 Q/ y+ bint main(void)4 a; ~8 a* `+ O2 m7 ~- `6 U
{& u. G! C7 B$ T# X9 X! o0 O
        // 外设使能配置" Y" r% q$ Y, ~) u6 V
        PSCInit();7 J$ Y0 T% W' N% |% i
4 v& w) m& J1 _. K
        // 初始化串口终端 使用串口2
& ?' \5 t/ i$ }& n        UARTStdioInit();3 R9 |* ^5 d- V& u9 w$ y
        ! q% L/ N) p# a# D
        // GPIO 管脚复用配置# u/ J  Z: o& W" ]+ h. ]! A# \5 ~
        GPIOBankPinMuxSet();
! s! x: Y" y# Y9 U9 R) @9 A/ ?, R" r+ l( e
        // ARM 中断初始化
- o$ S4 g! G$ F( ^; R        InterruptInit();
. W% ~; ^( V2 U/ z* L( Y, D! l; d' E3 r: V) G
        // PWM 中断初始化* d; W9 \' I# N# I6 g# n5 Z, m# r
        PWMInterruptInit();- H5 E0 H$ k+ _0 o' `
- D  n2 m# v* W6 j7 V! ]
        unsigned char i;
4 W' c# T* m7 O6 x( O% C4 N# v9 z        unsigned int j;
- R  Q! N8 J0 k% y- k4 ]
: R$ e9 A) e, O' r! t        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);, j; r. c9 t0 l7 G" p, i; B
        UARTPuts("------------------------------------------------------------\r\n", -1);
0 N* Z/ I8 T3 e% h  X# L  {        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
4 n9 T- o9 A4 q( f6 b% i  s        // 产生波形! q# Q- ~; x7 V7 |
        PWM1ABasic(25000,50);
2 K0 X% k* e$ N/ \' d: F" p# X4 l
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
& ~1 B: [( I3 X; x5 l) |/ G2 h        UARTPuts("------------------------------------------------------------\r\n", -1);
1 _1 @) S) x% H. V0 l( j- g' [# Q) v1 q5 t" E" w: Z' d; J0 W" q4 r
( o! p, X1 P% D- E
9 O) R$ ]: F6 T0 _$ m5 X
        UARTPuts("------------------------------------------------------------\r\n", -1);! E9 T- P" t! h- N2 M
        UARTPuts("                    C6748 ECAP Test\r\n", -1);
* j3 f+ R- T9 ?        // ECAP 捕获初始化
. Q  q* O4 q' M7 ]8 S# F$ p7 \        ECAPInit();
3 @5 R* ]- J& J/ E        UARTPuts("Initialize ECAP.......\r\n",-1);
" D- P8 ~" l0 F# l; G        for(i=0;i<5;i++)- d$ S9 k7 O1 o
        {, z: F  b0 C5 \4 s) a, u- ^0 H5 f, I
                    for(j=0x00FFFFFF;j>0;j--);            // 延时2 [7 Z; v0 t( v9 c! Q/ s% K
                    ECAPRead();
5 J( _' F9 j( |+ `8 ^! J        }) G9 X, J6 c! ^' Z+ m
        UARTPuts("\r\n",-1);8 F. ~2 w8 k8 ^, x* _; M
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
6 L0 k' d6 V8 S0 l3 R& G; i        UARTPuts("------------------------------------------------------------\r\n", -1);) m1 W( u9 ?1 P! o/ d

# k6 s: r8 O4 G( N+ `        // 主循环
( {6 Y7 m1 P  u) @) f& f        for(;;)* o1 ~4 T: [& g! s' u2 H2 V5 n
        {
- p6 G" u/ n+ [# n
% P2 ^1 ^4 V9 p. j5 W5 G# ~, m' y        }
; l  y; T. `# H/ L/ G}3 _9 w7 P+ f# b) }) j* q* I4 m

/ s4 I4 Y5 g3 H3 {6 U6 c% n/****************************************************************************/
- B0 e: h% x" |; I/*                                                                          *// C1 K1 Q( z% P9 E# {6 a
/*              PSC 初始化                                                  */
/ v( {6 X. A% L+ T5 B" J/*                                                                          */, S( }2 H8 r0 u, t7 E& U
/****************************************************************************/
% V6 p8 e# P2 T; H- |+ Ovoid PSCInit(void)
$ d3 @$ n, L" f# D{
. j$ Q; l) @6 ^: ^6 D        // 使能  EHRPWM 和 ECAP 模块
0 `4 X$ C9 U# y% O1 z+ g! o  Y5 N        // 对相应外设模块的使能也可以在 BootLoader 中完成
' J1 G& m7 z( M; m" e: D$ q2 |2 t    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);5 O- Q5 }3 s+ [% z
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);3 m$ F" Y5 d( ^: h  Q# K
}6 _; _' u' l* N9 X
# A& h4 E3 N- Y6 Q1 Y
/****************************************************************************/) c7 R3 _$ W3 Q) u! {4 `# M
/*                                                                          */
! n$ F8 T+ v$ i) ^, `# Q4 Y, G: ]& ^/*              GPIO 管脚复用配置                                           */
6 H+ A  g& l/ r# T7 E  ?; O) G5 s/*                                                                          */+ Z' F3 j' i7 V' p
/****************************************************************************/8 `. Z# K2 c$ a, _+ ^% a& @
void GPIOBankPinMuxSet(void)
. |) q" C) j5 x. h9 V3 s9 k{& t' h5 S4 x7 T' A+ Q+ x
        EHRPWM1PinMuxSetup();! ?+ l( N* a/ u; X

3 B- }: i- ~: \1 h        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
8 S- |1 u2 a, ^3 Z        // 作为捕获功能时管脚方向为输入4 u2 P  N( q# m3 q  u' Q) _
        // 作为辅助脉宽调制时管脚方向为输出' ^, J  Z9 d) p+ C& J
    // ECAP2 / APWM2, J1 v) @1 @; s; M9 S0 e
        ECAPPinMuxSetup(2);
: \# Q! U" J, t0 d$ j5 K7 N1 g6 C$ B  F/ z
        // ECAP2 / APWM2方向设置为输入
( h0 h1 G# w- Z: F$ R6 I& U        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
0 C. _/ U: h( F( A% g# ?( n6 o( i$ E}
* E6 _: e8 i" `/ `( @
2 F, s3 Q% N. e2 R3 o9 h/****************************************************************************/4 ^- S: n& g9 n% I
/*                                                                          */
/ w( w: `, ]& R9 d; s3 R! M7 Z) e/*              PWM 输出波形                                                */* Q8 g3 v0 N) [' E
/*                                                                          */. K  Y& L. n. e( G
/****************************************************************************/
! w& R& d' V  ]( Bvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
1 r! l( h4 a7 G) D3 M4 }: V{
7 U8 K8 \9 ]: ^    // 时间基准配置+ R$ [/ j' \. f/ }3 K
    // 时钟配置
9 ~. t. m# l8 `1 S) G  Y9 w: l    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
7 g) B5 Q. e4 d% q0 R+ \- `$ ~3 \; R0 n3 k+ e* b% K
    // 配置周期
/ G/ f, f/ x% g2 G6 m4 G0 s+ f    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,& J6 g3 [  N8 E: G
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
  l7 a* n& ]# o) |" \2 ]8 ]; p* I' q* v" K
    // 禁用输入同步信号2 X, Y7 p: V' Z4 U. _" r
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);+ @2 ~9 l/ ~# x. |3 d9 ^
3 M* {3 N8 ^* _* F8 w! G0 q/ K3 r# A
    // 禁用输出同步信号: D" t% U( {: R6 k' f+ U
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
7 x5 s# E& g; e$ J* t+ V1 B' r
& F2 n7 w7 X+ |6 L* a    // 仿真(DEBUG)模式行为配置/ E7 W( m# k4 `! ^+ n$ w/ _
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
( C! x( g0 i+ R4 g2 Y9 Y. `9 ^* W( E- M; C/ }9 I4 T( I# Q
    // 配置计数比较器子模块- x* U1 H; z8 `; O& A. C
    // 加载比较器 A 值' `# a9 [! E9 _  H
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
! C# q/ \4 a( D5 m+ W                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
" Q3 {) m$ P0 O! i7 _  h% O8 M6 x- @: c
    // 加载比较器 B 值
9 Q) Z  N- U% t- s  n- y    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
, ]1 f+ F7 s6 Y7 u                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);5 l& x% X. ]- @  n  C8 S. R& A

3 F0 [; n! J7 n. Z( n: V0 x& W0 W) z    // 功能限定配置(输出引脚触发方式设定)
4 K+ G. r# Q! Q3 ]3 ?1 L7 ?    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出  u, I: {: e+ |& Y% h, g1 i
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,9 p+ T# x1 [1 f3 D2 ~2 F
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
: |) h% x' D5 M" d                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
; {. ?: T: M/ Y' g# J! P& t+ E
: w' s6 b, o6 l! Z& x    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
, F8 U7 e' a1 n    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);) x9 i) Y; ~$ \1 M) v8 N1 f8 Y: R

) Z% `, G: K+ I$ e. [) H    // 禁用斩波子模块' |) p7 \- t( t# K0 p/ H1 _
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);7 Z6 C5 {+ |$ X4 U" h+ E) w

. F2 F( o" z7 S# |    // 禁用错误控制事件
1 _/ u( a3 t5 j0 O    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
0 W/ C! O' u0 |. x( n    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);6 h) F7 Q7 [1 w) y6 V* }2 u4 `

' w4 f" e% I5 y5 }2 _& d: O  y! ]    // 事件触发配置8 G2 c( j# T2 C% h0 x
    // 每三次事件发生产生中断
. }5 v: W& ?& o8 y, d1 O    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
4 E  ^0 t; E6 Q9 |6 `( O* A    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
* O8 V% h% w. m3 A, D9 g/ A/ `    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
" A# S% @6 W: Y2 a# M7 K" F    // 使能中断( @" o' O% x2 [0 l
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
2 s2 }' n/ ]4 q2 q8 A7 [1 r: a9 p, X9 |9 k. L0 F/ H3 z
    // 禁用高精度子模块) |6 d% k* I0 z9 @+ g
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);( ~* I& W3 c6 F9 ]) J$ i  h
8 G1 k! L2 j+ ]; E
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);! M8 t. X$ k# }
}
9 e2 d& O; s! ^8 x3 K6 e: n
# i! t' R' F* v% s; u+ Dvoid ChopperWaveform(void)
2 p' _. R4 B+ D  M{! h5 O3 J: T. T' a% Z( g$ }
    // 50% 占空比
; A' {2 [4 O/ u$ |; `    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);4 L% l7 V% w$ u8 Y" i& X
    // 4 分频
2 F% G5 I9 ~5 e    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
- b# r' K% ]. k( j3 u  h3 s    // 单个脉冲宽度
# R$ H4 J9 b2 n. m+ @: _$ [; P    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
% \3 P2 }, k8 S) @    // 使能斩波子模块
: G9 B: r; j  `3 F    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
5 W% C+ T$ C( l# x}! w/ e: T0 d# }# n. J# u

3 `8 @+ V. L) P* k% E$ y, V$ u/ o) K/****************************************************************************/, M7 T2 x3 [5 o2 F9 {
/*                                                                          */
. d' `+ }9 n/ K: @) G, B7 y/*              PWM 中断初始化                                              */
$ a7 w& y" a6 F, A/ a/ W/*                                                                          */7 L7 s- t: F4 d$ y: r) V' x
/****************************************************************************/  H% \, \  |2 [
void PWMInterruptInit(void)5 }/ W: w" L2 h8 B  |
{' E: J+ w% @0 |6 m# u
        // 注册中断服务函数
: _) e( g3 _+ t! \' ?" C        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
' a0 k$ N$ l% b, B, Z% p% J& I9 f. o        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
; f, x) s0 a& h1 |$ K& w" H% |5 J( y' V, F+ P0 U1 h, q' S  z
        // 映射中断0 C4 K, F" V9 v& T. ^9 p
        IntChannelSet(SYS_INT_EHRPWM1, 2);3 x; K0 c7 R! T, l
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);! w9 f9 T6 ]/ j2 R- u

5 I  g: D5 ~6 [        // 使能中断9 h( m% P) A6 H; ~7 R
        IntSystemEnable(SYS_INT_EHRPWM1);
) e+ w& t9 q8 Y+ a( i2 @! Y        IntSystemEnable(SYS_INT_EHRPWM1TZ);
2 z( v7 ]1 S- z% ?}
/ v: M/ `! n6 b- ~0 A/ X1 T( v$ s. c+ a+ k/ O0 a
/****************************************************************************/5 D2 w) ^0 Q+ g8 h0 Z( Y
/*                                                                          */
' V3 W( @/ i; c1 s% _/ {# y/*              ARM 中断初始化                                              */1 r# i# N- M. z% ^' ]) M
/*                                                                          */
9 o; t; g' I  d* f/****************************************************************************/
+ W" Y# Y5 T; a3 i9 ivoid InterruptInit(void)4 K5 ?2 B$ [7 e
{
0 X* |) [' c9 _; H* z        // 初始化 ARM 中断控制器
+ J* P& j3 O( z- z1 k! D        IntAINTCInit();
. V0 p2 q, V, c; _* Z. }; K+ ^
0 G/ |! N/ O5 a3 k+ ~0 J5 I7 q        // 使能 IRQ(CPSR)
( `  C! w2 d$ _9 i        IntMasterIRQEnable();, i6 a5 m6 V2 w5 V
; q- ]9 n8 \4 O0 L/ i
        // 使能中断(AINTC GER)
. d2 K  C4 q( G, v. m" G1 l  A+ C        IntGlobalEnable();" K  ~9 F% M0 s7 [- n2 ?
( Q- c. A, `) @8 t" E
        // 使能中断(AINTC HIER), S9 m' i$ U$ O& U: b; @
        IntIRQEnable();
: f$ Y. s0 q+ p$ G) X}! V1 |6 b4 m7 @1 d6 ]

5 b7 _$ S: M9 w9 O/ O1 l
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/* v( s8 `" W' K
/*                                                                          */% W* P% ^+ o6 U$ K
/*              中断服务函数                                                */$ s6 G: {. n( c, a  R4 P! k
/*                                                                          */: N1 N4 d7 e% X! m% x! a
/****************************************************************************/6 o4 b. M; r6 C( m9 O
void PWMEventIsr(void)
" M3 ^$ p* C/ j{* [# }) ~2 e& l5 }0 R
        IntSystemStatusClear(SYS_INT_EHRPWM1);% V) Q2 X! P2 }* ]

% z4 F8 w1 V! J1 b. k( z    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);- A9 ~8 f! V  J6 b/ I8 l
}# B2 t: C+ n; \. }

7 P! s3 w9 N' g; e# p4 Jvoid PWMTZIsr(void)
( D7 C" H& T: {. Y{# r: g2 ~! c8 |2 i
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
" F8 S% @/ w; G
$ B! z! d5 O, [; U1 F6 M    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);( _5 @' w7 m2 E4 v/ I% H
}0 `0 ~7 ]5 A' ^1 Y7 W+ l9 K/ b3 N  i
# p4 x: {1 H) R; f" r" G
/****************************************************************************/
# C* p% D" c; V/*                                                                          */1 h! `; z* m  |( a( d* N
/*              初始化捕获模块                                              */
# Q& g; H' z0 o+ a& f( r% t/*                                                                          */# s. Y+ a6 g: A3 z0 A
/****************************************************************************/
1 i! T' g+ w3 J7 |void ECAPInit(void)
+ }2 ?# [& U  \- g; Q; W* [5 @{
( C# c9 ]( r2 M- c* K6 b        /*-----设置 ECCTL1-----*/
4 S7 a) C  ^7 F( g4 z4 U& X        // 使能CAP寄存器装载
' Y' R4 Q, U) r- J* L        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
+ c7 Z/ D: G) g6 V        // 设置预分频值.
- H8 `" ^* N8 i! {        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);$ N+ K& a3 o" D% o
        // 上升沿触发捕获事件- q% q+ j# k$ H
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);- B' k; J9 V7 f& R
        // 输入捕获后重新装载计数器值.
4 }8 W7 X. O8 s. m' q! w        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
; {- g1 C# N6 }# r- R& N: z3 s& p- _* G  [" |! d
        /*-----设置 ECCTL2-----*/9 i$ o, ^7 k1 G6 x) s
        // 连续模式
4 `2 C6 m) z# ]8 _3 Y        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
, l  Y: F$ H* G& [& P" x        // ECAP计数器TSCTR持续计数3 R( b% \+ C/ k, g6 l
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
* D8 o& X. q5 [9 i" p- a        // 禁用同步输出和同步输入
. H, F: f" B8 W" }5 D5 D4 l. @        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
  Q% x+ W$ v4 F        // 配置 ECAP 2 为 CAPTURE 模式3 {+ i5 Z* K: w
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);# [* j/ p! W0 z. I8 N4 h9 [4 F* e

, h3 B4 z+ C4 i0 Z        // 使能中断
  K+ T9 O- f1 l" p. c$ \//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);, Z( b* ?! L& P
}
: |% R9 S# l; I1 i3 v# a$ d$ k# h: ^1 b
+ ~7 Z! K: l8 S0 s) O& L/****************************************************************************/
- J6 f2 w* ]5 X8 p1 o+ Z1 {/*                                                                          */
% T: }; v  X, K" D/*              取得捕获结果                                                */7 R* ?3 f" K; W- G* A
/*                                                                          */
5 v$ D' g( o( m' r2 \/****************************************************************************/
! N- v9 Z8 W& C# c; ~  T3 aunsigned int ECAPRead(void). G; ?+ R" y' w" u& I  N- v
{: h  B3 f+ p( \7 n8 n( ?6 _% {
        unsigned int capvalue;2 p; C3 p) L) d% Y' \' W& N; m
        unsigned long frequency;
3 t0 `$ D% T& D2 @5 t- l  ]9 D. x+ f0 N% ]# r
        // Event1 中断标志; \$ k$ K  I6 h
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))9 S; i5 H# }! D
        {
# _) u2 U7 i+ ]1 U                // 取得捕获计数
1 k2 x0 X  [; r1 L! `8 _                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
& ]3 `6 D8 X* Y                capvalue = ECAPResult.cap1;
' S; z" b. y8 x. U/ ^9 }8 n& S2 U  Z! L2 J& i* r
                // CAPTRUE 模块 228M 时钟主频- S) u* E6 P' \+ j8 n
                frequency  =  228000000/capvalue;8 M; K) R7 V+ w! [" t1 x. ]( M
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);' m9 M( `, m( e! V) ^( H% H! \7 v

7 y& d: o' S3 K" e                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);$ `; O. ?1 \' J8 p3 E2 ^# Y- c
//                IntEventClear(SYS_INT_ECAP2);
- I2 p5 F) i* @% v  Z: W& ?' U        }( Z3 s& s4 K) W3 I5 M5 U
        return frequency;# m4 O- S. Q9 |$ |( M5 c2 E
}$ u, K) B2 ?) y2 I

作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
5 @- a1 F3 ]- F! d/ u9 O0 G; E[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