嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家. j3 `  U) ?" V! E

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/* k" f' R. n1 V/ @4 j* j* K9 T
/*                                                                          */
. L9 d) p8 ]' q& A6 s* y/*              宏定义                                                      */
- A* `5 y  [5 @1 p, L/*                                                                          *// J  [( L& B- ?6 N7 k3 B
/****************************************************************************/
$ W1 Y0 @) c9 V3 M. z# p// 软件断点
/ M* u% w2 s3 X. z! ]#define SW_BREAKPOINT     asm(" SWBP 0 ");1 g# n+ p* I$ s% N# U

: b+ r# I$ l( \" z" k" X5 y" p// 时钟分频
( b9 N8 z" x8 M1 g5 l! K7 j#define CLOCK_DIV_VAL     228
9 o6 W; R* \" C- x' v0 [8 k5 B
/****************************************************************************/
3 N, ?; p% X% n' [( x6 O9 b/*                                                                          */
/ }3 b/ @0 U/ W: a5 ~! a9 S/*              全局变量                                                    */
  {& v3 n, B; ~( O- u/*                                                                          */
0 O5 Y. w2 S* t' C/****************************************************************************/
/ i. h1 b4 `0 N" e, C8 S  qECAPCONTEXT ECAPResult;* H5 T/ C& F. h: K2 p& E3 w0 l; F

% p3 L7 F5 L8 P: f/****************************************************************************/
% x+ P* j( V0 h- V! b2 w/*                                                                          */
) O& }) u4 |3 e+ B1 O/*              函数声明                                                    */6 f8 I% `! r! H4 g' l' W# _
/*                                                                          */7 E- r8 r+ i4 z9 [" [
/****************************************************************************/
; x9 [. r9 n, n! r2 a" R+ d% s5 G// 外设使能配置) w0 B2 w- X! k- j
void PSCInit(void);) O, Z. e' \8 E; O% A

; Z' g; ?# O% }- e7 |// GPIO 管脚复用配置
: l0 t$ l5 F; n. Mvoid GPIOBankPinMuxSet();- Y4 q/ h0 e3 ^) t8 @

6 X' k0 P& N1 j9 S/ b// 产生波形
/ R5 [; U$ H) b, z* a2 yvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);7 {) b% C6 ]9 ~, ]
void ChopperWaveform(void);  `* @5 _5 l& q  ]

3 j1 K- M' p3 ^// ECAP初始化和读函数
# m# G  q# n2 F/ D8 v8 wvoid ECAPInit(void);) j5 }) c% [9 J
unsigned int ECAPRead(void);
9 Y: P% M4 V6 @, C7 H  Q  ]. \! @3 {! N4 i7 U3 f" ]6 n/ r
//ARM 中断初始化
* }# G# u6 q) ?/ Gvoid InterruptInit(void);4 U: N3 f  C6 h% z' ^+ Z
) h# |& G0 E  n) z" ]
// PWM 中断初始化2 [: n, T% O7 y6 t; J. b
void PWMInterruptInit(void);: x1 F7 W+ k  s+ Y; R* R
// 中断服务函数
# |, V" C9 q8 {  z  r7 G: j// PWM 事件
. C! Q. b3 z$ p0 Z" p3 O! ivoid PWMEventIsr(void);
/ ?1 j  z9 e: X& X9 v( Q7 e// PWM 错误控制事件
& m) r' d. J+ ?" |+ n+ d! C+ fvoid PWMTZIsr(void);$ b  h$ |/ X6 Y

8 e1 c5 Q! X+ A! a$ f6 J, p' Z/****************************************************************************/
9 a  A7 |( o: y9 n+ Q' [2 J+ }/*                                                                          */
, w+ H6 W# h5 U0 x4 N7 ]" R+ P/*              主函数                                                      */
5 E4 s7 p( T  L9 r3 J/*                                                                          */- A; T5 v) |$ C
/****************************************************************************/
7 V& H* B: |! `; z. C" b- Fint main(void)2 a, S7 m7 W& y! p% T
{1 }4 H2 I% @# z- R& h) r
        // 外设使能配置
+ x: A' e( Y7 l- x; ~; x1 v        PSCInit();
4 S3 S8 |  u- m! ]$ Q: m: S" i+ O- M# W  G) ^/ [1 m
        // 初始化串口终端 使用串口2
8 I; r3 y0 i# ^& \7 Q& q        UARTStdioInit();
* p! b1 g/ z2 z4 a: W5 W4 |! M        8 I$ p) u; i4 H* v5 g: k
        // GPIO 管脚复用配置
4 J. `; d9 `' o5 S# ^        GPIOBankPinMuxSet();
. t9 Q8 \5 X9 p9 w1 J  |& b- \9 F$ y" ?# J$ v6 v6 L
        // ARM 中断初始化7 E, @  w' e- j0 K. p  J0 x2 J) D
        InterruptInit();1 a4 K, X3 p0 b, R+ n6 C' Y

, v8 D! F1 d* h* N7 U4 l' I$ M        // PWM 中断初始化
8 ^0 p) D2 C7 f8 \+ f        PWMInterruptInit();
9 J4 N4 [& O; H# J1 L
% A1 N1 [# E3 d& Z& [        unsigned char i;
8 s8 S; u# ~% L9 `+ x        unsigned int j;
+ J5 b& ^7 u# |! D
' U2 F7 h& b! f" i1 N0 R/ ~, D  B# H        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
$ L$ B3 p4 E& @& W# }        UARTPuts("------------------------------------------------------------\r\n", -1);7 W8 O9 s; r- u& @5 M
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
$ ~( ]7 C. [- o8 C- x        // 产生波形- C1 E8 [  H( G& [
        PWM1ABasic(25000,50);
# I) U8 h: }1 B4 `/ O! c% }1 e* t$ R, t. I
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);9 p1 s% Z) b8 m( n
        UARTPuts("------------------------------------------------------------\r\n", -1);" |2 H4 }$ ^0 x) g
& v& O/ @1 @2 a+ t* U

: c# h) o& U6 T! ^: t: P/ k1 v0 ?+ A: R! e- A, d. r- c
        UARTPuts("------------------------------------------------------------\r\n", -1);' ]/ Q  z7 c9 P
        UARTPuts("                    C6748 ECAP Test\r\n", -1);
" O: a. G8 y. p4 B8 f( |% ~        // ECAP 捕获初始化
' a  K1 x, H8 h+ Y, ]0 y' e2 n        ECAPInit();8 t6 E0 R- O! v& g2 ?+ I+ D- _
        UARTPuts("Initialize ECAP.......\r\n",-1);
! g3 `; Z* \2 q1 H( I, B: W5 ~        for(i=0;i<5;i++)
+ }- w7 `6 t( c" R1 {) n, f: J        {. h9 S3 l/ \' k  X4 y
                    for(j=0x00FFFFFF;j>0;j--);            // 延时3 J2 Q& j- h$ Z$ ?& T, \6 u6 O2 x
                    ECAPRead();
& ^  T# v$ p) B' p6 W! \9 K        }
: @0 g0 Y3 \, \; H3 f        UARTPuts("\r\n",-1);
; P; @3 l, K  y+ \' p; d8 R8 ?$ Q- J        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
9 t4 {" A. D( q* C        UARTPuts("------------------------------------------------------------\r\n", -1);
4 d3 f" t' W; F# j" c  U; h2 B; d$ a8 `: E# e( t
        // 主循环8 W+ k! g8 {8 M9 K) n, u
        for(;;)$ N! N8 ]7 W% U7 S4 V- {: u& m
        {
- z( {6 ^* J' v# |4 @  B7 U3 ^/ @/ \6 `3 y5 f
        }
  O7 V5 w% ^5 ~# Q# e8 u; z3 y}- y9 L/ i. H, X6 g

& c2 w9 l6 N+ p* K) e5 W* i/****************************************************************************/
7 r5 o8 O& H; t& V, C( i1 x) ]/*                                                                          */
/ t+ a& i$ m1 d, s8 ^+ C/*              PSC 初始化                                                  */' d+ ]- p6 D9 G  {) y
/*                                                                          */$ u% J2 x; l" g2 H
/****************************************************************************/3 x, {. {. Y3 H
void PSCInit(void)* A8 y" r0 Y4 L' p
{* n0 O9 P& Z: g& g) l
        // 使能  EHRPWM 和 ECAP 模块
' \6 t; X' O" t9 {6 u/ U( O        // 对相应外设模块的使能也可以在 BootLoader 中完成
& K3 i- e7 j! [1 O# b  l- V    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
$ Q: E# C: a" ^! F. O    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);- T4 p2 W, b2 j4 K
}
  N0 R7 ~* r% }6 P$ f$ W/ @5 k6 h; l* `/ P& f( z9 g
/****************************************************************************/
$ ]- `, _! b; \' V+ T/*                                                                          */8 n( K/ h, D, S: f6 w, D3 l
/*              GPIO 管脚复用配置                                           */
. Z0 w1 }. ^0 E& |# E9 X/*                                                                          */" w% f- E/ L- `" |( i6 m' O6 |+ Y
/****************************************************************************/
0 Y; [! D7 B: `/ M8 Gvoid GPIOBankPinMuxSet(void)
0 U) O, @3 K2 b( Z{
- \$ }% C1 ]" G% w* E7 u/ Z        EHRPWM1PinMuxSetup();8 r/ k. D; `* I: s6 P3 b2 B

0 N7 G8 H! |. y) D7 M$ Y% y3 k        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)/ ~" X& d3 |8 ^0 N$ Y( a$ m
        // 作为捕获功能时管脚方向为输入
7 f% y0 S7 |5 ?9 B* s4 d8 j' x        // 作为辅助脉宽调制时管脚方向为输出& ~4 @: E3 ?8 V( V
    // ECAP2 / APWM2
# s. n) ^; z+ f        ECAPPinMuxSetup(2);' f+ Y( m; e, D1 {% v4 x1 W& A+ a

, ~5 ]5 I5 I  M. m- [        // ECAP2 / APWM2方向设置为输入+ t* ?$ {* k! ]- {5 [
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]- Z$ q6 o9 U2 b, G! A
}/ _) y% t0 g5 h% P6 I$ D" U) e& Q

2 A, U+ y/ N! r- o/****************************************************************************/
. D, g8 Q% I: a& e% [/ C  d/*                                                                          */
  ^0 P" D" e" P. D7 `/*              PWM 输出波形                                                */
6 g9 G9 |1 b' T0 T" B/*                                                                          */8 {% P: m# T1 e" l
/****************************************************************************/
- }( p! F" X0 t: ?void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)0 @8 J. T1 {/ x9 y! R' ~, t
{: V& r! y. S9 Q' K4 k) Q( q$ \- E, i
    // 时间基准配置! c( ]' i! X  ?/ g. L( H# S9 x
    // 时钟配置, c% g, _8 K0 {" T/ n2 o, Q$ p- T
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
" Y) z( `: l( }0 @$ H' d( j$ l' t  l0 W) f1 W3 I! r' a
    // 配置周期# f. }! w- h, h7 r0 t# y
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,0 E! t4 j4 B  M' d
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);% B/ e* M* ~- n) p: q

# o2 n- Y4 B5 r    // 禁用输入同步信号
5 l# L+ }/ r$ x( c1 X! \    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);& L& P% A8 B6 N7 G( C
. l6 x# s7 D# `3 u
    // 禁用输出同步信号
& Z! s# {0 v2 Y    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
. [8 ?2 a' P/ _% i1 q
% p% d4 p8 d  s+ U4 e/ t    // 仿真(DEBUG)模式行为配置" K* [$ |6 p) L; u
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);- p/ M6 a/ A& R; I  k" k* d% J8 g0 e
$ C/ o2 j! L* \
    // 配置计数比较器子模块# e+ W% g' n, a) n5 `) ?1 J2 k0 f
    // 加载比较器 A 值
7 C/ f2 X  P: t8 z) }0 e3 S    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
8 c- _4 o% l1 M6 t7 B* x: a4 {/ f                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);) L6 o! Z) F; C9 h0 L

- i/ h2 {2 G% L0 r    // 加载比较器 B 值) w% O' I7 l" G4 s" W' T
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,) q2 x! W# L; ~' M% U# C1 o
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
  D* p7 f  C" D3 t9 D! b
# ~* W5 K( i# f. _6 r    // 功能限定配置(输出引脚触发方式设定)$ q% |% I  x4 |. Y  u" G. }
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
! J- A" Z* }! n+ q    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,: [! ]3 w0 g8 W9 q2 l5 G
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
8 N5 ~* S6 J3 P) |( }# h                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);2 p; M# i2 W, `; |" A
/ U" R9 H% b" [/ b2 z
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
4 T% ?$ l" [* Y" {+ j    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);5 A) M, q5 C3 \

! D0 }1 w" q  r! u8 x    // 禁用斩波子模块
4 J& [. a  ?7 N) }0 M. }4 \, g    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);; h5 T: |) G8 F: g$ P2 i$ ]0 E/ E

9 R* n: ]+ p; E$ |/ I1 t    // 禁用错误控制事件2 i  Q1 u- U" \$ |* }7 U
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
5 z: x# `4 l7 L3 L; D0 m    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);0 @6 [$ L  ^% o

2 P4 F& w. @/ m5 p& n" k    // 事件触发配置
9 e+ \) I" M; i4 b    // 每三次事件发生产生中断
. j% H9 _2 a: j( M  V8 }    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
$ Y" p) b1 p$ @8 n$ e0 r1 k    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件6 E1 ^- T. s. r; j+ [* a; S: t
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);1 ^$ A5 O  ~3 M6 B
    // 使能中断$ B2 A8 {: Z( k& y1 I- D5 k
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
( C, k1 T6 V) W2 \: N6 L
" m5 H* ~) @7 K% O# `) L, {1 t    // 禁用高精度子模块; @3 [5 y$ t1 ?- S. P0 H
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);6 C7 V( m7 i1 u6 u0 [% w$ f

8 e% ?) h8 F. j2 k: U7 Y    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);: p" d6 b. C: u6 c9 D
}, V; f2 l0 n. {  W
' R/ b: s. p1 r0 y
void ChopperWaveform(void), r& s! J. P0 ~0 @
{$ u2 o6 N8 [4 r
    // 50% 占空比
6 ^$ F: n- W# A! D    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);+ Y- O5 I/ B' s( y# _& M- d. |
    // 4 分频
+ Q6 |( l9 U5 v" z    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);2 b  ~( b( D1 d4 \2 Y* ~$ h  K2 T8 |
    // 单个脉冲宽度$ B+ y5 o- u7 b) F8 f* M# j' }# k
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);; c2 r: h2 v7 _% O1 n4 W, o( g5 {
    // 使能斩波子模块
9 C0 `5 H; }7 H3 u7 \: d# T    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
  Z& T+ Q5 U' U" m}/ [7 g( {! }5 r8 v& ?3 d' N0 C' a* |
6 L8 n9 a& k( p7 k8 g: M" M( v
/****************************************************************************/' V! E. M/ k/ t- h# p7 h
/*                                                                          */( @/ ^1 V" @$ c8 B6 d
/*              PWM 中断初始化                                              */
6 ?3 i/ N# }! J. w, \  y/*                                                                          */
) K% D6 @. G" l% }  }  ~/****************************************************************************/' N  v# g2 X. t! Z
void PWMInterruptInit(void)9 ]  u* k1 p6 C2 ]4 m% U1 x8 O
{2 A6 m9 \+ h. P2 b4 F
        // 注册中断服务函数
" i' q( h+ R  s9 D9 B3 n5 c# N4 K3 Z        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);* |3 V4 p) ?9 B! ~
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);9 f" l" h9 T( S* P, u
% V1 R( j9 G+ y; g" ?5 L
        // 映射中断
7 U9 ]5 B, E5 h/ B9 E  h' u) n6 ^* h7 s        IntChannelSet(SYS_INT_EHRPWM1, 2);
  o0 G( o- i) I; s; m9 V/ F        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);# i( P' e* ]" T+ v; K
; P; [' |2 @7 }; j7 U- |2 h7 s3 U
        // 使能中断6 w5 l8 x3 z; B
        IntSystemEnable(SYS_INT_EHRPWM1);
1 A9 l% i5 \: n+ T        IntSystemEnable(SYS_INT_EHRPWM1TZ);$ {' j/ x4 t8 @$ d! S0 C9 g5 M$ H
}3 y0 B' Z# w5 l7 P7 r) t
% `- t: T+ `) ]0 d, G# N& k
/****************************************************************************/
3 {3 S/ i& B3 L& U2 C# ~/ F+ k/*                                                                          */
: A- M* s& a5 U/ X/*              ARM 中断初始化                                              *// r( x! K$ Z- `$ D  D0 A
/*                                                                          */
9 w5 G& |9 n% T; e, v! T/****************************************************************************/1 C5 `1 T% o7 ]+ n
void InterruptInit(void)
1 L8 U$ [; N6 j* G( r% a{
1 H# x7 |4 w) x0 g. ^% J        // 初始化 ARM 中断控制器
  v8 K8 A4 _2 Y        IntAINTCInit();
1 e6 v, P% s. I8 Y+ W
2 J9 ~2 x7 D/ [9 Q/ ]0 N# x        // 使能 IRQ(CPSR)' e8 e; M# N2 |3 ?/ S" u, ]
        IntMasterIRQEnable();
$ k9 N2 o5 e: ?% i
, J6 ^# ?) C- @2 Q        // 使能中断(AINTC GER)8 ~( I( t+ \$ v, Z  O
        IntGlobalEnable();. B$ o7 n* ]& g- |

1 _5 e& F( u- j$ c        // 使能中断(AINTC HIER)
  |) M% v! ~0 D4 K9 b6 X- y8 `        IntIRQEnable();0 T4 ]  [# G$ L7 B
}
; z- p8 T8 n$ }7 s! m& l9 X( j4 s) n5 I, ]

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/5 k2 V. @8 P- ^% u: ~
/*                                                                          */
$ V  U  S& `$ w! ]+ f/*              中断服务函数                                                */
( {$ [) `: w# l& k$ u/ X/*                                                                          */
& [! k  H4 b0 }0 F: n. }* f/****************************************************************************/
: C  c) k( Z: j8 O3 Dvoid PWMEventIsr(void)* Y7 F* |3 H7 Z0 c5 A/ W. ^
{
. B/ s, G  m# {- F+ t% z7 a7 h        IntSystemStatusClear(SYS_INT_EHRPWM1);6 c# o0 Z. o" v8 O7 Q, o1 [
3 p' j& i; a: D' [3 u2 x
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
% q3 N4 v1 K; a" x}, y. V0 \2 `3 r7 R  K- j# v
$ e4 Z1 g2 W* d; [3 K1 s
void PWMTZIsr(void)
$ Q! b6 \- s, ~' g+ X6 F{
1 U2 J! Y5 c- X7 X% {8 ~) Q6 ]        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);: K# z* Y' i  g4 D" g5 Y% G2 N

6 n* Y1 {! b" P$ C$ L' H    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
& \- [+ ^' K# J. l5 ^}2 k  w, p% g$ p

% c* \( C: P9 C5 I+ D/****************************************************************************/
$ i' j4 }6 B4 Q( c" v( J/*                                                                          */# R$ ], G3 Y2 }+ a8 D! T7 D$ S. J
/*              初始化捕获模块                                              */7 k. z( @- [: a9 q, e3 k8 i) T8 y
/*                                                                          */- E) N# X8 v! `! ~) v  [0 t) N+ y
/****************************************************************************/
7 C8 E$ L, c- zvoid ECAPInit(void), ?. A6 R" Q+ A; r2 A% c
{* t6 C! ?% |1 x
        /*-----设置 ECCTL1-----*/
- Z# `: }+ Y; c4 E3 h* c! g; p        // 使能CAP寄存器装载' j( k6 V3 z/ u* t9 v
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
2 F4 G* S9 X. N" w$ O        // 设置预分频值.9 ]* g) G0 z" w3 [3 E! b( l
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);0 z) B. K4 G0 O* r$ c. X+ A2 l' E- n
        // 上升沿触发捕获事件
/ q/ R; G# @8 Z, _+ }, d6 r$ W* w        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
/ g2 v0 [1 |, [( w        // 输入捕获后重新装载计数器值.! ^. p" i8 [! N3 o: y2 L* Y: |
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);4 G+ F2 G! }& \" y; v
& J1 S& g" @7 a
        /*-----设置 ECCTL2-----*/
  z9 u9 K; m$ ?( y4 Y        // 连续模式/ M8 G& L- _" k" G% _; Z
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);- x0 s; k7 Z- ], q) u2 T
        // ECAP计数器TSCTR持续计数
4 ~3 C; M/ o5 j' t4 R        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);2 K; X$ J7 M: Q# `
        // 禁用同步输出和同步输入
1 X  s& c& v# J6 x! N; v9 w+ \' V        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);0 n  \. s1 T0 s1 V1 k, B
        // 配置 ECAP 2 为 CAPTURE 模式" y. {  i! q( t0 A$ t
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);! H; O# R9 [  O' V) n

: d) V2 j) j4 D* O4 J6 ~4 }        // 使能中断5 {% `+ J0 T8 N5 W
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);( z! t7 r& h/ }: @! Z5 N
}
- K; m3 ~4 n) k0 z0 q7 h2 N
+ @/ s" W+ |# f* V/****************************************************************************/
0 I2 n6 S& n: |- \1 U( Y) Y/*                                                                          */
9 R( `% l8 b# H* W; A/*              取得捕获结果                                                */
' w5 J: o; N7 F" I8 p( {/*                                                                          */7 D9 f) ^; G; m1 V, h5 q& Z
/****************************************************************************/2 N  {6 l5 |) w! E* F! T% V+ n9 x
unsigned int ECAPRead(void)
8 b! @+ y$ `1 X# k{
* Z6 \. W) V0 k. [; G9 R: _        unsigned int capvalue;
/ A9 T) i) p5 `8 R        unsigned long frequency;
; H- b/ Y$ Q; X) y2 `$ k* W
: G9 g7 u/ _, H, T2 Z/ N8 [2 i: C0 Z        // Event1 中断标志! H" A) O9 s- p+ ~
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))! L& B, m1 |. C# Y( X
        {+ b/ a& Z1 @6 L& `8 O& s' }; V  s
                // 取得捕获计数
/ ~$ O) A! k* \  k                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);. I# c5 I2 n& L( R: B' p
                capvalue = ECAPResult.cap1;
$ @* w, Z1 m; U
( q' H8 [& {. q  v. G5 \! y                // CAPTRUE 模块 228M 时钟主频
$ _' ~) S% V. ^* N3 ^                frequency  =  228000000/capvalue;
9 \& j( q, z0 q( @' G- j" a* H                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);$ M# g2 f* E$ D8 z

3 c$ M5 g+ b% ~! u                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
3 X+ y( `2 d: E. a# A8 G6 ?# i//                IntEventClear(SYS_INT_ECAP2);3 d2 H  P7 i/ J  L9 p
        }* C+ ?% Y+ }% e' v
        return frequency;, J/ b* P* q" d2 E4 k) q3 l" C
}
# E4 l* [. \0 j
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
! v9 i/ C7 v9 J/ C; @  [- f[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