嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家, i0 d. x4 x! v: g) T

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
# D$ `0 N6 \1 B" a& X' ?3 r/ v/*                                                                          */6 d0 H" X& b! o: }9 m# v/ k. g
/*              宏定义                                                      */+ a. C/ j" v0 O/ R
/*                                                                          */
7 C! K- q8 z- K  s8 U# e/****************************************************************************/& C# K5 }# h( ^' |$ w4 M9 E2 S( S' {' H
// 软件断点# S+ t9 j4 V3 X, \
#define SW_BREAKPOINT     asm(" SWBP 0 ");$ |5 X* }: [' s3 b8 `. O  e( T- S

" o9 g+ B/ Z% J2 O// 时钟分频
1 v, ^7 {; U$ R8 f/ E6 y- d8 m#define CLOCK_DIV_VAL     228
4 U% m! L( ?: y
1 z$ {/ w4 y* W7 M9 g( L/****************************************************************************/
1 |( ^2 u& g$ }7 `% P% P, Q/*                                                                          */
# O9 }8 ]# ~4 r/ {/*              全局变量                                                    */6 d- `, j! @: i/ W" T7 l) p
/*                                                                          */
: w+ y  l) ]" L: h! Y/****************************************************************************/2 _' m1 G5 U) x
ECAPCONTEXT ECAPResult;1 e7 h; l: k+ X

  `. Z+ U, [' f3 I% E/****************************************************************************/
' Y; q- t% G, S) O( V/*                                                                          */
: F  l4 e% ~* s3 \9 o! u4 g/*              函数声明                                                    */# G) h2 v1 a7 c1 w. p
/*                                                                          */6 U0 \8 b. P( C! g+ K8 x
/****************************************************************************/
$ ]$ O6 t' j3 a+ p( G: `// 外设使能配置
' O, S& g& D& ?8 V/ q: d- Y1 E' Bvoid PSCInit(void);
: O* r1 E  ]7 `9 v8 K; s3 ~( {! K
8 l! {# N% P( \( G5 Q8 E// GPIO 管脚复用配置# z3 S1 m( V5 ]) V5 ^! `5 Y( l) T; J
void GPIOBankPinMuxSet();
6 ~+ ~9 c) U8 A3 f9 }6 R/ `) M* {$ J# X1 b( Q, i! |# v; e/ ]/ E
// 产生波形5 ]' G& _1 s3 M2 E4 C
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
& B  w" g- u4 t  N. I6 }void ChopperWaveform(void);
2 ^. I: S3 ]; t5 n+ F( D# [$ H. a% `# ~- O( q- L- r: _
// ECAP初始化和读函数
7 P, w9 @& q) n1 }3 T4 C/ M5 _void ECAPInit(void);' p- S* t, r; R3 {& F, d6 B' [8 ^
unsigned int ECAPRead(void);
4 |. \# i, x- Q5 Y2 O
- \0 H0 s2 c3 _9 c5 {//ARM 中断初始化( U0 k) P, T' p2 F( Z: b. m' p3 y
void InterruptInit(void);
6 ^( y- N  k$ T
2 e" q$ O/ a4 d' B3 |! R- f// PWM 中断初始化
- M( _" Q7 N' k4 F/ _& o- Q& a6 svoid PWMInterruptInit(void);8 m: {1 ^) j. a/ l
// 中断服务函数2 v( l6 @& f: `, w4 h% j4 f* b
// PWM 事件
# `6 d6 Q. x( f( ~) w/ x+ k. v0 h- Lvoid PWMEventIsr(void);: V, @) i8 b: W( C, r& b
// PWM 错误控制事件
) W3 H/ m: Q- q+ ]% v; Zvoid PWMTZIsr(void);
1 Q# ]* S5 N, j2 A' O' g( A, e8 y- J; u$ S; L+ `* z6 e, [5 C
/****************************************************************************/
( k. l, P+ V# J+ ^; f/*                                                                          */4 q4 B9 A5 I6 _! `
/*              主函数                                                      */
9 U1 \& g/ u. b" Z2 e9 u1 Q/*                                                                          */
+ g; T, ^. d/ x; J, J  m/****************************************************************************/- a  x' O7 `+ f7 f
int main(void)0 U$ X& r- Z/ d! \9 S  @
{
2 n$ h5 u5 K. m+ p        // 外设使能配置8 C1 z" [- l0 c4 A
        PSCInit();
% o9 b( N) I2 A" R: l/ C8 R
4 t- t& b4 [8 J5 l  X. R        // 初始化串口终端 使用串口2- P' H! B: O2 `1 n+ C7 _4 ?: T
        UARTStdioInit();7 h( t3 ]* _% O) S# F; Q$ f
       
# f' o! v# a5 P5 T( `        // GPIO 管脚复用配置
6 i7 R$ G/ l4 c% b$ A8 W9 B: U+ f        GPIOBankPinMuxSet();; U; H. E- k/ Y: }

0 A0 w: R& e& I7 o- T. T2 B# z* K9 p4 f        // ARM 中断初始化
( S$ f, A. ?' c$ z        InterruptInit();
3 `8 c# {- A! U! ]% _# D5 M( i, d, j
        // PWM 中断初始化: B9 n+ N4 [8 h0 s
        PWMInterruptInit();2 y, ~* n; i/ i4 f

" n: L% Q* B2 T        unsigned char i;
3 F( S0 d" r. p' y# C8 _( q) O- J        unsigned int j;
6 ?" c' h$ |4 a' L* K! ^3 q2 H. {: i# `0 x
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);; N. v: O7 `7 T# t9 e
        UARTPuts("------------------------------------------------------------\r\n", -1);
/ H( M/ _3 Z9 i2 H& G1 g        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);( w- U! ?: \8 Q" }, A1 K
        // 产生波形; O1 O* O1 }) Z. N
        PWM1ABasic(25000,50);4 I- o8 {- x4 u' v- y

4 H$ h2 G9 Q* f! u3 q7 z# A8 B        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);9 Z  y: \0 k+ {
        UARTPuts("------------------------------------------------------------\r\n", -1);; w( `- u; h, [; B5 x
7 D1 \& o# j+ R9 |
. I6 B5 `3 {& b6 C0 s0 a8 Z) b

" N4 w# P+ c3 O6 L1 j$ L        UARTPuts("------------------------------------------------------------\r\n", -1);) u9 K7 N) i9 X( `- i1 c1 ?( B. D
        UARTPuts("                    C6748 ECAP Test\r\n", -1);
' K- E2 n/ g5 a3 s$ o5 [        // ECAP 捕获初始化
& K( _' m. `5 @        ECAPInit();
0 Z0 s& F0 r3 v. }- Q        UARTPuts("Initialize ECAP.......\r\n",-1);
" F" n2 @" q* ~        for(i=0;i<5;i++). I5 e/ c' W- B( |. Q7 V
        {
4 X8 h; q( h6 B6 H5 G. J5 i                    for(j=0x00FFFFFF;j>0;j--);            // 延时1 v. b- a1 M8 c. S: {, e7 i, n
                    ECAPRead();
$ h# i- n& D  `1 c        }+ u; I" k$ j: D4 N
        UARTPuts("\r\n",-1);: R3 V6 R: c/ J: z- a
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
; v0 [1 c/ X' |8 X        UARTPuts("------------------------------------------------------------\r\n", -1);" R! N2 {( u1 S/ b/ p# ^; z- V

3 A& ~6 g9 {, \  r* s        // 主循环( ]& y8 o1 g1 ^7 y0 @+ d
        for(;;)
% X0 F: X2 J2 C7 }        {" H( }0 n3 g. `: h

- w7 V4 b+ _8 R6 O' u! o. f        }! E1 ?$ O. F) J7 ~6 o' E; ]8 B
}
/ e4 D% v3 X/ P" F
. d/ K: G8 D& m" v* G/****************************************************************************/
3 n& w2 a) }/ O9 V6 h% Y; k/*                                                                          */. F$ L. Y1 ?, c2 k
/*              PSC 初始化                                                  */0 Y* z9 z+ d  ^- j" ?  @$ B/ T
/*                                                                          */5 N' n7 T; n) {& W
/****************************************************************************/0 i8 V5 X- }( o  R& d/ Z" a- Y4 i0 Y3 u
void PSCInit(void)
* ?5 z! l/ X! ~3 ~4 n* s{  b) Q1 f" a% z( j% G+ y4 L: `
        // 使能  EHRPWM 和 ECAP 模块. D( [5 n5 r. r/ V
        // 对相应外设模块的使能也可以在 BootLoader 中完成5 N7 y) `7 F) ]
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);8 }7 v3 N1 Q+ }
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);7 h/ A- U! ^  Y
}: D8 ?* f2 R1 c+ p2 s# \

+ S  Y- R( c# p# W, p$ v0 P/ ~2 `/****************************************************************************/
/ _; m( e* f, b3 I! ^$ ?7 l/*                                                                          */
. ]0 |9 `' C# H3 r3 g/*              GPIO 管脚复用配置                                           */2 N$ U/ v. y) `  ]
/*                                                                          */! F9 G) n7 w  ?, B" L6 Z- o, D0 d2 |, Y; O
/****************************************************************************/
0 e) t8 E1 W! T* w( yvoid GPIOBankPinMuxSet(void)
* F8 s$ W8 j0 q$ m; `{
' g7 M% p0 n' Z1 ?        EHRPWM1PinMuxSetup();
  L' _6 d! A# d; ]: Z
( W6 {" M, M7 X/ V" ~3 z        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
! p1 y- x4 e9 S. ^& \7 I1 x        // 作为捕获功能时管脚方向为输入7 I/ k* M& A  W
        // 作为辅助脉宽调制时管脚方向为输出* C0 Z# e0 V% z1 ^6 r; `) a
    // ECAP2 / APWM2
6 k/ u) A2 B" Z# E% p        ECAPPinMuxSetup(2);5 v! @9 }, C6 K* Z; E* l

0 M0 m/ y6 A. H1 Q' D        // ECAP2 / APWM2方向设置为输入5 f9 H! a; K* \- Y4 }0 m) C7 H& L; C
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
* L; j( V! o1 O1 _* a. L& ~8 q}- {, N; |0 x& ~. [/ a: T
7 _2 c" b+ Z) S# @* s
/****************************************************************************/9 `0 c8 i. \1 y7 Z6 ?$ a
/*                                                                          */1 J( A+ [5 t4 H: |- A, i) @0 B1 i* d
/*              PWM 输出波形                                                */
9 g3 v! T. W2 X% V+ e. m7 x/*                                                                          */
, |+ @( ^, r, o5 ~% M! ^/****************************************************************************/
3 d: n/ ~) @, L5 Xvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)$ a% V9 @. W2 U; s4 R
{
/ W/ ~+ t; d4 W: I1 V- F5 ^# n2 Z0 W    // 时间基准配置
4 C/ d5 S5 n) C! L+ b    // 时钟配置; U8 ]1 ^, Y' {! s# P
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);/ a0 P. i& d% v/ q, e# e

1 N% Y9 |% F3 n2 n% v4 ]+ H* C    // 配置周期
; m0 T4 J( {  K% z4 s' w  u    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
' z, e% j' F: f7 [# s8 G                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);3 Z* g" j- r( S/ H+ ^" i
! A- P  `) s! h! l3 s
    // 禁用输入同步信号
3 u  [7 Y* F  |. j    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
+ ~) u4 p6 p$ g0 o0 t
) a2 d& H" S0 Y9 |; o+ {8 i    // 禁用输出同步信号
7 q5 H0 v0 b# `5 {+ Z5 h& E* b4 {    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
# X# x, w/ [7 f3 {  b) R, P# N7 o" \" L; v2 X0 c+ e
    // 仿真(DEBUG)模式行为配置
+ M; x9 f( R* a7 C9 k( c    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);. l. h, k2 h8 H6 }

6 ]7 Y  I: v8 V. ~3 g! L: T    // 配置计数比较器子模块
; B/ A  y. o. K5 S4 j+ x$ t    // 加载比较器 A 值3 w% Q( w$ T- {5 Z. Q, @6 E
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
9 r/ N- y8 {  ^8 {" I" _                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);5 s% |% b, I1 l6 C3 ]( o* f5 ~1 j
9 J: y" g" B* Y6 H3 Y
    // 加载比较器 B 值$ x$ z9 q; s+ F6 I8 N( s
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,5 n0 s; }$ K3 l+ o$ T" _
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
& ]* A$ m5 |0 S
. X; p9 c# ~3 g8 C( i    // 功能限定配置(输出引脚触发方式设定)) g8 [6 O- [( H
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
' [* n/ N( K1 c$ b9 ?    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,& T5 A! P) J5 m( y8 R2 @  @
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,* v$ _2 t) l4 s+ |5 V6 b
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);+ r3 Y, @$ ^1 I/ ^0 Z

% D  R# S" ?' g" c1 I5 \  Z7 T3 Z    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
: V6 O  N2 `& X" r' I, x$ }. p    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);' [4 y' s6 `5 w2 H2 R
, W* o; _6 ~. C; {8 R/ Y. U
    // 禁用斩波子模块# W1 \1 ~2 C  i& t! E
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);' G4 I. |6 [# g: t3 X, {/ H; ~
# t' F! Y; |, I& U# E' ^, _. G
    // 禁用错误控制事件$ q: _. X* b4 L
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
- B2 K% p) Q  v& x    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);7 M2 B6 x$ ?, i! z! l9 q: q
! I( J# y  Q% h8 d( \
    // 事件触发配置+ }' S. U5 c* V' W9 Y5 G$ E
    // 每三次事件发生产生中断9 V1 b% Q+ C, l# M: ^0 I
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
: K$ E4 F  C7 ?, g! S    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
5 j0 p' M8 ^% e6 A4 ~% s. Q8 F5 k    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
; g% A, I8 R, n    // 使能中断7 P# g* ~! z# Y* S, e, m6 `
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
  w" o( B* t% a8 \/ E( {/ S! I+ A+ `  u& \. I
    // 禁用高精度子模块! u8 H1 p! h7 [, _" z2 [7 L
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
. `, ^2 V6 t( F  ~1 w9 F- F. K" T4 s: x, }, R0 |$ d6 \% T# N3 K9 \
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
  p3 ^1 J; J7 m: t  @, ^}* O6 ?3 s( a7 X* F' R6 |. J0 H: j6 t

* N" c0 ^  Q1 D7 h+ ?void ChopperWaveform(void)% E& Z4 Z' h9 l) C5 q' @) @2 N
{
& l; x& m( i7 K5 I- c    // 50% 占空比
" D# P) q( S3 S: ~2 J    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
, t. H& p) t( q$ v& F  h: v; y    // 4 分频5 k# L7 v# L( b% J( C9 _2 k5 |; }
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
2 M, h: _, V' G' C0 V& m    // 单个脉冲宽度5 M+ S" e# v) V2 {& P( H
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);! }& ^) E, O' `
    // 使能斩波子模块. @/ B) p4 V2 w8 l$ V# V
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);  A5 Z$ R2 T8 b* n- O/ I9 q
}" [- m! w4 q$ E& \

3 A9 ~. W: A* _4 Y$ ^2 M$ z/****************************************************************************/
9 G0 L7 R) j+ S  e" f/*                                                                          */
, S/ J" E8 V4 Z- d  n. k4 R' s/*              PWM 中断初始化                                              */
  L. z* k- A) J/*                                                                          */  i# N- g1 ]0 K) j$ h
/****************************************************************************/% k8 G/ ?$ z+ I! l* V$ k
void PWMInterruptInit(void)
/ Y# @. y- _0 J9 S{
0 L- }* x( q$ R3 s" t        // 注册中断服务函数( N9 Q9 q* p; K% d) J
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);( P2 V4 b4 F% C
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);; V9 r$ N1 [1 [' l" n: T8 @
  `+ \. n! G2 G5 O
        // 映射中断
) c: D7 N9 }/ y  J  \        IntChannelSet(SYS_INT_EHRPWM1, 2);
0 r* p, `! Q9 p2 C$ n4 w        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
# S$ J0 t% h' L' I, X4 H( V$ B/ _, i4 z+ n3 V8 T
        // 使能中断# G% N& ~5 l% V5 c; u" ~1 k
        IntSystemEnable(SYS_INT_EHRPWM1);8 @6 m0 N% V8 m3 e1 C* }- c, Z% X' }
        IntSystemEnable(SYS_INT_EHRPWM1TZ);" w  ?" j0 u# P/ ~: u
}
7 F& P+ P: B/ S- `4 N# g
( k9 X& w6 }0 S" i- {  ^/****************************************************************************/
# o  o3 O; C- `5 f) s$ |/*                                                                          */' z/ S) [! P3 ?# ^  ?
/*              ARM 中断初始化                                              */
* |7 b+ p& f' o$ q/*                                                                          */; |$ G( Y. `" F2 T/ I3 c1 d
/****************************************************************************/
# |7 ]! _* u& S+ \void InterruptInit(void)- a& Q2 @: ?* ]2 `
{' F! a' E4 {/ f: g' P) T+ H- b
        // 初始化 ARM 中断控制器( M* h( N. ^! ]
        IntAINTCInit();
" ^! L6 X* ~# t! b. T9 Z6 h9 y0 K4 {+ ]
        // 使能 IRQ(CPSR)
6 B: ]/ j# @* O! w        IntMasterIRQEnable();- N% v/ v- o, ^1 [5 l
) \( C& C5 F& R' m# r& H4 Z
        // 使能中断(AINTC GER)4 R7 V: ^# E+ h/ r
        IntGlobalEnable();2 D0 g- O8 w7 u, ^8 P0 W
2 x0 {) h  h7 i+ f
        // 使能中断(AINTC HIER)
4 B, p& |# q% y3 n3 q  q        IntIRQEnable();
* X* m, W1 w, s) S/ B}# e3 H& ~6 f- ~' R! D/ m$ A

7 W/ K  q) E7 S/ y4 x) Y4 d; r
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/9 ?) @0 A: u  V
/*                                                                          */
( U( g0 B/ ~8 T. k$ j1 w/*              中断服务函数                                                */
/ n6 b0 F% Q1 t; U8 W/*                                                                          */
7 O* U2 c4 G! R* G) P+ f! L; J+ {/ ^/****************************************************************************/
* w1 N; N+ `- evoid PWMEventIsr(void)
  U/ o$ B2 T% q( J{
8 V7 P5 f1 Y8 b1 \- |        IntSystemStatusClear(SYS_INT_EHRPWM1);! J  v* H9 D* N

$ J0 s: e' h. v' K9 C/ i    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);- I( A+ `3 `. t
}
% ^2 q: w' N+ V- ]# F% C$ N
2 F2 l: x6 G9 Q0 O8 [; Q! v3 Xvoid PWMTZIsr(void)( M7 E! n1 g- y( p- F5 H4 V
{
6 E4 s! x' X, a( W* N( H        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);  d- w. E1 E8 E9 f  S" k
3 ^2 O1 |" Q; n2 O
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
4 {  ~7 c2 @( p: i6 P% [}: x9 Q* A' r( e% q, ?( P: p7 `7 S
8 S# y# M- m2 I
/****************************************************************************/
' w+ X8 |7 Q9 ^0 A/*                                                                          */5 D6 c) Y% O8 h8 S3 D
/*              初始化捕获模块                                              */+ X' n" L6 S0 A, c8 q: c
/*                                                                          */
( M4 S& T! r$ {, y% u/****************************************************************************/
; @1 E; }6 B; C3 H% c" z( q* uvoid ECAPInit(void)
: \  e7 V4 y6 `1 T{9 {4 G, k, M; l: o/ R+ b% |
        /*-----设置 ECCTL1-----*/" F8 n6 O/ w& T
        // 使能CAP寄存器装载
5 I2 B0 R8 ]7 r  K7 d9 H' J  L        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
! }- g# F) z9 ^        // 设置预分频值.( R/ q& ]/ m8 n
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);/ O$ l6 ]/ c8 J! R; `( w! w' }7 I
        // 上升沿触发捕获事件
3 X- w  n; o% }        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
4 r9 T! m( h/ G( G        // 输入捕获后重新装载计数器值.  m- s. S. U) {: `  ^
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
2 C/ t  k9 P7 X: M2 D2 o9 N  N1 B) G
        /*-----设置 ECCTL2-----*// e: ^$ t5 g* c: m. _
        // 连续模式
. h' L$ [, S# J% w, l4 x2 ?        ECAPContinousModeConfig(SOC_ECAP_2_REGS);/ _* C7 d/ p1 ]/ ]) E* N% e
        // ECAP计数器TSCTR持续计数
( k; ~; h5 Q/ Y) X' c        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
! I9 i6 R4 M2 Z9 a$ L6 d$ C        // 禁用同步输出和同步输入  y# C; d6 D. j
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);# y# z9 O9 S, x  k7 R
        // 配置 ECAP 2 为 CAPTURE 模式4 n4 k9 `7 M4 I2 l0 f  k4 m+ U
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);! T' V6 O! Z9 C/ \
: S& F4 c3 m  |& S
        // 使能中断
. F! u) k% ?( `6 r$ N# ?//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);$ U2 C! c- r5 E+ f, r" Q+ y; X$ \
}
9 I! |% x, s/ [+ f
3 o! w) ~1 n8 d/****************************************************************************// n6 P- E/ _! f& B' I( a- w
/*                                                                          */1 G+ s, ~5 O  o
/*              取得捕获结果                                                */& d. _" x# F' u0 p  C5 Y- c
/*                                                                          */
/ a! Z$ ~1 v6 z1 \" u) x/****************************************************************************/4 T+ D$ x, O7 v  V6 }/ B5 ?, D
unsigned int ECAPRead(void)
& t( M* F3 v' ?* G& a7 Z" i{' a& K5 m6 a7 e8 j0 F; `
        unsigned int capvalue;
" {7 v9 ~+ i- Y        unsigned long frequency;5 d& V6 `1 w, q+ T7 h- D6 ]

+ O; G; ^, k& S) S% ]* v        // Event1 中断标志
6 W  u; g; P! j% ]; n" H        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))+ A+ f8 _# u' x' ]7 ^6 j, q# J. K2 T1 j
        {
6 }! ^& A5 m* G                // 取得捕获计数' d* O+ A, }4 ~  Q# T
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
! a6 L$ \8 r4 p- v7 Q$ _/ h5 Z8 h                capvalue = ECAPResult.cap1;
6 Q  ^6 A, O" p/ M+ H% h+ Y  b5 q: B' m4 L  ?! s1 Y: `' C- f
                // CAPTRUE 模块 228M 时钟主频
0 x" {+ N6 `# c                frequency  =  228000000/capvalue;
: o9 [' n: H* c9 e3 v. m# |# Z                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
/ c# r) f/ ]0 [. l- ^" m0 e6 c
' c5 z% `; L# c                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);) I1 N8 _. D  F8 Y1 o/ r, s
//                IntEventClear(SYS_INT_ECAP2);7 `: s* s8 ?/ Q. H" w# ~
        }
( l  M' g% f3 a4 W5 e3 V        return frequency;% v$ L" T+ ]* N3 Q7 M
}: W8 @3 z5 I* v& I7 S& Y3 x) z

作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
' w0 l9 I' T# L5 n[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