嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家& w; L3 B% I+ A6 t, v" s

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
+ K9 h; G3 Z7 G. K- ~6 Q/*                                                                          */6 F. i- A( R' ~* o1 m1 @  {: Y
/*              宏定义                                                      */" i  \5 w) S6 l( P3 Z; b5 F
/*                                                                          */, b( C, q# ]5 |- [2 O0 W
/****************************************************************************/
  ~$ [4 F- ]7 {$ `4 r" s// 软件断点
, p; e9 @2 b& }. G( I, ~#define SW_BREAKPOINT     asm(" SWBP 0 ");6 R* {& K1 v* M, L, B/ Q( s
/ Z# o- l/ i" I5 |
// 时钟分频/ ^, K3 r% b  b
#define CLOCK_DIV_VAL     228
$ h& y( S3 B1 P! Z% y' @: Q' I1 b- z3 v. _" \" R% V
/****************************************************************************/& _: W6 J9 Q8 {! l. @; Z
/*                                                                          */
. ~  R/ J" `- z& J" f1 ~2 r5 G/*              全局变量                                                    */- i$ ]* b- ~' }2 o
/*                                                                          */
8 S) }; P" r4 Z$ T2 S) R0 O/****************************************************************************/
' A! a: O% a  f; Y. n1 TECAPCONTEXT ECAPResult;
2 S" P* K; e0 v  R
3 H/ x4 i6 r8 O0 S) J( M' r# t/****************************************************************************/
( J9 E$ f3 Q: i3 k- U8 m3 w/*                                                                          */
; j: n8 s$ _& U: h/*              函数声明                                                    */) a; t) b6 h2 g* C# a
/*                                                                          */3 `9 i& V  b. y$ w& x/ M; j5 s
/****************************************************************************/
2 k0 V; o  F0 J" T' v' D$ t// 外设使能配置! H3 P5 O1 Z  x+ g! ?& B
void PSCInit(void);
7 w+ [" g- e. P. N' m; m' l9 z* }9 }* x& f7 r8 q+ }/ B
// GPIO 管脚复用配置
7 I  X7 m" t" N- o- K. B! C6 i, [void GPIOBankPinMuxSet();3 l  X2 H/ X' n. T# Y6 Z8 q
4 f/ P+ o2 u* J2 F. g' N
// 产生波形5 q, B* A  d+ w% E
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
# o2 _* [# N9 s7 s- w3 R$ k( Q# u5 uvoid ChopperWaveform(void);: c% k/ x8 h8 z

3 @6 o# f2 c  X+ s4 R! Q! ~6 j// ECAP初始化和读函数& W- g( F# I5 o  P
void ECAPInit(void);7 X# _& Q, U0 d: \# K6 F
unsigned int ECAPRead(void);
" @5 N0 C+ J  e/ S  t! z, N4 x$ n4 n% D/ A' _+ w" g- O/ x  X
//ARM 中断初始化
; P7 U# o, m; B8 ?4 d) h' E( Xvoid InterruptInit(void);
" b. S& S3 j. `4 T9 e3 Y; B
( _$ w+ m  U0 X3 S2 s$ C// PWM 中断初始化
/ b# m  y! H7 T% jvoid PWMInterruptInit(void);7 f# Y- x' `) m' S7 S
// 中断服务函数2 R1 A& d, J& X5 }; U
// PWM 事件
9 s/ Y1 H: B; s* _$ @/ yvoid PWMEventIsr(void);
0 c5 h1 n( x# O7 ^5 z. c// PWM 错误控制事件
* b9 O* _+ W# K& e6 z6 t1 w+ K! Z- kvoid PWMTZIsr(void);
. V5 W4 n$ O& d0 c" i$ Z
; V* C+ s. s: h% s: Q! w0 h/****************************************************************************/, T, {6 K5 p* s6 C# l  k
/*                                                                          */) J; q" l( z# E8 D8 _+ f( N
/*              主函数                                                      */  x2 F/ x' X" m. D2 z$ ?. W4 \7 x" K
/*                                                                          */
# O+ N% G0 u. S: |% C) P  L4 J/****************************************************************************/
! h& g4 Y1 x1 r7 Aint main(void)- L  O+ M$ [/ C& q! y9 `, k
{: @: u& q1 A2 m, b: @3 q7 Q5 x* R) ^3 n1 {
        // 外设使能配置% b( L( y, t/ O9 _; R
        PSCInit();  f( A1 @4 Q$ {" i" f5 K
& o! y# r7 @" b8 y; d& S* |/ U1 c
        // 初始化串口终端 使用串口2  ~! D' n( Z7 B" }
        UARTStdioInit();: a5 a+ S/ S- k3 G0 ]& \* G0 l
       
) w! y* M4 U" Z1 R) j3 q        // GPIO 管脚复用配置; d+ d& W; Z/ [/ b3 W- M
        GPIOBankPinMuxSet();
& b0 N6 \3 S4 Q- J0 O$ Z) Z+ W) X. f9 w! _
        // ARM 中断初始化
% n0 s: x  ^( }: T& \  v        InterruptInit();& S+ h: y. ?( ?! x# e. d

: o( d# K1 K9 M, ]        // PWM 中断初始化+ R% U$ K( I4 d1 z; h* ]
        PWMInterruptInit();( D' M3 }& U8 y  r" C7 Z

7 o  `; S4 C1 o# Q        unsigned char i;
0 J6 S. F# X" h! u# E9 N3 L7 a        unsigned int j;
, I. I% x5 h. i4 s* [6 l8 G; {- ~. f( S
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);- {3 C# X+ t, B( U
        UARTPuts("------------------------------------------------------------\r\n", -1);8 q; _/ Y" n, E
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
* u& F1 Y, U8 z9 |        // 产生波形% U% ~$ V; S  g) `8 r7 V2 x' l
        PWM1ABasic(25000,50);
6 J7 r4 b4 m2 m" X; p0 x# q2 O
" N# |7 _/ Y: {  }7 `& z        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
: Q: m% i8 l0 d# r        UARTPuts("------------------------------------------------------------\r\n", -1);
# q* t* d% C# B* W0 v6 B* q7 r4 Y0 t& H* M% Y+ B0 O3 e

1 U: A7 T  r8 q5 F# O: ~$ G  X6 S3 Y) h) a
        UARTPuts("------------------------------------------------------------\r\n", -1);
" O. ~: e1 N$ e1 ?$ m5 `6 S        UARTPuts("                    C6748 ECAP Test\r\n", -1);: V! |: B& N  j3 @
        // ECAP 捕获初始化9 D  n. m7 k+ q$ @$ C) C( P
        ECAPInit();
$ u$ x6 m) G, H% g; p        UARTPuts("Initialize ECAP.......\r\n",-1);
( M* F# V- q* x        for(i=0;i<5;i++)1 [3 c' p( b  U# w
        {
& X: |" X9 s1 x6 J  H                    for(j=0x00FFFFFF;j>0;j--);            // 延时+ g+ O- S! Z1 ~6 ?
                    ECAPRead();
& k1 |) A1 W" x2 l8 n: O  ^& w0 B        }
0 F5 k) a# K/ ~' m, n! K) i: I        UARTPuts("\r\n",-1);8 ~0 C! ?6 N( f9 `" j9 B# b
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);* N8 W( O- y: ^6 y+ h( _: W, P
        UARTPuts("------------------------------------------------------------\r\n", -1);
4 Q2 I0 _( U+ g* w0 b8 @
# Z* @* i1 z9 [" P" Z5 K/ x; Y5 [! E3 y        // 主循环* ]: o4 C$ }6 R% ~" A5 J. ?0 P
        for(;;)
( z9 C6 @" |1 x        {2 j( n  \) f4 Z4 R/ d3 U
6 _5 q8 z1 ?. A! q4 s( B
        }
% W9 u/ k5 f8 x% Z/ s' d; s}) b  `! ]& Q7 J( B" e0 N

$ }2 k' D" o; q9 l# s/****************************************************************************/% \% d( k& D0 _/ u$ o, d
/*                                                                          */# T* K& e# k( h  M9 F
/*              PSC 初始化                                                  */
5 Y, R: ?$ |7 p! a9 D8 X/*                                                                          */
  H/ t) w) b, M, P9 _4 k8 V+ S7 C/****************************************************************************/0 f8 Z* z2 a" r' V9 a) |- ~- `7 g
void PSCInit(void)
1 i1 m* I, D, [" Y, q{
  w) I7 B# L+ e( o        // 使能  EHRPWM 和 ECAP 模块! w) u" r. s/ z' N3 j. M
        // 对相应外设模块的使能也可以在 BootLoader 中完成2 L+ h4 \" k6 _
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
' t' W7 R4 E) \) p4 z    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
# L  A3 E- e5 E5 v4 e4 I% ?! C, s9 J}  y6 D( x( p, H  D; N" g

% q7 C+ E' b& X1 }: E( ]/****************************************************************************/
) E' p( K4 m7 j9 M4 y: F/*                                                                          */
& Q+ m3 ^; d$ u( q$ P1 f/*              GPIO 管脚复用配置                                           */# }$ G8 J9 V) p9 [
/*                                                                          */
# ?2 G& o0 L' u: {+ }/****************************************************************************/9 |: j8 Z" ?6 a* l/ m/ x( i
void GPIOBankPinMuxSet(void)' G2 ^' f' v4 g2 ?/ r1 m3 H
{6 ?( J# _. [/ p
        EHRPWM1PinMuxSetup();+ M- b4 a" \. Q3 Z
1 b9 Q; i9 }4 C) [7 ?4 t
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
% `5 a1 B# a, G8 [  L        // 作为捕获功能时管脚方向为输入
* U2 @9 k" G7 ^% W. T( X, A6 n3 Z3 n6 \        // 作为辅助脉宽调制时管脚方向为输出
: E( `9 k2 O; a, y    // ECAP2 / APWM2
& f  k7 A: A+ ?5 K- l        ECAPPinMuxSetup(2);
8 G9 ~5 ~  {7 o. T* E- P+ }) R5 B" F( Q; R: T
        // ECAP2 / APWM2方向设置为输入( g' p2 E# U& A+ v8 I4 F
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
. H# z( m8 u) i}
8 U  t( D' K8 q  r* p! S! @% t# B+ a0 c
/****************************************************************************/
7 _4 r7 O& Y. k! x4 L3 v6 \/*                                                                          */
7 J+ _* F- @7 B: N1 u; V/*              PWM 输出波形                                                */
* x! d9 W: F+ f6 ~! @4 [/*                                                                          */* l. z6 C+ l6 H2 I- N7 ]
/****************************************************************************/
3 V  u+ J6 B% x. v  q* U1 Ivoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)( [2 L& j+ @3 A
{  [8 b9 u6 {2 o+ i
    // 时间基准配置  M6 f- b# \  Q+ h
    // 时钟配置
$ z0 y. x' R% x5 u6 R: t    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
( M3 l" e( k5 W! l& g% ^6 a7 G' C& y8 X7 ?: Q/ r
    // 配置周期
$ r9 u5 v8 J2 x" D; k    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
2 Z2 s+ [0 q+ G/ C' Q9 s, [                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);' m5 A( ?/ p9 S4 P
* V' Z6 y" b9 k
    // 禁用输入同步信号
! T  W# c# Q7 H% R  e* j: `    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);+ X) M8 e5 Y" ^* K+ H% G

4 d( I/ s# R2 o  m) ?9 E    // 禁用输出同步信号
  t1 }& D; {9 |1 y    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);+ q2 K0 T7 W+ U1 T: P6 U
) u5 ^! G: W3 a$ |
    // 仿真(DEBUG)模式行为配置3 p6 D% X) Y. a2 X6 O
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);4 l6 h% f; ^) d8 d7 s4 M0 E

$ a! K+ ^4 r0 B    // 配置计数比较器子模块6 i0 d! ]" r. i4 e
    // 加载比较器 A 值/ N$ l# H: h2 P) m, I
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
5 Z& E* m! u7 q! A6 }                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
3 Q& w  \: ?+ E% |: y6 u0 W4 x" q. [: ^" v+ k3 N5 h) R
    // 加载比较器 B 值
- K" \0 Z" @8 \) R9 u+ k    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,) D6 J5 m6 j# U( E5 l6 y) d
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);: m% M  J2 C7 c( {! A' _
2 e5 I, p% ^" }
    // 功能限定配置(输出引脚触发方式设定)
! i! @. Z* `9 D" q/ a3 t- j    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
. V; D" c% ~! j$ z* `' r0 L6 Q: t    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,$ F/ L+ @7 y* H5 h  u. Z8 V
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
* t- p, q* L# J9 d8 J$ a                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
+ P- h. ]  r; }# b: {
( s  c! l- Q* t# b$ }3 g* K5 w" Q    // 禁用(旁路,信号直接输出到斩波子模块)死区模块' f/ Z9 W$ _: d8 ]7 Z  z
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);" I2 s1 h- _# Q
* z2 g0 k' v6 X7 E5 v
    // 禁用斩波子模块
, V* S( G* [/ C6 b    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);6 v- N7 j1 g% g6 H. O! p2 m) Z
" u# d" J& M' S9 C( H/ k
    // 禁用错误控制事件6 K9 B. @1 y! A; u; s' ]+ ^
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);( \' U2 @9 o$ L7 D
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);2 G% c" G5 \$ z2 H( x. D4 w
9 k2 n0 b9 F# W% P
    // 事件触发配置3 F% U& O& r. W, e& c
    // 每三次事件发生产生中断1 v8 w% s/ {, z$ Y8 b( Z
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);+ C& K& m6 Z; N( Q& F2 \
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
3 @9 J1 B3 ^7 {" T    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
0 f$ S( s  ^% \: N& n& w; C    // 使能中断+ \; T  M( T0 K& ^
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
, J4 M% X9 e+ J2 c, X4 g1 g/ y9 t! ^0 n- D! [2 |
    // 禁用高精度子模块
" w0 r( g) q  E! V    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
- V9 z* `8 u) U6 y# N/ A% ^( T( c  N; e! N8 ~
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
8 t" [; ~% @7 g% I}: ]& O6 _9 ]7 O" J) @
! a0 V- D; A7 W/ s# t2 u0 N6 j
void ChopperWaveform(void)
1 O! M5 i- {% M- [1 r* k% y& p  d{
; D# P1 M# X8 K+ Z( B  X9 S3 ]    // 50% 占空比6 H& P: B6 \# T: u/ r
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
. s7 P4 O. @# a    // 4 分频
9 I$ ]7 @) U5 @    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);; |& Q( P7 d/ T$ m' H
    // 单个脉冲宽度
9 X+ _( U4 d) H  X3 h1 [! D1 C& T" ?    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);% j* L( p8 O; ~$ H, q
    // 使能斩波子模块
: E. g, Y% j% v* B! L6 u# P    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
$ ~- l+ ^! h) j' i+ d( e' C}& a+ |3 O& S$ ]" a8 e: C! R" r

( y+ }7 w  [* b* ?, {5 m: h/****************************************************************************/
& Q% I- j  }. t: G/*                                                                          */6 N" l+ v/ _# B5 F" d
/*              PWM 中断初始化                                              */
& {" F9 G7 y2 U/*                                                                          */
! P2 R& D6 A) o2 @+ E/****************************************************************************/
8 B7 I& Z( F- L% i0 |7 `- r$ yvoid PWMInterruptInit(void)
9 V# G) A5 p4 Z1 o" U" V{0 M3 @7 S$ c: }8 `7 Z
        // 注册中断服务函数
5 Q5 |$ t0 f$ q: g8 r4 H( C- N        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);; u. L) ?; o2 S* z  u1 b* S
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);( L7 G# T/ U+ Y- E" N9 D/ N

: W/ e, Y+ K1 q4 e0 y# L        // 映射中断- e# e- P. [8 \' K& G
        IntChannelSet(SYS_INT_EHRPWM1, 2);- u$ d5 h6 o8 R% @% z0 s
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
8 [& M3 l6 g4 s3 l& O) v! o- E3 _) d
        // 使能中断
4 h4 N/ l2 o! K, y        IntSystemEnable(SYS_INT_EHRPWM1);
! `1 _% A$ ?  j3 o3 S# K# W" r3 c! u        IntSystemEnable(SYS_INT_EHRPWM1TZ);
4 b4 q/ i% Y4 {. V}. ]& P5 e1 d2 W% T# f
8 o" D; {! ^/ ]3 ^+ U! o5 \
/****************************************************************************/
) {; N) J* \: }/*                                                                          */
4 n% q4 l0 G: ]1 n' j* K/*              ARM 中断初始化                                              */
% W5 o- \; F: W% p) c/*                                                                          *// ^* N- r( X0 H& G7 \3 x+ c. w' w
/****************************************************************************/! ?4 B; X; ~$ n
void InterruptInit(void)  ?5 l4 o6 U+ V# ?6 w
{: l, l' k( Y; I3 ]
        // 初始化 ARM 中断控制器, k# z5 j: y% I& V8 [
        IntAINTCInit();
9 r5 H9 \8 X9 v/ s/ s* D5 A7 l; ^1 ]9 G" [& O
        // 使能 IRQ(CPSR)
) ~3 S" [' e: B        IntMasterIRQEnable();
6 j" o2 c+ J. ~# V, d: K9 [+ A
) k) G5 V  h) P        // 使能中断(AINTC GER)
6 t8 b3 M# t8 F4 U9 t5 A5 U        IntGlobalEnable();
$ n: P0 N7 Z( [: l% I3 F' @+ q( M* |6 G) M
        // 使能中断(AINTC HIER)
( |0 R  Q! y) T- \( i        IntIRQEnable();
8 G) U, o! \' O% p. q9 V  y3 {}1 b6 `+ Q" c+ t( r  z$ z3 z
% O% q9 A. D, _2 N4 y; _9 V

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/
1 m/ F1 T' ?  q4 ?% L/*                                                                          */0 {( j" m6 J$ B
/*              中断服务函数                                                */
+ F, y2 x3 |9 f0 o( h/*                                                                          */7 Z/ \+ }+ l4 m- V$ O! M; `& O
/****************************************************************************/
/ X) h8 D# F* J& evoid PWMEventIsr(void)
8 `- u; p) \* ^/ p: T+ @, G{, x$ d+ u" a: ]5 A# {7 i' O! k0 b
        IntSystemStatusClear(SYS_INT_EHRPWM1);1 h* `8 l; e( g' u1 U! }9 ^
# M3 O, b7 ]6 J
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);" _8 c7 z. l% X! o6 C% Y
}! b1 ]( `$ D; N. B

9 [  F3 {  F5 c* Jvoid PWMTZIsr(void)
) c2 p. q  U0 N" ?9 d: ]{. q, S& T3 A- Z0 z% D5 ?+ V
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
" U% Q) F2 ]( z4 E# M( L5 V: P
# B& h6 \# R* I3 \    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);% ]3 \& k" j+ m' }
}" u! f- V" s9 x( b- z; a5 G

* [4 s! x9 d: ]9 A. x, k/****************************************************************************/) `" f6 Z5 T( m. v/ d  H: L
/*                                                                          */
/ ~& m' w0 h4 k8 Y/*              初始化捕获模块                                              */
; k5 N) c+ w, R* C# m/*                                                                          */8 K0 b7 Y3 V: z% J: i1 c
/****************************************************************************/
# x9 A: c2 d1 N, vvoid ECAPInit(void)2 J8 R, o2 A5 ^; g" q7 e
{- ^7 A: B  P! W
        /*-----设置 ECCTL1-----*/  H4 _4 u7 t! {& [
        // 使能CAP寄存器装载8 z. C0 r, X, g
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
2 Q4 f7 h4 y1 t        // 设置预分频值.4 f6 g  r- [5 O" H! O' |# G
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);' U2 r8 y) R& T2 n
        // 上升沿触发捕获事件
& d- S$ r6 A1 I) B0 x" K5 o  j  ~& J        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
( X% ~4 o* S4 T4 |* y        // 输入捕获后重新装载计数器值.
+ Y6 z4 ~1 a% O( E        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
6 ^- V$ L% a/ @' X
; K% P! j3 _; x( y- E        /*-----设置 ECCTL2-----*/
/ G2 ^- e  c2 N; |        // 连续模式8 O6 M& B! e6 E0 T( d' G
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
7 L( x. |1 G* z: @4 s3 \        // ECAP计数器TSCTR持续计数
8 G( i# K8 L$ w( ~        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);5 |/ Q2 V( ?, N4 t# p$ M6 X% e
        // 禁用同步输出和同步输入
9 M' h' A. E. E        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);( L( i  c$ D. j8 f; o. S
        // 配置 ECAP 2 为 CAPTURE 模式+ m/ R% C/ |+ E
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);# w: o* ?! D: F5 k0 D& o8 P4 d
5 D5 A/ [' s4 c! \3 I2 S* `
        // 使能中断
/ c. @: ^/ e- @0 T4 Z* O% c7 j; Q//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
; |4 h2 D" s( w/ G* c}
. X* ^. O& V+ c( A7 E' R0 T0 A: U8 u8 P/ f
/****************************************************************************/4 W$ Y& y  }# U, D
/*                                                                          */
. e! C7 i0 t0 E3 C( C3 }/*              取得捕获结果                                                */
9 N0 q% w2 N4 z# r3 L" O/*                                                                          */
8 y  ]3 i* P" I5 ^/****************************************************************************/! n, y" M" S1 {. |  H3 C" P, Y- E/ P
unsigned int ECAPRead(void)
7 s( q5 x- f/ Z6 _5 e. I1 q{; q% ?/ r& k$ G: Z/ V7 E5 B
        unsigned int capvalue;
$ |8 x6 i! l3 O% l7 K: Y! T3 J# I        unsigned long frequency;
9 r, d* |5 k$ y5 E. t# z  W! c* J* S) P3 J
        // Event1 中断标志4 \! {+ N! d8 _+ n
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
" ]7 `( s& ~6 f4 s        {0 ]. r! Y+ W7 m+ d; v, k; D
                // 取得捕获计数
$ ~# }! ~9 D( R8 P4 Y                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);. J6 l7 L! q( C$ w" J) a
                capvalue = ECAPResult.cap1;& S6 |- u+ |$ O1 J3 K

0 @) r& d4 k$ `" p: t                // CAPTRUE 模块 228M 时钟主频
3 r; ^8 q3 G; I. W                frequency  =  228000000/capvalue;, C" m8 W1 A. J& [$ {6 k
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);. A; n1 _( z% V/ g/ ]- r+ ^: X5 c

6 X  t! l5 F3 y! K1 {9 h                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);: K1 T) N/ |5 b3 `' b
//                IntEventClear(SYS_INT_ECAP2);
# b& U7 K4 `; b$ I+ b- g  K        }
1 l8 _8 r4 O" l5 L4 R2 A        return frequency;8 b/ C, j, f$ q: s! \# R1 r' v
}
# k# T  e# W  C) q+ j
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
8 \2 g3 O7 P5 Z5 y6 v* s9 o8 N/ B[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