嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
( g/ O9 m' R) ]! Z# c
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
" \; O5 Y9 b- y3 b  r/*                                                                          */2 H. ?4 j) s0 l2 e# p& \- s. Z
/*              宏定义                                                      */) s6 b, I" i$ h
/*                                                                          */  u$ H5 K; i( T& V
/****************************************************************************/5 j* f3 q( C2 q* W8 k, N. g
// 软件断点4 B: |5 A1 u+ U. _
#define SW_BREAKPOINT     asm(" SWBP 0 ");
. u) O6 y/ b4 t4 u* L* _
1 h. M, }- t  D/ Q. w/ |7 H// 时钟分频- |, O) R" {9 ~8 c7 }
#define CLOCK_DIV_VAL     228* Y7 R! A* ~. a; Z

; p5 z  H2 H1 Y/ n  O/****************************************************************************/$ C7 r  a$ a8 P  M
/*                                                                          */9 b9 |$ K$ ?* M' ?
/*              全局变量                                                    */) R6 {2 `, R* b5 e+ Z
/*                                                                          */
$ P/ T7 @% B- y0 y$ {/****************************************************************************/- N! N' w7 Z* X9 n( v' Z( v
ECAPCONTEXT ECAPResult;8 Z; X; }; u) F+ j+ P5 T% \1 N

& X* v. A- B3 j. V/****************************************************************************/# y- r! B- a) C) R- p
/*                                                                          */
9 P6 C- }3 `  s7 H! o7 A9 G5 ]) M/*              函数声明                                                    */% ]( [; c2 e0 y0 Y. H/ u
/*                                                                          */& `" q3 V- \# U
/****************************************************************************/+ n1 a' U; }2 E
// 外设使能配置  z% b5 L# [, Z- S# \0 y! P
void PSCInit(void);7 S1 f; y- g% q6 D8 r# B1 m0 |7 |  E+ Z
; g* U& I, P4 v
// GPIO 管脚复用配置9 }3 A7 x5 U/ }9 O9 }& v
void GPIOBankPinMuxSet();
$ G; C3 i( t0 t  x" T) L0 r% m- E2 j& |9 v: v$ D; a  a: n9 U
// 产生波形. C; z: v5 T( Z9 y5 f& E/ v5 u: y4 L
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
$ w* p$ Z7 _4 j0 U) e. I- _# mvoid ChopperWaveform(void);, ~- G4 Q3 n9 h3 s8 r! b' l# b+ [' W6 Y

. V  g* P4 V4 Y// ECAP初始化和读函数6 @, M+ ?- o# w1 s0 ]* V
void ECAPInit(void);1 K% t! b  b8 z: C
unsigned int ECAPRead(void);! b5 @! X- d9 z4 O
5 G& p+ ~+ q9 S$ M
//ARM 中断初始化
. s6 N& p1 Y7 t; M3 U3 fvoid InterruptInit(void);
8 Y) x5 j. S! p! }  }8 ^
. i1 W* P6 u; `+ V+ }% s+ g4 ]// PWM 中断初始化9 C$ ^1 V9 |- {5 W- o
void PWMInterruptInit(void);! Z9 b6 h4 t1 m$ o3 c
// 中断服务函数$ Y2 z% {8 T( o3 c9 o$ I) g
// PWM 事件
% J2 L& Y, Y; Zvoid PWMEventIsr(void);; V$ @/ f, l6 N- `& b
// PWM 错误控制事件
+ _8 N; f; e& W1 rvoid PWMTZIsr(void);
4 U( s+ b# J9 s, p$ R$ c4 f8 u* y) d: n7 n
/****************************************************************************/
' n6 F% ?3 O) d. T/*                                                                          */$ @% |$ @& ]: e; @+ \$ o. J8 P* H8 `
/*              主函数                                                      */8 B* d: r4 b$ U" |
/*                                                                          */
  k4 K1 F+ I* l( Z: G6 ?8 d* p/****************************************************************************/
' K2 E6 @1 E* n+ M9 H9 r) G+ [& A( tint main(void)% @: b9 T  x4 K6 Y' T0 v5 T
{% e4 f2 \; z9 Q
        // 外设使能配置& _9 p  }2 x9 t6 Q
        PSCInit();
5 s6 ^4 ]- q& a0 C& Q: K4 [, K; K# _* x1 p& K
        // 初始化串口终端 使用串口2
$ ?9 R2 b1 ?% r, H+ k        UARTStdioInit();$ k; D0 }& L1 ~3 m" T9 o
       
  a" F$ Y. _: J) ]# X# Q$ M        // GPIO 管脚复用配置
) e; b0 b# i8 C' ]3 B        GPIOBankPinMuxSet();& u& U' b; K3 E0 b. @

8 p3 S& q( P( b3 w5 P        // ARM 中断初始化
  z% j8 {( F" t; k: a$ _, v% x        InterruptInit();
. k/ E) Z6 z9 D8 y' V3 _) h7 b/ J: Z1 o
        // PWM 中断初始化
0 h( Y4 @8 a. [# a3 n        PWMInterruptInit();8 C2 Y& D* s$ K0 s& n* Z* e( T- c

, H$ C& e% R- K9 t( x        unsigned char i;* G; s2 c9 ?7 P6 O! y. B, ~
        unsigned int j;3 J: J1 d8 U4 h1 t1 \& y7 O/ J

7 x" C. ]% ^: [: Q/ `        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
( s8 L+ y' `2 T' ^, |+ z; J        UARTPuts("------------------------------------------------------------\r\n", -1);
7 j7 `" N$ B9 M        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);. p' S' }. k$ l% i4 H
        // 产生波形# K& V6 x" ]" S# I4 v7 n+ K. U
        PWM1ABasic(25000,50);3 {" c1 x* u9 H' f
0 d0 |: u4 |5 R3 a6 f6 H
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
0 c$ C6 w1 v3 k% b& s        UARTPuts("------------------------------------------------------------\r\n", -1);
* C4 P- |: D7 X/ s# {) b8 b5 Q
1 c! y9 I+ @7 |" l' \  m
/ m* p: V& z7 G) i) z) g& R) W( D* l0 s8 w
        UARTPuts("------------------------------------------------------------\r\n", -1);
. B! |, x3 J6 d) r        UARTPuts("                    C6748 ECAP Test\r\n", -1);
2 |( w2 [9 p1 D0 A5 m% Q        // ECAP 捕获初始化9 a3 [# o3 M2 Z; U& Z7 a
        ECAPInit();/ J* \$ ^$ B6 u8 X
        UARTPuts("Initialize ECAP.......\r\n",-1);) S: T+ a- _: E5 F
        for(i=0;i<5;i++)% {* Q5 C' D$ q( c% b2 [# i  l
        {
) X% o4 z' d* y# b4 x* H                    for(j=0x00FFFFFF;j>0;j--);            // 延时2 U. R& Y. q* ?9 d; I5 y$ s- U
                    ECAPRead();7 f; M  U4 w$ L' x- D
        }
; V, Z' O- ?4 v7 L5 e        UARTPuts("\r\n",-1);3 A# y3 b4 H$ l
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);- i+ c+ `% K+ X$ A, ~: ?4 A$ ^
        UARTPuts("------------------------------------------------------------\r\n", -1);1 D3 u$ K  i7 V0 J0 T$ {

, S/ u5 T2 B2 e% X7 `% S        // 主循环& L; w8 ^! K6 ]
        for(;;)
# T5 C* x' e4 y$ S8 ]( M' u        {9 E% U: O8 j2 L/ ]/ C  `/ O# x

/ P+ [8 T$ Z# M* ?        }* o1 B$ g6 C) O% m/ z4 e! P* F
}' F" D% `  S( E

  q3 J; |9 _8 R! p, a7 M5 j0 U/****************************************************************************/8 i& g/ d5 B! L2 J7 k  E. b! E, r
/*                                                                          */7 D( j% x" z% \7 O7 N7 i" T  m
/*              PSC 初始化                                                  */* Y) |# {1 M, T5 q2 y& y
/*                                                                          */
4 q: {  s6 t0 Z) Y! k/****************************************************************************/
. P6 Y/ s6 {, m# ?void PSCInit(void)
2 @3 n2 j3 E6 G; N7 \$ z{
9 i! k- v& }: H5 W) q9 n2 e5 H        // 使能  EHRPWM 和 ECAP 模块
' T, G/ v8 u0 C" Y9 g        // 对相应外设模块的使能也可以在 BootLoader 中完成
- t& @+ w$ ]/ {2 q/ U; w6 {! [    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
, N; R9 v- d9 I% q    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
& G7 u- a* n& w/ q9 \: n}
0 q7 Q+ r  }: b$ `& _+ T0 P* p" `: Z) ]
/****************************************************************************/  I& S7 J9 }; q: r
/*                                                                          */
/ y! ]) ?) l. ]2 I2 J+ `$ A' @/*              GPIO 管脚复用配置                                           */# K* O4 D3 [- q. w  u8 {# d% k
/*                                                                          */
# u. F/ ~' H4 F# y8 ]7 a8 K' E2 y/****************************************************************************/: v" \7 d4 ?* Y9 g/ c# t  U2 _
void GPIOBankPinMuxSet(void)
; m  M. m" X5 t{" y' N( N) N* m! Y6 e3 a6 [
        EHRPWM1PinMuxSetup();. A( ~$ O$ B! P

' K" v9 Z. E: T  n        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
& U3 L; I+ C. }3 Y& i  `        // 作为捕获功能时管脚方向为输入
: j1 I3 a" i4 d/ Y        // 作为辅助脉宽调制时管脚方向为输出, V/ {5 U! F7 }
    // ECAP2 / APWM2
4 W: T% X- W1 {: H        ECAPPinMuxSetup(2);
0 q. a; B. @. |9 B2 g. M
6 y$ r( Q+ T# U        // ECAP2 / APWM2方向设置为输入
' Z! B0 x8 g  |0 M  j* K0 e" Y        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
( ]& R. e. N/ G( }% ]% B}
6 D) \/ v% Z  ^* i! c) K
: V8 F1 C' x' V9 {3 U/****************************************************************************/
0 V, J$ V5 Z) J/*                                                                          */
( M# v/ `( T. G: Y" h4 T/*              PWM 输出波形                                                */' u- M3 i6 D' w! v6 s% m6 k5 c
/*                                                                          */
. e, i9 U7 u4 W0 @& P' }/****************************************************************************/
- q1 z# ~3 g. [+ Z* O* r: Evoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)8 j! n2 ~; ]. R% [5 e& @7 P2 v& C) |
{
( s) S& g& g1 y' \0 h% |    // 时间基准配置
( g: [% U# h% m. D8 |; M, @    // 时钟配置
2 X* Y! Y: P. k- Z/ q    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);9 `) W! ^2 n0 J6 J. E) E; h! ?8 L$ N

; j1 q  v1 ^% u. O7 {# t    // 配置周期
& l3 ~. ]* p( l! j6 y    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
+ e* W2 m8 T' E& s) t0 e                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);4 p) O# i% [& I* t, K

5 t- e% a! E; a, ?# w1 Z    // 禁用输入同步信号6 j7 Q1 ~; D7 G% z/ i1 u: Z
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);- e, M0 D7 y) O0 v0 ?% t
- [6 }) n" b/ B4 V- Y
    // 禁用输出同步信号
- C8 l! Q' u7 `4 {0 O    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);# \- M% K! L- J1 {

; \% P5 D0 I1 j    // 仿真(DEBUG)模式行为配置
) f2 [% {, P1 k$ O# x    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);* S0 p; f8 L& o' ~2 `! j" o8 g

7 M1 f( ^2 Z1 b. w    // 配置计数比较器子模块; i, M# L4 B; g! k9 E
    // 加载比较器 A 值% D' `% c- g! w8 Y% \$ p
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
9 G8 P& h  E2 K+ c( C8 O                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
+ i/ n, S4 G: \9 w# V; ^' y$ m& j- u3 T0 x# V
    // 加载比较器 B 值
  c2 Q- B# a9 S& y: K! P! z* K    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,) }1 L' a9 Q+ V7 G0 @
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
! B& K. m/ x4 b, T% w( q2 d/ F' d3 |; m3 Y$ V
    // 功能限定配置(输出引脚触发方式设定)/ A1 B$ q' ], y0 L9 u3 ?/ C; Z& S
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出2 c" Y- ^% Z" c! T2 R  E2 I
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,9 n% V$ l  F& m( {) G
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,2 [9 ?4 C% {, E
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);) @) r2 q1 K: p

7 J# u0 n) j) r3 d  z    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
( ~- l4 ^# I2 M+ ~, k    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
# p4 D, z1 _2 }
# W$ i: @3 z; p7 Y    // 禁用斩波子模块
. p% t) \2 W; {' q8 p    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
1 _3 w% a1 B6 p: ~& i2 h* h# Q0 d, h6 r/ h
    // 禁用错误控制事件
0 j& I, g5 W" R8 r1 s( s5 u( _    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
2 Z6 Y' a$ W1 f3 N6 U$ Q    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);3 O9 M) L! Y( g$ t

' j- [! S9 d/ F" K0 H; C) d: C    // 事件触发配置! o7 C) G6 W5 W  Q
    // 每三次事件发生产生中断$ d; v, i) o7 J8 a5 Q# W9 f  p
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
; N. v5 N4 V- }6 P: i" Z, I    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件" j2 L% y0 Q- t
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
8 Y" n, ]3 y  c. B9 G    // 使能中断
/ n- q; }9 h  `7 D2 U. J4 ~    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);# R. t& ]" i( X. L# E( W
% z0 n) \. t/ U( q; _
    // 禁用高精度子模块
- N1 d" l; A# z1 q/ F    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);8 }5 E7 g7 N1 f* _0 n
$ K& a8 Y, Y! ~' C* X
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);5 N7 E, t7 _& m: A
}) j! k. w. n% k9 ^& `9 [% t. g

- j, G5 y* G+ k7 v9 a- U& y' fvoid ChopperWaveform(void)6 l/ V5 q2 W* x( W, I7 x
{
9 m9 ]# L, E+ K3 n4 Q/ l    // 50% 占空比
& s+ `6 ?2 e  {8 I    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
/ ~, I  g' X0 F% b) f& r    // 4 分频: F- Q' }8 F9 k- U1 j+ s3 D
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);5 C( d4 f1 m: e" j& d2 h
    // 单个脉冲宽度
- q& y0 P5 T: H! k    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);/ K3 `+ I/ A2 @/ W5 s. ^0 p
    // 使能斩波子模块# \6 J% ?, B2 ~6 c: x
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);! f! F# g- E% v$ i" u' s6 X# M! U
}
1 g/ b$ U- N! i5 q6 \; y; M
8 T/ g8 k% |% v; q1 H  |4 Q$ C/****************************************************************************/% D" ]3 p' ?& _( ~# [
/*                                                                          */
0 c# y" ]9 e9 `  X/*              PWM 中断初始化                                              */* O# n. ]8 a) `! U: [
/*                                                                          */: }0 j  X* x5 F8 z8 ?8 v) Q
/****************************************************************************/
8 v& v: T  [* C. ?$ U4 Yvoid PWMInterruptInit(void). E3 F% T% M4 B0 {1 T: ]
{. e% f8 k; x" B7 i4 I# g3 m
        // 注册中断服务函数7 _' H2 T* b9 E* `$ p! @8 `+ A. j
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);8 a$ N+ K3 W( b* |/ {
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
  l% F/ W- v( ]! x! w! _' P% n" ^" e; t  l# n. C' d" u8 x
        // 映射中断
2 ]% a# y" c, ]$ n        IntChannelSet(SYS_INT_EHRPWM1, 2);
( w3 t  U$ o$ d        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
) e2 B/ U8 M: Q+ g7 W8 @; S7 F
, d7 O; {! M  @0 O7 \! D2 g        // 使能中断& ]5 S! N- Q7 K+ }: O& G5 i
        IntSystemEnable(SYS_INT_EHRPWM1);
9 w' O; V9 i$ r( A: S( U+ A5 w        IntSystemEnable(SYS_INT_EHRPWM1TZ);
4 Y; l$ i) R, {! @! e9 e. n) z}
4 a; e; h7 v# T) F+ G9 n& o. _9 l' V
/****************************************************************************/- ^1 n5 a5 ]% B9 r0 A9 v( t
/*                                                                          */0 t7 J/ M9 U$ [- z
/*              ARM 中断初始化                                              */( w; x* }9 K9 I6 ]7 o
/*                                                                          */* q- j8 C; ?& t! A8 N
/****************************************************************************/
: o! O" y3 s2 r) Gvoid InterruptInit(void)
: V! b% E5 k, h{2 X' ^( S) Y/ u, A, ?1 ]. y9 O9 q
        // 初始化 ARM 中断控制器
5 T5 `+ m9 ?; x$ q  |1 t% t        IntAINTCInit();  J: g  @3 n/ i2 ?6 ^" n; U* ]# f9 X

) V; w  T' |8 i2 C6 c- ~        // 使能 IRQ(CPSR)
" H! [6 ]1 X% w! q; l. c3 l* x        IntMasterIRQEnable();$ r: f$ T; p$ ?7 `( l- q( m
1 d+ r1 l% E! \* T- y
        // 使能中断(AINTC GER)" J. a0 U6 r( m
        IntGlobalEnable();
$ |- ~( p  f: j7 m+ x- j
6 |& k, G$ N6 A5 E# {6 R0 @        // 使能中断(AINTC HIER); \3 V5 B+ Y- V1 ]
        IntIRQEnable();
0 Z' H( ]4 m9 S9 c; n- ~}
, L8 t5 H5 ^9 o# ?( A; m
& X0 f. r) o8 Q* @  i$ w, z2 F) Q
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/+ W; Y' B) E0 x
/*                                                                          */% K1 t# p, }5 V
/*              中断服务函数                                                */
+ _# R! m' x' J/*                                                                          */9 A, Z0 T9 _( B9 ?1 R
/****************************************************************************/
% a8 T) a  U4 D, w/ I% Ivoid PWMEventIsr(void)
  N9 ?$ n5 y3 ~* C{4 g3 t  q6 V* S: l, M
        IntSystemStatusClear(SYS_INT_EHRPWM1);
! [( t) z: H% n4 r- o
; r: n# H2 \- b/ Q. ^' a% Q% c+ q4 L    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);3 X, k/ X4 V# `  ~, g5 M% r0 Z* {
}
3 Q4 }/ w2 r/ O; ~) ^  ^  K% Z& ]; X% Q9 n% i
void PWMTZIsr(void)5 B% ~& O% A! i5 W/ v4 w2 J5 {
{
  R$ u8 O0 I: `) F        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);9 k# p1 U& n3 w, O' {* \

8 ?5 J/ |$ s( P7 A    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
# y9 T( @4 {5 v- o9 |9 d" j}
8 v2 n/ r2 c9 ?
- ~1 V0 b; T/ @& o/****************************************************************************/
: Q4 d+ p+ m4 E, }, E4 z6 A/*                                                                          */; Y  d5 u  X4 X3 T
/*              初始化捕获模块                                              */5 }' e, n; w$ [1 M: A
/*                                                                          */  [# M' p% G$ W, k
/****************************************************************************/
3 s" I2 g" H  D% L7 ~: Xvoid ECAPInit(void)4 f9 g) E6 c: e$ f, A
{
( L3 i7 T* c- |" B+ B6 n$ E. H! g        /*-----设置 ECCTL1-----*/
  t2 F7 P! H, Z/ g2 N2 [- b        // 使能CAP寄存器装载
% i6 D3 ?- F* P+ v, t% w0 U  n1 {- K        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
9 o6 p: _8 p# o6 C        // 设置预分频值.
" f" ^, p1 {1 F* T) }+ L        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);0 H/ I! W! ?/ j- y4 M0 v5 D
        // 上升沿触发捕获事件6 b% S- w7 n4 L# s2 S) |
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
! t, L  [) h+ ]& b4 Y6 ^* g, t        // 输入捕获后重新装载计数器值.
5 q+ b7 {4 B: D+ K7 m        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);6 D2 H6 J& J7 ~9 S( K# @' g
" O  ^0 T" S+ s" x
        /*-----设置 ECCTL2-----*/* m4 }9 d" P: D9 P
        // 连续模式) I8 i4 T/ [! B& B  j( w
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);, a9 S+ v5 b7 I2 m5 h
        // ECAP计数器TSCTR持续计数
2 \5 a0 r+ v: o% q  D, k        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
  P+ r2 L7 Q9 D& ~% Q3 ?        // 禁用同步输出和同步输入% j2 B3 [3 P4 j6 ^! {
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
& p+ Q. W* y; P6 o1 }4 n        // 配置 ECAP 2 为 CAPTURE 模式
: x" F2 _3 e6 |" n/ J1 [# b- }        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);3 t; X0 {( ^" j* n, |
1 Z  F8 q* u. c% F' g
        // 使能中断  D3 E6 H; ~' x/ B$ q* a/ r+ M8 W
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
8 u5 w4 B1 E# ^+ k}* a. d0 y$ ~6 k8 l
# A. X8 L) \, A1 D
/****************************************************************************/+ p+ Z- w" r; A+ w8 z
/*                                                                          */7 W% G9 U" R7 V9 O
/*              取得捕获结果                                                */2 H, K* ~7 Z3 G; p% h& p7 f& O
/*                                                                          */, `, G" L& t# [2 Y
/****************************************************************************/$ Y# ]" G: c0 N/ d
unsigned int ECAPRead(void)
* I, m" |" u. H2 t# C{& V0 E' E8 j' ^& m" i! I5 |$ S
        unsigned int capvalue;) [1 R2 C; H6 G
        unsigned long frequency;- a" }2 f+ b1 |5 _9 Y1 p+ _% [7 q
9 {& r( H. v5 @' A
        // Event1 中断标志5 \! a( a& Y3 C. W9 K1 d: R
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))* H/ [0 Y( e" d. l" u! s0 G$ f
        {
6 |' ~: P2 n9 M  i6 ]" s                // 取得捕获计数5 s. Z) V. E. t" N- f; i- c
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
( a5 n7 q* H% m. v7 D+ {                capvalue = ECAPResult.cap1;9 D' _1 K6 n- s" L8 @
  B% ^2 M  H' J& ]: p& [
                // CAPTRUE 模块 228M 时钟主频
: H/ m2 w2 L. Q" ^( a7 Z                frequency  =  228000000/capvalue;, T4 ^# x* g9 q
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
3 @9 S' n' f- y7 r; D6 n. n
" t6 s( C% U) V5 \$ y7 b& u                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);! b! ?7 z: A7 u6 E; }" l2 n
//                IntEventClear(SYS_INT_ECAP2);
  m: L" u2 m6 d( d        }- v' f' [  g$ o9 A/ o) s9 I; S
        return frequency;/ ]5 G  {2 ~8 e; x; F0 n
}
# ?% s/ {# x1 n5 j
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。# G5 `6 l3 P7 P
[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