嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
! z' s$ h, P7 N. }
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
, Z/ _) c6 w3 x2 u/*                                                                          */" E. ?/ {5 f3 V, B2 P1 C; [; g
/*              宏定义                                                      */+ A! w5 P; w+ y5 q
/*                                                                          */
; M) |: Z$ k2 M" K5 }* X1 }/****************************************************************************/, y% i: N# @5 l% n7 B2 h
// 软件断点
2 n8 L! v, A% t# [) d8 I#define SW_BREAKPOINT     asm(" SWBP 0 ");
* j/ a; r2 m/ v. _6 O7 i
' f  F4 ], w) m5 N" h' I% L1 k// 时钟分频
* b9 l% L5 p+ X0 D#define CLOCK_DIV_VAL     228
" y( ]* _: H( t, f+ N7 N  w* Z. M# Q) Q# P, y% @7 ^; g
/****************************************************************************/
; j3 e5 b( L* O+ @0 `# y4 r/*                                                                          */
! r0 b( X, X. b1 S. r6 t+ e0 h/*              全局变量                                                    */
5 d6 f! r' j7 A5 u/*                                                                          */# G! J6 j% `* [. j. m9 V
/****************************************************************************/* J3 j! e$ s, H
ECAPCONTEXT ECAPResult;
7 i$ j% r+ U/ V$ u2 s1 K- @
$ F4 y! {7 j/ L. [/****************************************************************************/- Y, }3 H4 D5 M  m( x. o( S  r  a
/*                                                                          *// v9 R( y2 Y: e/ T9 c8 g
/*              函数声明                                                    */% j- R! c9 X" n
/*                                                                          */
! m4 y" O; S: U6 h+ f/****************************************************************************/- d: n. S) A4 X6 j& B
// 外设使能配置
( D0 v8 w3 D7 R# \; L- |, Rvoid PSCInit(void);
7 X; `- r4 k/ _/ M7 w+ D; ]: G: J
// GPIO 管脚复用配置
) @/ l8 O' }& m' A$ G( `void GPIOBankPinMuxSet();
$ }" X" d0 r- ^- p3 F, l! C/ C" l
: [9 o+ K1 w. M! D* @2 X// 产生波形
, O. E5 m7 W) a, [! c$ yvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);8 Z  a9 D6 x, o& S. A
void ChopperWaveform(void);
. C- A- _& T6 d2 y& i, [
2 v) \. z5 C+ O) k( c// ECAP初始化和读函数; L7 h: k1 a( O, _
void ECAPInit(void);
5 b' h' ?% w& y7 k& q  Aunsigned int ECAPRead(void);
% B1 `7 g9 J3 b" {, ^3 C8 n
2 O2 @+ N) m$ V//ARM 中断初始化% I0 x+ s6 V$ e8 {( ]
void InterruptInit(void);
4 w1 c/ t; t* B3 r; j: F
! y7 k% i4 F3 e) N" j& V// PWM 中断初始化; L! }6 K2 z" E; T
void PWMInterruptInit(void);3 ?4 Y* N+ O, m7 M8 m
// 中断服务函数  H; F9 W" y3 H
// PWM 事件
% W5 Q! a8 ?! b* J, S) @, }% `# }void PWMEventIsr(void);
' |; q- U. Y' }/ ?( w! Z// PWM 错误控制事件
8 C6 k8 V5 r: i3 ivoid PWMTZIsr(void);2 c( h. X5 j2 R( X5 J

4 N8 O* c) G8 G1 x/ E' A& Y/ J' _/****************************************************************************/1 k2 E7 X# w4 |
/*                                                                          */
: z" Y  ^  F3 o- }: j  ~0 K) [/*              主函数                                                      *// s1 l6 P8 p' M7 a/ p
/*                                                                          */
4 B2 C) h6 I# g0 q, D: \/****************************************************************************/
, H3 ^! Q' {, @int main(void)
6 `# f4 |* I" Q4 }{: F7 M7 n, ?1 B4 D, U4 u
        // 外设使能配置2 R7 p$ h* o4 G4 R: o" }  S' g* b
        PSCInit();
& W, E: x3 Z) c; g% ^) j/ j9 G. N: C# A2 E9 [3 e
        // 初始化串口终端 使用串口2, |: ?& c! ]$ }% u4 w. d
        UARTStdioInit();' R6 Q+ D5 F- J; I) `, l
       
8 D: ~. R& u# O0 \' T7 g+ |        // GPIO 管脚复用配置
: N6 R, k* O2 S        GPIOBankPinMuxSet();
( C3 h1 R: i1 F* Y
! b/ V; b/ d9 g* e, a. K$ P% s        // ARM 中断初始化! _4 \6 i7 \: O
        InterruptInit();
/ d' [: A! R. ?, n$ Y, F9 Z- ?% {* N4 O: _: y
        // PWM 中断初始化
& n" g6 G+ M/ O4 R; |' H- i        PWMInterruptInit();3 v6 c/ s5 d; C) j4 o9 y; v& ^

5 x  g# g; J6 _! D1 A        unsigned char i;4 u8 e1 V: A( Z7 X' k, T
        unsigned int j;
# o* Q/ Z# g9 [+ C7 _( O' W
* T( f  k: B' f        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);1 w! s  Q7 o: F0 v1 K
        UARTPuts("------------------------------------------------------------\r\n", -1);
: _8 [' ?  K! u; R2 ~/ A        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
/ S( a+ h. }  Z* [! {4 t        // 产生波形
  c  B5 E0 h; d( N        PWM1ABasic(25000,50);
0 c& _5 W$ k' M5 u! C3 z% J4 J, F, }
1 j- s6 P4 ~! ^8 K9 v9 o8 U        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
6 C1 K, ]3 n0 j; s        UARTPuts("------------------------------------------------------------\r\n", -1);# A2 h, x4 i: a% C; c
* x  ?6 h% j% \/ @2 ~! e
5 X" m# j* n  h

/ `& V8 n) T3 ^- A2 @5 ~1 [% u        UARTPuts("------------------------------------------------------------\r\n", -1);
) h0 T# l/ }7 T  L4 Q, X        UARTPuts("                    C6748 ECAP Test\r\n", -1);' w3 V7 F9 R1 s; \+ M9 K& y
        // ECAP 捕获初始化
; m4 Y# b8 }! C2 S        ECAPInit();
$ N2 R' g9 R+ W" P9 f% R        UARTPuts("Initialize ECAP.......\r\n",-1);
' i2 K: i3 e& i% u" R" H9 S5 Y        for(i=0;i<5;i++)
+ y0 a. j! X) U: }  D9 J* r        {4 ~5 n8 n, @' {/ C- u
                    for(j=0x00FFFFFF;j>0;j--);            // 延时
; O3 L; Y. x6 G                    ECAPRead();
7 L; ?9 S7 k9 F' H7 I        }0 z$ m( [4 h( h7 e- W
        UARTPuts("\r\n",-1);
' o7 P- T# Y  t$ O        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);% b$ ~" G. D9 w: j- t  T
        UARTPuts("------------------------------------------------------------\r\n", -1);. y( I7 v2 n( l. n) V: V1 B1 Q

" I: g  f, g" S* O" f        // 主循环
+ s/ h$ x( l$ W) }/ L( f' @/ B  w        for(;;)
0 K/ g0 g" u# d, z4 e" `        {; U  T- x# }7 V0 P* Z

" r1 P' B2 Y1 ^$ i& O- q3 g        }/ w% n, N3 [# A
}! _7 ~1 v  N# W0 v, B/ B) J

  A, y3 W5 M4 s5 P$ z4 o/****************************************************************************/" j/ p( ~& Y( J  X! h1 c
/*                                                                          */
% W: r( L1 i& H/*              PSC 初始化                                                  */! Z; [  t0 E& P, C2 `
/*                                                                          */4 W: h5 x9 |0 A6 [3 H
/****************************************************************************/5 B/ _3 H/ d! o3 M9 p
void PSCInit(void)9 H( h9 |5 r, }" s9 _+ @8 K' ~
{
& |6 [" `/ ~* ]0 e* T- |        // 使能  EHRPWM 和 ECAP 模块* U0 F9 u2 c6 Q) D
        // 对相应外设模块的使能也可以在 BootLoader 中完成
  |2 t8 j+ {) R8 |    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);) V/ I' ^7 R6 H+ T. p3 f
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
; ?3 ~( w, V  A3 y1 t6 v4 z}
7 [$ E* g' T, G- q, T5 I- D1 m4 m
- y/ o. K' F4 w# \* @/****************************************************************************/- @: z+ C+ [# E6 ^5 G
/*                                                                          */2 b, a# c7 O' h) Z
/*              GPIO 管脚复用配置                                           */" [0 z: d; s9 ?' D0 ~
/*                                                                          */1 ?7 i. `8 [+ [5 f6 J
/****************************************************************************/+ [3 H4 f+ l" {' I4 ~9 A( D- n
void GPIOBankPinMuxSet(void)3 n" S( p, Z, a8 u3 `
{
' L( K/ `$ u, G: ]( v2 R/ c        EHRPWM1PinMuxSetup();
& T! A7 r3 c3 y1 c! a; G1 E3 ?7 V- K. v+ w' O
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
4 t- N/ M7 A/ |" m+ H1 Y        // 作为捕获功能时管脚方向为输入! S( H3 z2 c$ y; K1 G2 i: G
        // 作为辅助脉宽调制时管脚方向为输出
4 @' i" E# {/ y2 j9 Q) v    // ECAP2 / APWM29 l/ u' Q0 B7 z( {7 P: x! A3 R* n
        ECAPPinMuxSetup(2);
9 @: r4 N8 U7 m
. s" i7 c) _& ]2 d! g4 ]        // ECAP2 / APWM2方向设置为输入( t5 J& k7 S8 P; i5 Q) o
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]3 s! V4 q' y+ b8 Y0 y3 v! |
}/ Y6 Z  g, b1 |# u1 h5 k
% M1 x) r3 j0 Y. C* U# x  p
/****************************************************************************/3 b& @+ z& N1 Z7 x0 N: G
/*                                                                          *// Q3 P1 y, ^, M7 X1 B
/*              PWM 输出波形                                                */
4 m" x$ ^0 \& a4 ^' J8 l% C/*                                                                          */$ S$ d1 ^$ z" A' }# ~* h1 o
/****************************************************************************/
6 R# t; M# B9 m# E: ^9 J2 N  Tvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)' y) h+ i$ E! C. V4 a
{
0 h- U; n( N0 p1 I9 ]+ J! i. q    // 时间基准配置/ X: a* m$ H; _$ O
    // 时钟配置
, z0 j. D1 j" D' k6 _; `    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);, c: f, V. y3 q, N# |8 O
, u1 h2 M0 a' [; n, b& g  `- G, S
    // 配置周期5 Z) f$ V' w! P% Z  e& k/ _
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,0 I+ g0 o2 z6 G0 E6 k
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);9 Q9 I  A0 |, \1 S

3 h& Y! s) B9 S! @9 K    // 禁用输入同步信号
3 Z  v$ V; r8 k$ N    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
$ p1 x( B+ y$ ~6 |6 t. O0 [
. N, Z: _! p( \$ ^1 B    // 禁用输出同步信号
3 D& ~# C6 O5 j  j* s. K    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);( h' i1 j) G6 V  P; `( u' o

7 `: P  ]3 {/ Y' f    // 仿真(DEBUG)模式行为配置
3 O8 z$ P; t( g    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);( |5 W( a1 k% R( a

0 b$ e. M0 \' s2 H    // 配置计数比较器子模块
0 `* c% W* L4 I( K    // 加载比较器 A 值
4 g# _' Z& g' F: H4 B: }    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
  `$ _* Z; D1 d2 i                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
3 K7 ~% A5 _+ i( t9 j2 ^; z  t* \9 z. ]
    // 加载比较器 B 值
8 N! |/ d% D7 N; }    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,5 B& a- C, ?8 u
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
6 w' @8 U% Q; l$ c5 v/ F6 g3 S5 G  Q/ H
    // 功能限定配置(输出引脚触发方式设定)
1 U; G7 D+ S7 d" n; \    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出# }  M" L- d5 N3 K2 p
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,( ]1 ^. W4 ^( x9 o
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
2 d5 H2 g5 s1 |4 Z3 @6 E; N                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
8 r/ c: S) t- y: B
5 _4 ^; v# ]$ w: ?2 K    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
2 K. S$ }$ c9 m5 C0 U    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
8 s# ~" @* ]. ]2 L2 X) u- y& r' Y! ^; n
    // 禁用斩波子模块3 v# }6 c; C3 |* x8 k+ e
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
, G( B' @" N; S# d- t( ^* t$ d: k& V% }8 X5 [
    // 禁用错误控制事件% K1 B% w; ~) b! ~/ M6 `
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);) w) y2 t( b5 }% Y- C1 [: p
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
6 {7 w8 `7 r7 \" J- U2 l! B) h* x  l) T( M6 J+ K
    // 事件触发配置: Z$ V: S7 O9 B6 U, K4 I: y
    // 每三次事件发生产生中断) F9 a- O$ M& b6 ]+ A0 ]
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);5 h. J6 [6 j4 Z, \$ g
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件) ?: r0 T% \' h, I" S
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
4 X5 H; k# j+ J+ S. V3 Q. j    // 使能中断+ R! J6 U6 |* K! C$ N; V) g- ]
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);# u* d# ~3 |1 y7 b
3 L- h5 ?9 B& T! S
    // 禁用高精度子模块
) I+ X8 S7 P- Z* y9 Z    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
( V3 P8 C$ i& P  I
" w& z5 @/ T  k  K0 r    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
% Q* J% ~1 S$ ~! O4 I1 I}
2 i- H( t( i. ]  N# d# c1 f+ p. }" f& b2 s$ r! f( Z5 b& F
void ChopperWaveform(void)0 V. i+ @5 A3 ]& t
{
8 |+ F, m5 E: Q7 o4 b    // 50% 占空比. J# |0 ^* L4 X( f
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);) u7 \' W# ^: C8 z, k
    // 4 分频$ j% {3 j6 U1 p; s% x
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
( m7 Y+ H: W5 [; c3 e    // 单个脉冲宽度0 T4 b' u7 d0 Q) p# [
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
) u3 b3 @+ F$ O" S; U* N- X    // 使能斩波子模块$ {; R+ g, M( q  ^
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);0 X2 K3 W5 k4 \; U6 ^
}
6 @$ ]3 Z, y7 ?% y- ^
3 S: i* o4 Z- ^" g/****************************************************************************/; q2 X5 V, e5 n/ K: r. m6 B; \
/*                                                                          */
4 z7 W3 f5 U5 s% O* S9 t+ d/*              PWM 中断初始化                                              */! w; T9 u' A% n2 l( l
/*                                                                          */
5 H  j8 }, T) P( N6 u/****************************************************************************/
, `9 q, }" @& S5 V' vvoid PWMInterruptInit(void)9 j2 ]: X# ]$ k/ ^
{$ k) J9 U3 ^7 z' ?* r
        // 注册中断服务函数# b7 z! i0 I2 C0 B/ \/ `
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
1 F) K6 ^$ b. ]* ]" H  ]" _! `        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);. M; ~- h, I! M0 ~* _8 N) Z

. @; b" v0 |- A; `4 m        // 映射中断
% w0 `$ k2 F" N5 L+ q        IntChannelSet(SYS_INT_EHRPWM1, 2);
6 t) a) B4 N+ r9 s        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
+ `0 C8 t9 q: `7 P6 U/ V
  W# {4 B, U* k        // 使能中断3 n4 v/ M2 d9 n
        IntSystemEnable(SYS_INT_EHRPWM1);
- b8 Y* z3 N% Q6 T3 F- V/ p; Q        IntSystemEnable(SYS_INT_EHRPWM1TZ);) T; T$ {0 z2 ?7 y" j6 \( W! X
}
+ g- r. c/ J. @  ^+ k
! @$ a8 i& |9 A( H5 {/****************************************************************************/( F2 y- Y. ], }, G9 b
/*                                                                          */
' i' l" s6 w* H6 [* N/*              ARM 中断初始化                                              */% R* ]. B- `4 [* x( T
/*                                                                          */
; ]4 H* n* @, Y- Y/ P0 ^% f' |/****************************************************************************/( ]: b! \  F# G7 W& X
void InterruptInit(void)! ?1 @: {% O3 I" D+ X; v
{
, X1 q; o' x2 P9 P; h* h1 O9 x        // 初始化 ARM 中断控制器) l+ n3 n( d  L# G, w* L7 B$ \
        IntAINTCInit();0 r" L- i& w, T' `* T* D: E; _

3 I8 [. N/ C. A) e" n4 v8 P7 M+ a        // 使能 IRQ(CPSR)
' A- ]; e7 P. G5 l( A" _" A        IntMasterIRQEnable();) s4 e$ _0 c% X
3 i  u$ f1 ~/ l3 Z( r& ]* J  ]
        // 使能中断(AINTC GER)
# u3 F" O4 L* v7 I; z2 p' A$ Q        IntGlobalEnable();9 G) Y  }, ^9 B2 y* v0 Z" [
' E! O! P4 y) M0 Y& u
        // 使能中断(AINTC HIER)
) {  d$ b1 Z9 Y# ^* U        IntIRQEnable();
; y& N4 o8 ~  c: f; s# @) n2 {}0 v7 e1 K; |  x( ^) d

! P+ M% e% v9 u' W
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/2 Y& s5 a1 b& m1 D7 u
/*                                                                          */
+ _  E" J! y4 ^2 }6 ~% ~/*              中断服务函数                                                */
. J( [3 C$ }* b' a/*                                                                          */9 \( f( Z8 o0 h8 t, {
/****************************************************************************/
) i0 ^$ k' g- e) Y4 ]void PWMEventIsr(void)
1 q. O- p, y1 @) E4 t{, k6 I: i; N6 k: o$ j9 h
        IntSystemStatusClear(SYS_INT_EHRPWM1);
" X+ ^: k% N' y4 X; w6 h: q/ y$ o+ }% Z- H& J
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);' ^3 U( r) ^8 X* z
}$ c+ x) P% `8 K0 t/ I1 c$ t8 L( p( F

# Q6 i" u4 n9 B( Kvoid PWMTZIsr(void), L* ]8 }. P2 `
{3 z3 `5 `0 e9 W3 g# Y9 I, |
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);5 y! [0 S' F, K% Y
9 {" W, v8 Q& c' v: D# t
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
" B: k: k4 J% G! p9 c  B/ W}2 C  `. j* r9 m6 f7 ]' y% U8 G1 g

0 A' A; O) `6 s4 @7 b6 M/****************************************************************************/
( \7 P: ?$ Y4 h7 o  Y! u/*                                                                          */. z0 t4 r- C& \( f
/*              初始化捕获模块                                              */3 C- [( z! I+ T& H. j: b, c
/*                                                                          */' t3 S+ G3 D1 t- w9 }) C% e- @$ E& |
/****************************************************************************/- w  |9 }  H0 u( b9 @% C
void ECAPInit(void)
" e  A4 w9 R) |{; b9 p6 M6 i  ]' M! d) Z( b3 w
        /*-----设置 ECCTL1-----*/
8 `# N0 W/ \4 P        // 使能CAP寄存器装载
3 t# ^& M2 K# T$ m        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
. ?6 Q) Z5 r7 S0 `        // 设置预分频值.
  m5 L% o. z* w        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);# ]9 Q! o/ O* y  x, I) z/ D. k4 ^
        // 上升沿触发捕获事件
3 y8 [+ E: `4 ]+ H7 V. G% Z1 q% E        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);. f6 {3 u* f/ d* N
        // 输入捕获后重新装载计数器值.! }5 P8 l6 }7 m3 u/ B
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);/ z! _0 l% C2 T

1 h& s6 @# l  U( D5 ~: `; I        /*-----设置 ECCTL2-----*/
+ F& |7 b. s, A* M( i% t        // 连续模式
! r* L8 v5 c1 d/ G8 f* l8 T: w        ECAPContinousModeConfig(SOC_ECAP_2_REGS);4 p5 T/ c9 c0 {
        // ECAP计数器TSCTR持续计数) |3 d1 z8 ^6 {8 d$ `- R4 z
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
9 u2 I9 E$ H0 C$ S5 h( f" D        // 禁用同步输出和同步输入
1 M! f" y) v4 B: p1 n        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);$ a# W) L7 R" C# s9 q9 s& K- `
        // 配置 ECAP 2 为 CAPTURE 模式
% T1 ^0 R/ f8 R) _2 \! i( H: q        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
- E) s& v; j4 ?6 o; R, ~" w* @3 o2 V7 T7 B# R3 d2 k
        // 使能中断, n2 y  B$ }6 U* f' k
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
2 j  L  G/ n- A. i5 n; O7 K}  G+ A. ]- M5 z, ~5 d
$ Y' F/ p. w5 f  O
/****************************************************************************/; u0 H- y9 k6 L0 l8 f+ L. V
/*                                                                          */+ R0 L1 a5 g0 X+ |
/*              取得捕获结果                                                */
/ {/ q5 r: ?) d1 [( C% s- v6 U  G/*                                                                          */
* I  D0 v& R1 @' p) _/****************************************************************************/
& _5 _- I9 s1 i# }' h( Yunsigned int ECAPRead(void)9 X: z* f- Y0 O8 L5 g- I8 N% }/ c
{: F( u+ h5 X1 H* _2 q1 f! G
        unsigned int capvalue;
* R, i9 V0 w: f9 C0 g' {        unsigned long frequency;! _+ s: r8 j7 Y: ~+ C) C# a3 m
: O3 d: c! L2 W# l6 {3 i3 H
        // Event1 中断标志
, ]; f6 }, ^0 [6 A$ p4 S        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
  `! y+ `4 e( `. C/ {6 ?# q        {; i. {$ g8 F2 `
                // 取得捕获计数
7 y4 X$ {$ [  I4 e! m! k                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);' o# i* @8 R9 B% S
                capvalue = ECAPResult.cap1;
9 _- t( a4 K, k1 v9 ~! ^' C: O- ?! M& Z+ ^% D
                // CAPTRUE 模块 228M 时钟主频$ V; W" |2 b/ y
                frequency  =  228000000/capvalue;
' [/ n# H( {$ c                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);  G4 R0 Z3 ~2 R8 B0 j  o1 L. w' K
# D# S5 [5 o! L$ p/ O
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);( C$ b8 I8 }% h, j' k% w3 z: U7 \
//                IntEventClear(SYS_INT_ECAP2);+ ?1 i' {0 Z5 c! `  p* p
        }
& @8 N: \  `9 {# @' ^/ ^        return frequency;
6 Z) u; W6 C4 u# u3 |4 `& x}
. y* [7 e' P8 P$ c" N! o- x
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
% u+ ^$ U) _. 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