嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家4 @2 O! [3 [. y+ B2 m) }- i) V1 n

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/8 H" ^5 B# u2 g3 j. ^# Y# l. [
/*                                                                          */
( o8 h' K( Y) `* Y4 V0 v" v/*              宏定义                                                      */
1 X5 S9 A# z/ B3 o5 c" F/*                                                                          */6 k+ h6 v6 d( P5 w$ O8 @4 N/ N
/****************************************************************************/
4 C" k1 D, e0 j) h6 m// 软件断点
5 J  o" j+ L! C$ c3 a6 B#define SW_BREAKPOINT     asm(" SWBP 0 ");
" m: M% A" N' i
8 V1 M! U8 {+ P! N' g  l1 [# ^- Y: ?+ F// 时钟分频
  Y4 l" V/ K  ^% P1 i! i: i#define CLOCK_DIV_VAL     228. ^% W8 ?8 e) r- w

) e5 |" U) _- E1 f0 |2 W/****************************************************************************/9 I1 h1 p0 d6 ?/ R) J* g* w/ I! ~7 Q
/*                                                                          */
  y5 T( X0 S  q3 V8 G  x/*              全局变量                                                    */
5 O# s5 P) M4 ]6 ]# z/*                                                                          */$ G; }: b: \, x! p: y
/****************************************************************************/5 w, a( u' l$ ^. j- c6 d
ECAPCONTEXT ECAPResult;
- s) \- a* Q. i7 A! O
0 j# L( u: l; i1 X2 G/****************************************************************************/
  E9 ]8 o' x8 K' D$ N, F5 C) a2 e/*                                                                          */
& |, H9 _& R. H0 Y+ G/*              函数声明                                                    */" r( H! b" s! ]. F7 p$ d
/*                                                                          */
; J7 A4 d$ W. b; S/****************************************************************************/
1 O) R6 }, h' _; j% n& i+ W// 外设使能配置7 @- u) d, M7 w
void PSCInit(void);
: v2 ~, S3 ^& t; O2 a' T* h9 {  j& |+ w4 L
// GPIO 管脚复用配置
: \; D& Z: L, ^void GPIOBankPinMuxSet();' t* q3 l0 }6 V
  H# s" |; g: b% O) C, o- W  _
// 产生波形
7 X: H% Q& G: w2 ^+ cvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
+ y8 K. d0 E; k& c; y: R# Y/ xvoid ChopperWaveform(void);4 t5 V9 y4 D/ X, r& E

0 h( r# D6 R; I" R// ECAP初始化和读函数
0 W; z1 n; u9 A  jvoid ECAPInit(void);- }+ P+ ]1 W6 h& q5 r
unsigned int ECAPRead(void);$ G. d9 l# I: ]$ ?+ V
' r0 Y2 P9 q) d$ M& N
//ARM 中断初始化
0 [! K! s+ m* pvoid InterruptInit(void);9 T% v1 P+ @7 ^8 I/ R6 z

! z/ |, n  O- p  P// PWM 中断初始化: T6 K( M$ R: n" H
void PWMInterruptInit(void);/ E# K! e0 }/ l6 z
// 中断服务函数
' E: g( n# s5 F7 d$ y" A& x1 N// PWM 事件
5 n" E0 t% V9 Jvoid PWMEventIsr(void);" J3 Q0 c& Y0 v$ @
// PWM 错误控制事件/ D: y( S: u2 {" l
void PWMTZIsr(void);! _$ x1 F! ]$ J  l* \2 r4 i
# b7 K# `: }" ]( O! I
/****************************************************************************/9 ?6 v9 ^+ ~/ Z( |% |
/*                                                                          */  K; F* h& \/ x' L
/*              主函数                                                      */
, Z5 K- \& A/ L5 w/*                                                                          */; ]4 ?; c. k3 V% C$ M8 \/ p, Z
/****************************************************************************/
7 ~7 S% n2 t6 E1 B6 [int main(void)4 C) U6 X+ d1 q: b3 e2 X1 |0 b& B
{0 k1 E' R/ ^) B3 k9 ]
        // 外设使能配置* k0 [% X8 s$ u/ [: m; i8 t: R
        PSCInit();
6 y! [' y8 i1 C6 l/ x. u+ D. v! }% A7 i" T+ T9 B6 `& @( C
        // 初始化串口终端 使用串口25 s# D% o! ^$ I" E" e' @/ K  S
        UARTStdioInit();2 v* ]1 Y- I1 l2 y) A. w
       
$ Z: c) y1 h; F: M8 I5 r        // GPIO 管脚复用配置
+ K$ S7 X2 k" S# v+ B! ?: C        GPIOBankPinMuxSet();, n  ?" Q3 C: |0 _
* g5 \: ?. n4 [4 h0 R7 V0 {
        // ARM 中断初始化7 v4 f: J$ I6 I  h
        InterruptInit();. Y( u8 F9 A' Z# Q$ n

6 H* c6 F7 w( D2 t        // PWM 中断初始化( o9 d9 v4 l0 i! r
        PWMInterruptInit();: N6 r, a/ w8 k; q$ {
  T3 y6 l7 u% X5 K6 f6 h
        unsigned char i;1 z- @" X2 j# U. V3 |
        unsigned int j;
* l1 R! d) P" O7 @
: M8 }7 y  h- Y- y/ X        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
5 h5 S- k# M1 o        UARTPuts("------------------------------------------------------------\r\n", -1);
& q" K, W+ R. B/ T' \; u( c' B! a4 O        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);# U+ w$ X5 C: k. S/ F
        // 产生波形
$ {9 o: @  l% f; z( q& F6 u: F) T2 B        PWM1ABasic(25000,50);
9 `2 a! {. }$ s
3 x  s9 d& h# [- k) X' s        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
$ K  O' @, h- @* J8 q        UARTPuts("------------------------------------------------------------\r\n", -1);, ~# O% `# [! C, k4 W9 @  j5 Q. q

6 `  R+ c4 \+ B# [( a
, r# s; q  M: k4 R  E3 G  e; l& ~- Y, D
        UARTPuts("------------------------------------------------------------\r\n", -1);
. `* z' ]0 e2 L- Q        UARTPuts("                    C6748 ECAP Test\r\n", -1);
" ^$ Q$ \  c" j% f, e; h& F        // ECAP 捕获初始化
) C& ^6 a: g; X4 w; D        ECAPInit();
- o7 `! Q( z9 ?; N/ }        UARTPuts("Initialize ECAP.......\r\n",-1);
1 w! \6 m) }8 ?- _        for(i=0;i<5;i++)! I  h2 j' c. k8 j8 w
        {, t, w; O+ s3 `$ N+ C
                    for(j=0x00FFFFFF;j>0;j--);            // 延时
9 T. }6 B$ Q: L* v, x  a                    ECAPRead();" \/ ^3 G$ v. p! C! r" n% h
        }9 X+ t. z% u5 L: I3 @
        UARTPuts("\r\n",-1);# w" Z/ m" K) i' T* @
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);1 p2 y& E$ o( r' T
        UARTPuts("------------------------------------------------------------\r\n", -1);
, s2 m: e6 ^8 J( j4 T
) q8 O2 h* q# y3 _, \2 t        // 主循环
/ R: J/ V& f- K! V' `6 D+ |+ |! @        for(;;)
8 @3 G" \$ N7 X4 w( t! u. j2 w1 n. r        {: O8 i; A5 T. u1 x2 c7 c

; l2 ^2 S$ M! O0 _: g3 D; O        }
7 n% C( C+ ^, X$ Q  w! `}# h& N6 f+ @! b& S# X

5 w! J3 P4 F+ t3 W) a, j/****************************************************************************/( L4 u  r# f. |6 M5 K
/*                                                                          */! Z8 x5 n/ e/ [7 g% Z( a7 f& o6 T
/*              PSC 初始化                                                  */
3 O( F4 U& \/ D: v/*                                                                          */
8 `' h3 ?/ A/ J! J/****************************************************************************// B( B& Q7 R! c2 s8 U# D) p8 M" N9 r
void PSCInit(void)
. O. X1 l  }9 a6 z0 u4 j{: [( e" O; P7 O) c+ [& i9 `7 \3 O- R, ^
        // 使能  EHRPWM 和 ECAP 模块
8 ?( K: j) k( \" L        // 对相应外设模块的使能也可以在 BootLoader 中完成
7 f3 |+ w* v. R5 d$ {$ q, M    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);. K2 k; k6 V4 S6 m/ ]; z+ r9 Z
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
% a1 c" f9 ?" k( c2 P}) g" t2 h: k5 A0 b* f# c

! h- T7 W4 _$ _0 s9 m9 ~" ]/****************************************************************************/$ q$ A0 B2 p( i7 A
/*                                                                          */
( r6 x8 q) ^& j0 [/*              GPIO 管脚复用配置                                           */
8 I1 X3 |' ]/ t: F/*                                                                          */2 Q5 a& m# i" S4 F7 P. ^* A
/****************************************************************************/$ R0 ]  R" O7 q7 z& M8 M2 O6 u
void GPIOBankPinMuxSet(void)
% S3 e, M: i, L/ U. q{
; J+ N8 }$ K8 e7 p0 X& l/ D3 V        EHRPWM1PinMuxSetup();' r( ~( |0 Y$ w, ~$ z* H& }
. y0 A/ `) x8 `& {
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
6 ]. k: {/ g3 ^7 s        // 作为捕获功能时管脚方向为输入
  ]; I/ }; d4 o2 e7 v! M        // 作为辅助脉宽调制时管脚方向为输出2 n$ z5 ]0 D1 H1 \$ d6 V
    // ECAP2 / APWM2; f  b; P6 `& u- h" h7 t
        ECAPPinMuxSetup(2);9 U. o% i$ y* K9 o, ~6 z
& H. n! u0 R7 g* F  Q5 t# ]
        // ECAP2 / APWM2方向设置为输入
' R* O: O0 f& g  S4 x, k% J        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
; E$ f5 L. m; f% u8 [}& H# w) [& w" ^- h$ B9 ^
: R$ x9 q! p( ~+ q7 o' V
/****************************************************************************/
) _% d& u5 L0 `6 ^, k9 c3 t8 L/*                                                                          */6 M' @1 m8 W% r' `% M* n' f
/*              PWM 输出波形                                                */
1 Z; |$ E: a) e& F. t$ z+ l/*                                                                          */6 D1 n: O6 b0 y9 |3 r
/****************************************************************************/' _1 z* I* u2 B2 y/ ^1 ]. X4 R- H4 v
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)3 \! d3 K0 s, f- x( Z
{
2 o4 g1 v6 l/ u8 o% g3 F( \    // 时间基准配置& p+ s& V4 N2 R5 n0 j
    // 时钟配置; ?# E6 E3 R! w* v: V& g3 X
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
* z) O0 q! _; Q- K: x- ^. _; m$ V+ B) u' V/ y
    // 配置周期
% E6 r& R% g$ i5 ~" S    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
/ J8 G0 e2 g- M6 |8 j3 A' G                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
/ L( A  }, T0 r- H1 K4 ?0 U( v" M/ ~2 O
    // 禁用输入同步信号
, R/ }; M( x4 V: D2 k( W. R    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
! z* y4 N2 T6 _/ Y! c) }9 C6 N  V2 I0 s/ O4 V2 n6 F/ ^
    // 禁用输出同步信号
$ k$ s% m: y3 y* \) G    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);5 d2 b. w& m& T0 c# {
4 O' p/ \( l) X( j, b& e
    // 仿真(DEBUG)模式行为配置/ s. B# _$ [5 X' o2 b
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);3 f6 z5 p; J* d
) S4 `; F3 q5 f7 V( \
    // 配置计数比较器子模块
) _+ h7 g' [& A) Z; E, F    // 加载比较器 A 值
* C! K. z/ d5 ]    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
3 d" F1 d  m/ k! A0 H                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);# b! T5 X8 B- L* h: H
0 x+ ~9 u2 `0 U) J
    // 加载比较器 B 值7 w: R0 r) H, I: Y) H6 K
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
3 |! V( X$ _9 d4 j8 w9 I                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
: }2 m) {- l; [
# t; H0 H4 @& v2 \    // 功能限定配置(输出引脚触发方式设定), `" M! X0 v: V
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出: K. A) o& a* r
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
; \) _( W( T! V. V; v" M                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
% o7 C" u' q' D! o4 Z- X                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
2 c" ^3 X2 P$ F& M. o# h" X9 k
2 F, Q3 m/ b2 g4 T8 p* P    // 禁用(旁路,信号直接输出到斩波子模块)死区模块8 B, W4 M  J) ~2 W$ `4 @: O
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
/ |6 p, c" A  Q- \' [) L/ q! l  I
" ~0 X: Y5 G) }7 q/ i    // 禁用斩波子模块& l2 N  ~+ c' K% V: k, O+ o
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);+ V4 K: L* D1 [: J) o4 Q( w( d

( j7 t3 @' R$ Y, b2 o7 X    // 禁用错误控制事件
: e( u. k6 T) ?6 f    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);  Y  x" r6 o3 u1 y# R6 E6 [9 n
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
, C  q2 S6 ~& i4 B- V! I4 B/ {; ^' a) j) j
    // 事件触发配置0 I2 u5 k9 b1 ]
    // 每三次事件发生产生中断* I. h  g) w' t# e2 K
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);& g# G% Z" a- L5 i
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件8 r* y1 M7 @" `! J. V; _
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);- M+ [% h3 g+ H& a( s9 j
    // 使能中断# o/ T* |7 |( L* n1 ^! w
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
) q# N: [, r7 a$ T3 b' b! n2 Z- j/ |
! _% O/ V! E$ A- z    // 禁用高精度子模块* o3 ?. e( }) \
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);9 _7 B/ U  v" j9 x4 w+ Q: @
/ o' p1 t) Y5 K) `3 W! d$ Z
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);' }7 k7 [! R, z/ A) S3 ]; G
}2 T' }) g( q1 v! V4 Y/ q) E
; W3 Z( H- `& b! M" O# ?
void ChopperWaveform(void)
! k; C0 Q3 W- U{) ]! x* n2 [$ Z* ]+ g$ }1 U
    // 50% 占空比
1 A" R7 N5 b- N2 l( G& b' [; }3 @! E& ^    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);3 L2 s. Z' B7 v- w/ W! L# k2 Q
    // 4 分频- s) s' M# {" N! a
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);; t$ W# K: S- k
    // 单个脉冲宽度# N: m/ w5 @* e$ }# A$ z, ?8 [) @
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
5 ~0 L2 Z/ a. O. L! r    // 使能斩波子模块" y5 U: o5 i/ R/ Q7 i
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
  t$ _+ K: H7 B, I+ B}% M% C* U! L3 e

0 a( g2 y& f% Z0 R. o/****************************************************************************/
: V) i1 G$ ~4 u* I: D& y9 l/*                                                                          */5 Y0 I7 t- |& i* Q
/*              PWM 中断初始化                                              */9 r$ `, U1 Y6 M8 g+ |+ ~( I$ p
/*                                                                          */" z4 l7 M* t" Z; M% r( @5 ~! X1 M
/****************************************************************************/
- o; ^* `* v& S( {) V4 m: p; Avoid PWMInterruptInit(void)
7 W) {# O4 P8 M! u- }{4 S  r; D% q* ^; r) u
        // 注册中断服务函数
" b9 c' O5 U. e  o9 p        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
! |0 @/ h9 S4 M1 F7 t2 W1 h        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
% O6 S% Q" N: g  x+ Q& Z) M. Q5 s
        // 映射中断  m! I0 \1 o! L, s% k3 S; b4 Q
        IntChannelSet(SYS_INT_EHRPWM1, 2);/ m% G9 j2 K2 u
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
8 F5 e' e9 M% H5 t# j8 Q
% {. R+ {; a1 r* |1 E3 e$ X        // 使能中断" v* d; x5 k6 u5 Y7 L
        IntSystemEnable(SYS_INT_EHRPWM1);2 D2 H/ e  x& n) i3 @
        IntSystemEnable(SYS_INT_EHRPWM1TZ);0 L6 Q2 [& w5 g
}
8 y0 w& R# U: e# V( M+ r5 U5 z  g7 D6 z+ v; W; q2 V# @1 f
/****************************************************************************/* g& `+ M/ [( {
/*                                                                          */
) `4 p& {2 q# @# M7 _$ w/ x( N3 H  j/*              ARM 中断初始化                                              */# w0 c' x" ]/ z( j( d$ s1 L
/*                                                                          */
; o5 X0 s; G- J; q, D/****************************************************************************/
! C, i8 o! a; Tvoid InterruptInit(void)7 J! N. u. x0 y' z
{# t" |6 B2 y1 }/ X
        // 初始化 ARM 中断控制器6 Q  k! ~; q& I3 G0 g
        IntAINTCInit();
5 E5 t  I4 z: l: `! P; l. @) S
        // 使能 IRQ(CPSR); B1 `% L- b' u
        IntMasterIRQEnable();
+ i. u9 c- C, n) b
, F$ e4 w! D  @3 \& T        // 使能中断(AINTC GER)0 o2 m3 t9 r6 w# I3 ~
        IntGlobalEnable();
4 k9 b5 s1 i8 M- l( Y" E, i* Y& Z/ t* U7 p$ P+ ~, F" G5 _! |
        // 使能中断(AINTC HIER)! E" }* G) W! S* ~7 c! m/ H
        IntIRQEnable();
) ^. y' ?! q- V$ ^$ Y( i1 Q( B}
% f! _5 A% f! V" i6 I" d9 V* I
* s6 N, D' q' H2 H7 a
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/
* e" Q% D9 i: s% K* f4 K/*                                                                          */; S. F8 _! X9 ?4 x- _8 ~$ Z
/*              中断服务函数                                                */2 L; T: J4 u/ k. b- I" D
/*                                                                          */* a, d0 |! q5 ]
/****************************************************************************/
1 a! P$ U6 [3 Y2 Y; p6 _" p) i$ Zvoid PWMEventIsr(void)
. v, \9 K* p6 u8 \0 a# C8 e, W: k( p{5 d+ @$ J9 `# g0 `4 b$ b  U. Z
        IntSystemStatusClear(SYS_INT_EHRPWM1);
, @4 m) o& X" `# t* i) \  v2 V6 s9 M- B
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
6 B0 n) s8 K' ?}
: ?" x0 W4 G; p, K6 h, Q  z
  K- K. h6 D: A' ]void PWMTZIsr(void)7 u0 z* ^" Z, f+ [$ w! @7 L( ~
{) ?9 J' {6 r% J" r
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);% h0 U0 }9 u6 z
: l: F5 g6 f; {% @
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);& m8 b' s( J' e) e
}
$ _# c" L: A# W- m- Z: z3 t3 D7 P/ j) O+ G# R0 D
/****************************************************************************/. {5 ]2 D: l0 f1 T& P' j8 }
/*                                                                          */1 k7 J- e% P+ f3 f! z9 z/ E
/*              初始化捕获模块                                              */
' [4 L2 t+ p4 \* V- Z2 m/*                                                                          */
0 o2 ^3 f3 }) u  {8 Y# P' P% F/****************************************************************************/
5 u4 c3 E3 n$ d5 _& kvoid ECAPInit(void)
: C0 C$ R" y( r. i. W. [! A{3 r+ r( R& C( C/ P
        /*-----设置 ECCTL1-----*/
# l/ h+ r  V& ]; i3 J        // 使能CAP寄存器装载
- [  l3 ~( D! L& c' s# G+ o        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
# h3 y$ i: D$ |& q8 h        // 设置预分频值.
! \8 X* J. {% ~1 n% O        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);: i# n0 @0 L/ Y0 ]8 A- G, J. Q% ~! P
        // 上升沿触发捕获事件6 i" r9 `% I4 H/ N3 C. R3 |# c
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);; n" g: ?9 O0 J& z1 Q, B) `
        // 输入捕获后重新装载计数器值.
, E7 M6 `& u# Y! A: @, N, n        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);% C$ h! l" j: \, ]7 z# T3 d3 |' g

" T( Y- j5 N! F& ?9 H8 @8 {( v! u        /*-----设置 ECCTL2-----*/
# z% \. _- `2 Q2 L) C9 ^5 {5 |        // 连续模式
  [) b- b$ P* G7 g0 o, F- e        ECAPContinousModeConfig(SOC_ECAP_2_REGS);8 o  [, X9 W4 Y) K7 b$ ~- @& [1 s, [
        // ECAP计数器TSCTR持续计数. T# q+ ?( E# o$ F
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);3 s- j4 {) t" f: F; X$ E
        // 禁用同步输出和同步输入& `% e2 R9 }4 ?: S  J' k
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);7 V6 `, `* ]. O
        // 配置 ECAP 2 为 CAPTURE 模式
; E: C  x/ U+ o6 Q  A* F        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);7 j3 b2 f; r  r" E. i: w

6 w* g6 N* _6 k$ t        // 使能中断' q8 b6 n' h" X% n# s7 a
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
( S4 o4 P5 x* w6 t: ~) b2 C8 |}
! \$ l7 K0 C2 }# p3 v9 ~, F' Y! C1 L8 {% e  }
/****************************************************************************/2 |# @. n  i% V
/*                                                                          */
) j! e4 p4 O7 J$ }1 O7 ~3 b3 L/*              取得捕获结果                                                */! E9 I" E: H1 D
/*                                                                          */. R0 O4 l, G6 a8 U3 x, a( N/ N
/****************************************************************************/- k+ W$ h: X" N- R5 [
unsigned int ECAPRead(void)5 f& N0 E' r3 Q8 S' I# x
{) b( M" V7 K4 t8 s3 M' H5 @7 Z* V
        unsigned int capvalue;0 g  Q6 i% H) I# Z& T
        unsigned long frequency;
/ W- `2 k6 q% P+ F/ J6 u
) i' M& s! p, J! l5 I        // Event1 中断标志
6 i* H, o$ @  W        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
" C* B# I9 C  R$ |! f; {2 I3 @        {
$ n: x6 Q, H9 E8 j                // 取得捕获计数
; F6 L/ u, Q8 \) X8 \                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);% y# q, y  V& J: M( l
                capvalue = ECAPResult.cap1;" Y& x' W8 `- s" X( {

9 Y4 W" }; Y( F' D6 \                // CAPTRUE 模块 228M 时钟主频$ x  b- d$ w' w) X5 j
                frequency  =  228000000/capvalue;
% X! d, W# b( t+ X                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
$ z* C5 @! U* f+ P- W
; \" F3 ]1 J# I& ^. D                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
* w9 g* m, y& k/ d//                IntEventClear(SYS_INT_ECAP2);
2 U% C& `8 g& r6 O7 N* u) _+ K        }
0 ?" x! n" s* J) W% [        return frequency;7 R$ ^2 w. i* h! u
}
5 n5 V! e' S2 C8 ]* _
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。8 B) @, U8 i" q0 B7 y, [+ T
[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