嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家0 P+ m! y( U8 m0 p5 A. F' W+ _

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/- L% Y6 q. |* B! |( K+ |  d
/*                                                                          */8 o: g2 K' W7 D2 e1 e  x
/*              宏定义                                                      */
  T+ T; Y2 \& @: y, b. T/*                                                                          */; l9 n. g0 P; R0 z6 y
/****************************************************************************/% x* N  T4 A4 W
// 软件断点4 K: {* |, p: d6 E$ _
#define SW_BREAKPOINT     asm(" SWBP 0 ");1 x; F5 ]/ S1 o1 Z& a7 W

! J% V2 m3 g' |' k2 @& t" n// 时钟分频! s5 f$ |" Y# Z& K6 r* B: C0 A5 b
#define CLOCK_DIV_VAL     228
" a* M+ V* N# s) P' n3 L' o- i4 h3 B$ k) ]$ p9 b
/****************************************************************************/
  \" S7 I5 C7 K/ Z8 X3 |* Z  b" z4 |/*                                                                          */
7 a; Z' T" t5 f+ b5 L- X' Q! p/*              全局变量                                                    */
6 H$ p0 e' ?' Y  o0 H' a/ e+ [. ~/*                                                                          */* }: L0 p8 I% D- j, e, U/ x
/****************************************************************************/- I$ g- R5 P) q' |, c( R# b1 R% K
ECAPCONTEXT ECAPResult;
1 q9 o1 P% s8 i3 W, w; p- U5 e: t- ~5 Z- j5 r! Y" @1 p
/****************************************************************************/
: ]" M9 \9 J0 [: U1 B/*                                                                          */, i% P0 z2 ^6 a/ l
/*              函数声明                                                    */
$ u; b: C0 f1 r, H/*                                                                          */
: X( z# X, z& c1 T! G  j) Q. @/****************************************************************************/
" s. }/ V5 Q: l7 C, x9 J// 外设使能配置
" N- ^# s; q! _7 Gvoid PSCInit(void);( s! ?( V  @& H' q+ e; t0 Z, G
, K; V  j8 I' }
// GPIO 管脚复用配置2 Z) \; X, s4 w1 N9 \0 e
void GPIOBankPinMuxSet();
# X# O" d! u/ a) @9 q( S3 [# M% L' D( w  A( d
// 产生波形
2 U; v1 W' k8 gvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
4 p' C! y8 U* G' ~void ChopperWaveform(void);' P0 n# W' _6 B; ?, R! K

2 Y! _3 |, L5 z+ j  t// ECAP初始化和读函数) E/ V1 P; P5 w+ e: \  ^6 ]6 j
void ECAPInit(void);
& ?3 p5 h$ |) N. _unsigned int ECAPRead(void);
1 D8 Z# v: X) a
; y* x4 E" E% T, i8 C//ARM 中断初始化) c  F2 G8 W$ R! |
void InterruptInit(void);
6 g% B3 Y! j4 Z7 Q5 \% q# i+ Q& W4 h2 A0 a3 w  Y2 B
// PWM 中断初始化
; A6 k5 }( B0 B  I3 x* z0 R6 ?void PWMInterruptInit(void);5 X9 ~0 b- J% n5 ~  P0 L5 B: V1 d
// 中断服务函数
3 J, X; E6 B: p) u: h6 z// PWM 事件
5 C# q1 l) V/ Z9 V  u4 f2 X. {) Ovoid PWMEventIsr(void);
2 a: Y! r# o& y0 \/ J9 D// PWM 错误控制事件* Y: J4 c& k0 _
void PWMTZIsr(void);( _) T" x) B2 n3 h) B: y5 \0 ]
- G) Z. w1 t& E& e( o. @& \
/****************************************************************************/4 t2 x3 j1 }% _* `# p! m
/*                                                                          */
4 l/ h6 X. D1 N1 [6 `3 X: E5 m/*              主函数                                                      */4 V! `) r, K; {- ?' M' x/ z
/*                                                                          */
; {& [7 _3 }" ^6 [7 B" Z% f+ V9 d/****************************************************************************/. l6 K# Y! }& x8 o1 d: j/ g
int main(void)
: a2 X. X" t8 m6 t{' E0 N/ C* C  a6 l
        // 外设使能配置1 a9 S- R3 `, r" K6 O
        PSCInit();
/ U9 U) _6 F; i: p6 u# W0 k4 C) `; d+ J$ B
        // 初始化串口终端 使用串口2
% W8 M( D" ?  _        UARTStdioInit();
$ ~* M8 K9 g( I+ ~/ U1 k$ P        " q' ^% m+ T! {( s8 v
        // GPIO 管脚复用配置( a3 J4 d+ H( M1 P  h
        GPIOBankPinMuxSet();8 e3 I! Q- F6 X  ^- S1 `

# M- @/ Y, m- S( r; z) P  a/ N! u        // ARM 中断初始化
( [, {) j/ z' \2 a8 T7 ?        InterruptInit();$ g& r# Z. J, i1 v

2 @% o$ r1 ?$ [/ `0 T  [! J- u) I        // PWM 中断初始化
/ L- [2 U) Y& T0 @4 J: H, N        PWMInterruptInit();' z/ q" V: x" n- O$ a, q
- ^! L- R9 p! D1 q8 i2 O2 K
        unsigned char i;
4 X1 p3 J# b& i7 U; Y2 l* S        unsigned int j;
/ ^, C# }3 q. h
& u# q4 K2 q6 S3 ]( U        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
9 j! H  D( x$ O+ v        UARTPuts("------------------------------------------------------------\r\n", -1);0 y6 }; W( I9 G/ q$ g; s1 t8 \( w
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
* Z! ~9 `2 c/ L% y7 K/ l        // 产生波形0 z( H# C  o6 n9 e
        PWM1ABasic(25000,50);
* k3 k& E5 _/ n9 ^' o: ]4 z
2 `& V. b  E; ?2 t        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
2 H/ b7 A% y4 Q8 v% u1 D7 W        UARTPuts("------------------------------------------------------------\r\n", -1);* ]' J! ~# e+ d& }

! D! `$ l2 E; A( ]7 G% V, }0 n* ?/ X& p3 t& {) d% S

9 `; C6 `' p! |: @; n4 p& U        UARTPuts("------------------------------------------------------------\r\n", -1);
  d/ ^0 r7 l9 N1 z/ Z! k        UARTPuts("                    C6748 ECAP Test\r\n", -1);
+ A' f' a8 ~2 A( r8 s8 V        // ECAP 捕获初始化
! c( C& _/ L) ]9 j        ECAPInit();  f  b2 p7 w) A% L
        UARTPuts("Initialize ECAP.......\r\n",-1);
1 ?. H0 m& g8 P2 U" q# L0 |        for(i=0;i<5;i++)3 z) u$ Z4 ~  z
        {% i; o: s& q6 W# _6 K
                    for(j=0x00FFFFFF;j>0;j--);            // 延时0 P# l# c& P  C1 d" W; _# C
                    ECAPRead();4 s. d2 `7 |* F) ^# \5 v
        }8 s# d; E2 d3 d/ G
        UARTPuts("\r\n",-1);
9 y' s" u) V- _) ]/ ~  h2 V        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
5 Y$ T1 |! |- N8 |        UARTPuts("------------------------------------------------------------\r\n", -1);
; u- n8 ^, l: e& [% r2 o& J; @1 h$ ]& y
        // 主循环
$ W* z7 m; |% R5 p) M        for(;;)
5 \4 k% {* r6 n6 y        {
( N0 E3 n- L4 e: b0 `) }& m
3 B$ H) Y: M- S2 s  X& F2 p% R        }
. Y. Q0 i/ v3 L: _* e$ ?}
: [+ F0 ^& }0 A( S' A* g" n, I
: i& i5 L" ?' W9 ]; a/****************************************************************************/
0 k: j. m9 U  X, ?/*                                                                          */
- ^% w) N! |" x/ \1 Z8 b/*              PSC 初始化                                                  */2 M0 L3 W( ?& X; }7 ]( o$ D
/*                                                                          */
6 q6 u4 ]# ]" H& V! t, c/****************************************************************************/  _' A% A! l. t$ f( i- [- ]
void PSCInit(void)
2 E( b1 R& ^" K- ], b{
* B  `: l5 W5 i7 }( c/ W2 H; ?        // 使能  EHRPWM 和 ECAP 模块5 _1 a+ Y0 a5 U7 {
        // 对相应外设模块的使能也可以在 BootLoader 中完成9 U/ Z) I, I- `, h( T
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
% b! F7 E* ?% S1 S  }) D' o1 J    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
1 d! |' F/ J" |! B4 a}
  F' [. i9 _& F! y6 I* B* R7 B' l, w0 T6 u+ R
/****************************************************************************/0 v6 m5 K1 Y  z. Z1 j7 v/ ~
/*                                                                          */* x8 a2 M- |, Q) L' K6 A
/*              GPIO 管脚复用配置                                           */$ I1 u9 F" h) d2 e* N" L5 I8 D
/*                                                                          */
, M6 x% V0 X; V, w! z2 f* i/****************************************************************************/
% Q( O' d" f8 f; s+ H: j1 ~void GPIOBankPinMuxSet(void)
" g5 w6 i/ I/ H& _$ F: J! f{
# S2 n& u# L- A0 J9 G6 s        EHRPWM1PinMuxSetup();
4 z0 P% T% B+ m0 T! r$ e
0 i6 Z! C+ L+ w+ u        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
# @2 v5 ^& J/ R9 K9 a        // 作为捕获功能时管脚方向为输入* X: C2 f/ ^; l
        // 作为辅助脉宽调制时管脚方向为输出5 y9 j4 D8 ^: s* n6 Q! }
    // ECAP2 / APWM2
; o" Q4 A& b9 d* U. R- Y        ECAPPinMuxSetup(2);; G4 D  x$ B* ?+ n
$ c) A/ w; y$ s" a7 v% d
        // ECAP2 / APWM2方向设置为输入
2 y6 c* e- ~, h) |0 |        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
) t7 k9 |/ v3 c$ B) a3 x. A2 l}
3 b8 P' v7 g& r& u# ^, C$ ]' l( g- d$ o; R, d- C: v& H& W" z
/****************************************************************************/* z) n2 x. R( B; a# U. `# W
/*                                                                          */( p& t2 N! `; Z0 p! D( {7 d/ C
/*              PWM 输出波形                                                */& B+ c; T* F& L) n/ @+ j
/*                                                                          */5 Z% T) k- y2 p4 Q- y& S& A0 g: y
/****************************************************************************/. v) w) K( _1 X  i
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)- G9 W6 c0 A3 n/ N
{
9 a8 `2 |8 C9 e$ ?. p    // 时间基准配置1 o  a6 x+ u5 m
    // 时钟配置
( t4 Z) @3 U, _    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);6 K3 V& k, f3 `) Q) R. k, Z9 v

) W, t; A/ n: I+ q( O6 c    // 配置周期
( c/ u, E* T. l' |    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
' Q/ `, i" L$ c# ~7 I) W                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);) ]+ |1 W8 d4 J& z" P

& {5 y3 F, k0 O+ D    // 禁用输入同步信号
; n' ~# J+ C: Y. l$ b  R5 e    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);: q8 S( \5 d. {% J9 _

% }" k" \  |8 U/ V    // 禁用输出同步信号
$ W% d0 w! `. V( b; Z- r1 H    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
0 m; ^9 |4 m6 b/ j+ X5 h
" L7 E7 G& `. ^8 ?; j9 ]    // 仿真(DEBUG)模式行为配置& i& [2 G6 \: u1 B
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);5 j5 T/ |7 _$ `- \6 w
. c* Q. O: i( R3 h8 W+ T3 s
    // 配置计数比较器子模块) V, i% x& t; A2 b2 `' q4 O
    // 加载比较器 A 值
2 N) i" r% O# W! |% j% y    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
5 I% }4 S) L3 F5 W                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
1 V, F9 r( _+ \, o( Y+ y* p( M
/ [1 T4 r3 X% d* p7 I    // 加载比较器 B 值/ p# R( q# J" B4 s
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,; d, p2 j7 b' r
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
3 O5 H- u1 [3 O' z# ?3 b( [
; ?6 \; b' j: g  |9 V$ H    // 功能限定配置(输出引脚触发方式设定)- S, J6 d& E. V2 y" h( ^& ?: `3 I
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出. ~, P% u9 i$ ?3 ^  n4 L- w; L
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
9 z0 }8 J: m5 [! C$ a. X2 I2 \7 H                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE," W" ^; O5 d5 ^' N, y9 a( k3 @1 T- M0 C
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
7 T. Q2 S! J, l6 K5 M- M- o$ \
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块! U  `0 T, c9 x
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);& K5 A6 \- O) u) w
2 v4 d# y4 A* f9 Z" S
    // 禁用斩波子模块/ r/ F2 V% K+ c) n
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
- b* ^, f" j7 l
3 F# i: V$ B' J3 ^" I0 D$ \' @    // 禁用错误控制事件( B& T' x% l& y
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
5 q  |0 E' u6 V( Z& u    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);* m# w, q! D2 b9 n
$ y2 T6 s; y) ?% L* E9 V. p
    // 事件触发配置* S! I: A: r4 i3 J* K$ A- Q
    // 每三次事件发生产生中断
7 S+ Q( }7 e- u$ |    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);6 u6 W" y2 d  e# x* a: f4 V
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件) \) W4 U% W( u4 s+ r& \9 t% ]
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
7 N2 S7 E/ {+ T2 t    // 使能中断
8 y" m( k* X" q( y* w% I9 ~    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);6 V+ E7 w" g- d, o
! F+ c( S1 `5 A+ M6 m, O) S7 L
    // 禁用高精度子模块
; ^. U3 R/ c0 j  D' G    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
# `8 c5 C1 P! r) G$ q7 Y6 A) U. ^) j3 \' u' p
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
: u5 H# W" i3 o$ o* A}7 z1 b# C6 R4 K+ F1 s% T+ J

. S8 {" ~9 K5 l; |( v; }void ChopperWaveform(void)
' i1 ]# K3 C# t: j{
% t8 d$ ]( K/ X6 ?: a    // 50% 占空比
+ m; W' T5 u1 n. I    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);1 w& e" o; n/ u% P1 `" Y
    // 4 分频
0 @7 D8 J5 N6 c    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
' y4 u* b$ Y  ?! Z    // 单个脉冲宽度
* D) e& _* \$ ^* i1 i5 s    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);# H% F; [+ S" n" C  G" t. D0 c3 g
    // 使能斩波子模块- o" T2 N! g" t) @2 w# y
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);+ E; \& G7 s# E. e
}
# Q8 H. t- N0 g6 O& L6 G0 j. I2 h/ X* J
/****************************************************************************/
  v9 c' p1 W' X% x/*                                                                          *// N3 U4 B9 e( i( Y6 T( J' b
/*              PWM 中断初始化                                              */% W4 i2 P6 T) S1 `% ]- |/ g
/*                                                                          */
) _# D- s9 w5 o2 ]% Q8 W, i/****************************************************************************/3 K. N6 t! ~" R4 W* k. |4 w
void PWMInterruptInit(void)
1 L( @! h# D, x5 T5 _2 e8 C. Y{  o0 g0 u! b6 l* d8 U
        // 注册中断服务函数' G! G$ V0 G6 T, C7 |6 {
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
! r4 o3 d$ _9 n- P0 f        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);8 t& `& P' i+ l" V/ m

# _) T3 k0 o/ E/ G& o        // 映射中断
- K$ O. Q/ C& m% O' A! f& q        IntChannelSet(SYS_INT_EHRPWM1, 2);; u) ]- x3 r2 f- m8 U# h9 s. }% t
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);2 \0 B& v. K& C, D# P
9 D6 V1 r5 v7 `; G
        // 使能中断' i" w7 J4 W/ X/ M7 I  M: K7 N
        IntSystemEnable(SYS_INT_EHRPWM1);
% y4 Q, U/ u. K1 C* I        IntSystemEnable(SYS_INT_EHRPWM1TZ);; H% m4 w& u; c
}0 q5 O, P4 B/ x8 ?" \" r; P

' C: H; U' O* q# v/****************************************************************************/
7 h' D2 q. F7 N* L. L  G% X; Y/*                                                                          */! m) O3 Q+ L; o
/*              ARM 中断初始化                                              */, H0 V! {8 o' m: K3 P* J" @0 V
/*                                                                          */' j1 S* r0 ^3 N" d7 I% A; E" `+ z- D
/****************************************************************************/1 |" a! l+ O( @1 e0 Y& s" W/ x  l
void InterruptInit(void)9 g" n& _' G: P  |" K. N
{
' k& j5 L3 O$ |0 \        // 初始化 ARM 中断控制器
% y! }# t4 \0 S- T        IntAINTCInit();1 h( i( v4 L3 A, c$ S# s- ]5 _% v" w

' n0 f6 \% N! A0 i) N  L- F4 t: @9 u        // 使能 IRQ(CPSR)
/ y/ _/ |3 [) o        IntMasterIRQEnable();: ~/ A! j8 x: Z4 I

6 B, s. m* [3 B8 |. C; b5 W, G        // 使能中断(AINTC GER)
8 ^, p8 W. S$ i/ Z+ U1 @        IntGlobalEnable();" @4 @/ _0 h& }$ A0 s1 O' k. N
" ^) U- \) E3 Y. b$ J/ Q$ r8 o) S
        // 使能中断(AINTC HIER)( i7 ]4 s* E; v2 J2 C
        IntIRQEnable();
# I, C/ O/ {" U}
& R- d; m- z" c2 [7 V( k+ T, B0 w7 J" L  k3 i  a, u9 x

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/3 |& O2 ^- @7 L9 `& m1 k
/*                                                                          */
6 A. q0 C) p& L( t/*              中断服务函数                                                */- F5 Y7 T1 e& K6 Y4 X  R
/*                                                                          */7 M7 y, j6 B  M; o; Q0 }& O- c
/****************************************************************************/
6 y, F- N8 Y' N  w6 t+ D& `$ s3 Bvoid PWMEventIsr(void)2 l/ i6 w2 N) Y
{% _: f/ J# G1 r7 Y$ p  H
        IntSystemStatusClear(SYS_INT_EHRPWM1);
; f& f& P0 f( B( X3 v4 [+ z+ {% ~( s# T+ v2 U$ R; j. a4 z
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);, J3 N' L' [' o$ a2 l; X0 y
}
% w4 y' K  F) J1 z- N7 K8 M
+ y3 z' L& q+ D8 I( i) m3 N( qvoid PWMTZIsr(void)  O1 K3 G: A" ^6 o8 |. H
{
6 l  N# e/ p# s3 A$ L( \5 C% W  K6 l        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);4 Q' X, _2 N5 R5 j! I* v2 ^# v  |( G
1 x' i, \- o6 S& _9 C) ?
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
& ^: ^- D6 \& {% P3 P}4 @! I0 a* D; x  x. s

( x9 W# k- D$ }6 ]/****************************************************************************/4 [) ^3 M& C  l( B9 b
/*                                                                          */- C: \; V0 x! X' t
/*              初始化捕获模块                                              */2 i8 O+ t! p  u% e  u0 _4 x
/*                                                                          */- l3 J1 m! d  N( ?
/****************************************************************************/
: a4 K4 j* l4 T  T' Evoid ECAPInit(void)! f# I" v0 s8 k8 S: S% m* Y6 U
{3 m  @# g* }. v3 _, Z' N% S% r
        /*-----设置 ECCTL1-----*/
! D) K% \+ K# p, h7 v        // 使能CAP寄存器装载
/ ]5 W/ m. `+ i        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);" [. d& m- r1 B0 n3 k% J
        // 设置预分频值.
2 @/ h9 z0 ?# i: P; S        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
8 a- J" N" O5 _9 T9 b9 D7 v0 c* o& N        // 上升沿触发捕获事件
# r7 @& O% ^: J9 _( g: b6 n        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
! Z2 {, X% \+ c* v/ X        // 输入捕获后重新装载计数器值.
. G! v. e  p, W& Y8 \" U3 ]        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);; w7 w" s0 O+ C( o* q9 m
/ I2 K* W0 E5 R% @
        /*-----设置 ECCTL2-----*/( q" P$ Y) X- O( B0 G, L- V
        // 连续模式
8 }" I4 e( n9 p' T        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
1 a  r' I4 N8 [2 D, p+ q        // ECAP计数器TSCTR持续计数# F( M. U. V$ V+ t0 E3 \
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);! {' F. k, W( d0 _
        // 禁用同步输出和同步输入: m, P+ @- M7 Z0 b* k
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);( `0 s( R7 [6 _. J( ]0 b, n8 z
        // 配置 ECAP 2 为 CAPTURE 模式+ ?& p8 v' B& q3 ]
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);: P6 r1 ~3 |+ a9 |4 q

0 v& u  w7 {2 t7 m3 P. v0 W  F        // 使能中断3 ~* F( C( o, C3 _0 l' s( e
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);; x# b7 K$ i5 v% B8 A3 _
}
& ]% V' [7 f/ o) ~% X
$ c3 K& S" _) V+ [7 J/****************************************************************************/
3 M0 f' x( J: S4 N4 s/*                                                                          */% V8 H! p5 h3 I: Z+ T6 G
/*              取得捕获结果                                                */! ^1 o! u5 L( c
/*                                                                          */
8 x, B0 ]' L4 q) B; k/****************************************************************************/
/ l, H* c7 ]0 |" F+ s( B$ j& Xunsigned int ECAPRead(void)
7 V3 y. V) v# c: G+ n, ^+ X4 \{8 f9 [3 c) N0 L; @& u4 `
        unsigned int capvalue;
; L; G% ^. H, _; e/ s3 B        unsigned long frequency;% u/ L1 v8 T( G9 _

$ R+ s& L. x) m1 I4 I! f! S        // Event1 中断标志; q) p1 g- a* z, F2 ^' j7 @4 w
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
% |3 a! q$ T( o# I9 G6 m        {
* ?' V. ^7 E# C. b) [' c% t                // 取得捕获计数
; I  O; ?( b0 @" A8 ]& G                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);+ ~7 H3 \: r2 O# S
                capvalue = ECAPResult.cap1;
0 ~2 {* v) m7 f7 D9 Z$ l
3 I- o' N' ]6 v  g$ q3 ~                // CAPTRUE 模块 228M 时钟主频
$ r  O8 q- N- u! v+ b& Z. u8 V9 _4 x                frequency  =  228000000/capvalue;
3 S" J* M  e+ g9 s) ?* u                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);. f  U' Q0 O/ B

5 S6 M: g# I: }) x1 N                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
9 q" S) h! A0 |  x//                IntEventClear(SYS_INT_ECAP2);
/ V) `4 n: Q& q0 B. \) F8 M        }
1 d; c1 D; Z0 a/ K+ f6 f# d* f/ p        return frequency;
+ _" ?- V; i4 L( Q0 y}
4 c5 a- l8 j2 Q0 B  u/ S0 U
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
4 v# {, ^9 Y3 J' V+ w[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