嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
: g' |; M0 j* c' c1 m
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
5 T0 m: h3 Q+ f: }6 u/*                                                                          */
  s' T7 N8 R9 ?: J+ Z& `) s/*              宏定义                                                      */
, \4 n+ [: x$ a+ x$ x, ]/*                                                                          */. [$ x% ^" d6 ^5 ]
/****************************************************************************// S1 u% B3 }' `3 _3 P3 _. D
// 软件断点
% X) N; v/ l: d; |$ g3 r#define SW_BREAKPOINT     asm(" SWBP 0 ");
8 N( l& i* m+ a# h7 t& W+ R: h
* y: J5 r) K- Q, j; k// 时钟分频' ?, N% _% v0 n2 v9 g, S1 D
#define CLOCK_DIV_VAL     228
$ V- v, _* C4 J; S6 v) p$ h) m& Z1 u  O
/****************************************************************************/
3 y2 r, r. d! V' o% a5 n0 X/*                                                                          */
4 u6 O* V) {6 r+ n- s3 X: `/*              全局变量                                                    */+ H6 c5 S' l2 x; N/ e2 P
/*                                                                          */
* r" M2 I9 w* D0 B! c1 U1 v/****************************************************************************/2 q$ @5 ^  E9 i7 S; V
ECAPCONTEXT ECAPResult;
3 P' s9 r6 f/ k6 U; e" v4 f
. E9 w8 w7 T" f+ e4 i' k/****************************************************************************/
$ Z1 H$ x6 p+ ~  @: L% M- |/*                                                                          */6 u. m% v# w! o; S7 I
/*              函数声明                                                    */
. }/ Q6 S7 m1 v0 E3 s1 \7 E# b/*                                                                          */
: [$ g  |4 B8 g  A( Q2 c/****************************************************************************/
: A- @# w* o5 G) {" N4 Q1 i// 外设使能配置6 C8 E% B4 b: C+ R' F' I, M
void PSCInit(void);
7 B1 J( |$ d/ R* b- E* ]+ c) i. ^: j- o9 ^
// GPIO 管脚复用配置4 T, V- w" D4 U5 Y$ [7 U
void GPIOBankPinMuxSet();7 D" p. g8 [# M5 T# o1 {& K2 F" j# p
7 F) U+ s  B. Y& K; N
// 产生波形
( F0 ~" A/ S4 {0 J2 Hvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
8 b: _- c& P: Y( Fvoid ChopperWaveform(void);. i- C, O4 q; u

3 v, z7 k1 U( S0 K, c4 y// ECAP初始化和读函数
3 D0 [# K- j+ D( u! r& z2 Z6 rvoid ECAPInit(void);
& l4 P  f6 Q: u7 Sunsigned int ECAPRead(void);
- \. [+ Q  L, F# G1 o& T7 l! k7 L8 ]
//ARM 中断初始化
7 C2 r! g% r! ~( e# N7 o% c/ Z* `6 mvoid InterruptInit(void);" ]4 `/ R6 X* O5 p8 m
1 C7 P( m( c7 o# a, s3 [5 g- X
// PWM 中断初始化
. N# U& o( {& O' y/ T* S/ O3 u! p# x8 nvoid PWMInterruptInit(void);( b, U/ h5 c7 A) [2 C( U
// 中断服务函数
  O. h9 \' L% s! I// PWM 事件" u' I8 g" [' E, A
void PWMEventIsr(void);
- d1 g$ K- |7 _4 B1 A// PWM 错误控制事件9 S. W6 `3 P% b6 k2 s/ ^% q% J) {
void PWMTZIsr(void);
* S$ D8 F! D- k8 ~
  f, q8 ~  G. T! X0 H+ Q/****************************************************************************/
* x- \* N, }, m/*                                                                          */
( F' X$ p4 r7 I: v; {/*              主函数                                                      */7 a! G6 H; P) j: O; M
/*                                                                          */
' e! a9 C' q  t! ~, c/****************************************************************************/
; M1 U; j, o5 w) Lint main(void)* G6 }4 U& p, p4 \. g3 w
{
; ~/ ^, T3 [5 ~  q# y, ~& }% l        // 外设使能配置
9 \, T) d8 {* @0 W* e4 t# Q        PSCInit();& W1 w# G& B9 b) R9 V/ S2 ]

+ d: E& H7 }6 F# T* ^8 C( l4 Z% d6 `: U        // 初始化串口终端 使用串口2
) u; r, S: x+ a% q        UARTStdioInit();
/ o/ C0 t0 r3 b) X5 D5 m- \" u        % m+ L& F1 K8 C4 K, \  t+ ]% F/ V
        // GPIO 管脚复用配置4 g8 I5 G. V/ d2 K
        GPIOBankPinMuxSet();
$ L+ u, x# n! f! F" I
; e) s" q- g; y7 a; t" @, m        // ARM 中断初始化$ K6 u$ \  ^% g. U
        InterruptInit();( V/ p$ {: R) v  S; x2 y, |9 L
" i* I. F1 h$ }- j
        // PWM 中断初始化4 U; e2 t2 R8 P6 L, p
        PWMInterruptInit();+ G& y3 W( n1 s- {) Z3 F  I" A

* x) A+ n! j* M& Q+ Y        unsigned char i;: }- S2 @0 _: j% n
        unsigned int j;! s/ R( B( a! I& E
' R8 J% E: P; D
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);4 `0 Q& B7 x+ k6 k: N. ^, q& D. P
        UARTPuts("------------------------------------------------------------\r\n", -1);; O6 Q0 L" _+ o* Y+ {% x
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);5 ?- ~- f6 s& h& ?
        // 产生波形& s2 \  ~: I6 t" ~' m
        PWM1ABasic(25000,50);# P7 v0 n* F; T+ A. a3 j7 z: }# E
  v+ V6 p: O6 ?8 M% l
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);( R, S  o: x( w* y, l! }, W- Y2 T/ O
        UARTPuts("------------------------------------------------------------\r\n", -1);6 \# o( b* f" t0 p$ _2 h
0 ?3 K/ z: a0 f; X5 N1 H' `) h+ E, l

/ F, ]2 G$ t% E' U! \- }& z" h. u$ Q
        UARTPuts("------------------------------------------------------------\r\n", -1);* o, z# x5 v# q0 T/ I
        UARTPuts("                    C6748 ECAP Test\r\n", -1);6 Y  Z4 `7 C3 F$ b' N: k$ L
        // ECAP 捕获初始化
1 D7 c* H2 z, l, }        ECAPInit();
1 M; q2 X9 `+ M' ]. i2 K8 T        UARTPuts("Initialize ECAP.......\r\n",-1);
$ G! a  v' N* k. J) W3 g        for(i=0;i<5;i++)5 I0 G' n' l# w/ b
        {
, W! o+ B  g0 ^. E; H* [, a+ l& b                    for(j=0x00FFFFFF;j>0;j--);            // 延时0 \# i0 e/ q/ m4 E
                    ECAPRead();
" A: W9 F6 ^4 g1 @        }9 j3 T, X' k- h/ R8 r. M
        UARTPuts("\r\n",-1);
5 c! d7 S& |- j, S% Q2 {6 o) [        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
% m0 a9 f- M, V4 F! z        UARTPuts("------------------------------------------------------------\r\n", -1);- P, a- a6 s# z# F8 w
, a  ~1 W6 \8 }) ?: @1 x, c% @! X9 Y
        // 主循环
; ]# K- n- x( X: o, o        for(;;)
. ^, u: Y% D6 p( |, F        {1 v% I" A# G! [; h6 S: Q

  O. ]. [% F% z0 n; ]0 P        }
) E" U" Z" @# m& d$ X}9 U7 y; d& D2 I; Y
* F5 |+ w" I6 |: X
/****************************************************************************/% j* B/ X' x* O- l$ w- a
/*                                                                          */% n* X; c5 }. m7 R! ]; {5 {
/*              PSC 初始化                                                  */
* b' O9 ]  k  r: f# T/*                                                                          */
( J( G: ^$ b, p% q: ~* f/****************************************************************************/2 {% H2 [' [4 ^, y/ f
void PSCInit(void)  a# P! E& L* y/ R3 X4 c
{+ z9 o+ }/ q7 x1 A3 ?; m, a
        // 使能  EHRPWM 和 ECAP 模块
) Z- b2 E6 e% [4 {$ D* z2 H        // 对相应外设模块的使能也可以在 BootLoader 中完成
$ l/ h( u# O% [" a" A8 Q. A    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
- ]$ I* i7 Q, }9 j8 Z& O5 _2 X7 u  e    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
% g; X1 u+ ^+ l+ `2 r7 m- Z}
& }+ |+ d* B/ d; d* {
1 L/ ?3 A% v# b/****************************************************************************/
0 k1 t1 ?5 r0 O" H5 Y) N2 a/*                                                                          */2 W$ T% z/ `; \9 b
/*              GPIO 管脚复用配置                                           */
# D. I4 }+ `8 y# L2 z/*                                                                          */
! f5 I0 [7 V4 i; Q0 v. N/****************************************************************************/" R" y1 }/ j1 H, t: e6 N+ G
void GPIOBankPinMuxSet(void)
% p! T, V" I; p6 ^7 o{+ s0 V7 x+ {) r- N1 E
        EHRPWM1PinMuxSetup();
/ l9 z$ ~+ n5 z6 }  z( {: C$ E4 K. q( r( k( t9 W$ O5 X
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)5 Y: U* D' [" e3 |
        // 作为捕获功能时管脚方向为输入* Q* @2 E  r6 Y% ^( }
        // 作为辅助脉宽调制时管脚方向为输出; u9 ^: V2 P# i
    // ECAP2 / APWM2
4 n/ r8 N& }: l; \9 l* f9 F        ECAPPinMuxSetup(2);) b/ M6 `  F6 o, `2 C6 F; y7 x
/ p, ?2 F1 U) C
        // ECAP2 / APWM2方向设置为输入3 U9 M) P  e  k; J0 @4 U
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
. L9 s! D4 y2 Y# E}
$ V8 a& {- P  j. I1 g# u. p. U0 B: q+ y4 g: v$ t' [" |. W# B0 I: C+ r2 n1 C
/****************************************************************************/: f0 V4 o6 X( H$ J" }! y, O
/*                                                                          */
: D1 q: `8 N/ Y2 D) Q8 N/*              PWM 输出波形                                                */7 _  |) M% K% z  w" ~
/*                                                                          */
- P5 x( f/ ]* }3 Q/****************************************************************************/7 J, }% G7 L) N6 E# l
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
) R. K! P4 o* v$ m; i0 ^{4 t- n1 k7 o. Q- @* z" f7 {$ [
    // 时间基准配置& H1 Z' w/ ~! Y1 |; v
    // 时钟配置% v! i- I: h4 M4 D* ]
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);+ m" a- L; b6 D) |, ~5 g# {2 C
1 T: j+ K' B- S% e7 J2 j2 i
    // 配置周期
! p3 i- E  z: k; [3 e/ V    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
7 ?/ l7 Q% ?+ f5 S. D- U5 C* F9 T' l- B                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
9 n1 R, O  p/ n; _
3 Z+ A% J  K; s; y5 C7 y  y    // 禁用输入同步信号
; u9 d: a: r0 R7 _. E    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
+ D- Z0 [2 u7 B1 J0 }( p8 ^9 o7 |9 J- q  L1 i, k, w3 Y- I" j7 E$ _( z
    // 禁用输出同步信号1 E9 r+ b3 o+ J! x
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
, o0 F9 f. {7 C  t% ]5 I; i; `% Q; m% G  n1 R; [! b" i
    // 仿真(DEBUG)模式行为配置
7 Q; ^: F3 Y3 @+ i    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
) _3 K: E) z" @  H" X3 x( {# m) r
, j$ ?* c% J: P  V    // 配置计数比较器子模块
( X" h& j" |4 g2 h9 e4 x2 c    // 加载比较器 A 值
4 O+ r% ]; c! s7 J    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
" v/ I  O9 _: \; X1 y3 Y                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);6 I6 X6 `1 {8 \6 z: k

& q) n# g; \0 F0 H! W    // 加载比较器 B 值; v* M* u1 q7 j- h% U! N
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,2 x, h4 v, |: g9 q+ @7 v
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);, v/ A. D5 W$ K# ]7 G( i2 i

0 y+ \6 `' H. e6 ?4 f    // 功能限定配置(输出引脚触发方式设定)
! [  [; R1 C+ t; n+ K, w5 l; t- \    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
! G9 a" V3 q& d2 z, L9 Q    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,8 J( b5 o  ?& `! I
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
9 ]6 i% K1 i+ T                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);' s2 D& a0 C# X& ^6 z3 M4 R
# x+ b# J# \! [% p8 U" o; y
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
3 j3 }- ~3 L/ H& ^' u    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
& K+ p. U; t% M9 M8 |
3 y) F& E2 D. }    // 禁用斩波子模块
+ o$ c  L, h0 u, x( z7 M; A3 H+ H. y    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
, x; Y' `; M2 m5 {7 x) O2 P; ~* Q5 V) e% ~5 ]
    // 禁用错误控制事件
1 B" @  K/ n1 t    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);- ~! G; p) c/ L% r4 q: J9 J( W
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);9 K  E4 c) E: F9 I4 T

7 N+ Q+ y8 p# `) B    // 事件触发配置
" ~7 S& p" k; M5 ^    // 每三次事件发生产生中断9 Y2 w# G' p: `3 T$ w) R. C
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
; r. H# j( H* ^8 B) E9 L    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
- V* J4 b! R& i; v( H- ^1 ^    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);) [+ ~0 |& P# ~9 M( g0 I" Z; Y4 [
    // 使能中断: T( a% e/ H: j
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
  n/ R2 a& p$ y+ w! D! g$ M0 }2 R  H1 U
    // 禁用高精度子模块6 |6 U- |+ A; ?( B% k5 l
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
; V. l5 a; w! \/ [; A  P# b( Z9 U( m4 S7 K5 G; L* G$ h0 e7 N, C
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
# _" Z6 }. X( o! w' w/ ]- F}
5 W  U1 T2 ?9 J
9 g) ~7 P3 ]. X. u4 ~) xvoid ChopperWaveform(void)( m; d% o" Q8 k9 B0 L
{
( Z9 N+ q/ T' _    // 50% 占空比
$ }' j5 m7 ~# Z+ Y    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);* A' `7 j8 C6 n( \4 w  B
    // 4 分频
2 [5 e) \- H* J/ @    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);: n1 Q4 {3 S6 v- t
    // 单个脉冲宽度- N; N! z+ Y  Y
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
6 a* _% I2 d' B8 Q3 ~; ?    // 使能斩波子模块
/ B1 U$ K* |6 r- K; a7 A' P- i8 ~    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);' R3 U. x. d9 f$ N) b+ k1 x
}) ?! l4 a" J) S( R/ z6 y; h- a

$ ~: v& H% Z0 E/****************************************************************************/( s( V2 M8 I# a7 W
/*                                                                          */
6 q1 d$ Y. ~) }0 u/*              PWM 中断初始化                                              */" B2 @: v7 N# Q) R, z$ g5 D
/*                                                                          */
1 C6 E7 Y+ K* @1 }' g( _7 i# h8 F/****************************************************************************/: F: S: l9 |. W5 v! u) f
void PWMInterruptInit(void), A2 k% t4 E5 f2 q/ n, }8 m
{
7 O5 x3 [/ ~: B: L7 S        // 注册中断服务函数% B+ J# @# N' F8 V
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
; h8 `. ~3 u8 N, I$ }' n' Y; I        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);8 ]# @. k: o; l0 I- ~1 {

% X7 e7 @4 H! T( j, X        // 映射中断, F% ]4 o( X% e, c6 d! s4 F, A
        IntChannelSet(SYS_INT_EHRPWM1, 2);1 N! V  [  @8 Q2 E, w8 ?! H4 J) i
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);4 A8 b+ _3 M2 d3 h9 j) t
3 z0 H& j6 H8 u( X! [
        // 使能中断5 t: I! g' k0 i( ?) |5 p
        IntSystemEnable(SYS_INT_EHRPWM1);: g2 W1 u, B; ?
        IntSystemEnable(SYS_INT_EHRPWM1TZ);
2 j) H/ Z6 S+ p}
5 G& f1 i' T; W
0 `. D# x7 }4 n# ^0 u/****************************************************************************/) v/ {5 }3 z! l
/*                                                                          */6 @: d9 i; J; l  u, q9 v
/*              ARM 中断初始化                                              */1 s- w9 o, S" N% u
/*                                                                          */
8 Q" q2 ^2 i6 m9 c! F$ Q; r/****************************************************************************/
4 I5 W' M$ m' g+ k4 @void InterruptInit(void)
4 N% q7 T4 A% }$ _{, b; r! E8 J- B  D# x
        // 初始化 ARM 中断控制器
7 R- D7 r- N, |* J$ O; ]( ^        IntAINTCInit();4 v5 v8 e8 C9 B+ w" t, H
9 ?& _: q1 w4 M; s7 w, h+ M
        // 使能 IRQ(CPSR)6 m+ `  ?$ ]/ c+ H: a
        IntMasterIRQEnable();8 ~; x$ ]' k$ ]! T

2 {/ Z3 u- |# w7 ~$ F) T        // 使能中断(AINTC GER)4 |8 p. s) H1 h/ v4 U7 R2 z
        IntGlobalEnable();
. ?1 }+ o% v; j  C' o' C* ^3 l) M! \! V7 p
        // 使能中断(AINTC HIER)
7 u: a% H, z/ \" Y% F  r        IntIRQEnable();; M" t  Y5 y% X- B( a, _3 C4 a; S
}) S0 ]! [, k. K

/ f$ Y% A( H2 h- }9 ]7 e
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/% O' @0 Z8 T: {2 s+ L% @
/*                                                                          */
" j% n! A9 z( Y9 s/*              中断服务函数                                                */
: H9 {, B  n  c' [) U/*                                                                          */. u' G* ?9 g6 R# i6 s
/****************************************************************************/4 s  z0 E5 w" k" i1 t
void PWMEventIsr(void)
' o& s* G3 v$ W8 l$ i, Q% F" r{
- h! b2 Z+ \7 r+ [" e! |        IntSystemStatusClear(SYS_INT_EHRPWM1);
1 ]  |' |) A2 A6 v
6 U! U; s% V8 H- R& X: y. }    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
, k7 z% M# [% X5 ~7 I}
. {% `& a) y) U$ W# T8 C7 m- J; U% J: [3 b7 Y0 W, {
void PWMTZIsr(void)7 }, h: c6 c) X3 ?+ Q. i7 P+ o
{% e9 s1 n2 J( w# J
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);) u3 G5 ]3 O# R

- |3 F* c$ H6 }8 y7 R    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
& Z: C' b5 [: Z  A}
# N# i+ y) {- x0 I" l* ~1 N) b4 @3 F, {/ D
/****************************************************************************/
: O7 X& x0 z1 N! ^/*                                                                          */, k2 x% E4 t4 t  I
/*              初始化捕获模块                                              */7 G( ?0 l6 a1 T4 J3 u1 x
/*                                                                          */
( l0 O; j6 ~# H& \/****************************************************************************/5 f4 {5 c' v1 b( w; E. @
void ECAPInit(void)6 _4 S, y' G; X# Z
{1 d2 g3 u9 a% {
        /*-----设置 ECCTL1-----*/
( Q2 _" W% n2 i4 O        // 使能CAP寄存器装载
5 [6 f5 a! e4 Y& A" @7 K: P        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
( x! h+ @8 S5 n+ h2 r        // 设置预分频值.
) y# }" Z, B2 d        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
% U& |/ A/ f1 b) x        // 上升沿触发捕获事件6 [, q- X  |* E$ Z
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);# Q6 {% u: J( `1 }; N0 ^/ k
        // 输入捕获后重新装载计数器值.5 f1 {; M6 ?+ z, x2 I$ Z% y
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
  W  `: K1 `& I8 n8 M  s
2 E! l* [' T- l        /*-----设置 ECCTL2-----*/3 U3 _8 C% d4 Q) h
        // 连续模式7 M8 M) C/ B/ Z6 l$ G
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);6 S# j  m/ s, \+ k3 u* u/ i
        // ECAP计数器TSCTR持续计数
# X2 ~4 |3 \9 z7 m# r9 J; h        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);8 p4 L  n/ n$ w- C/ J
        // 禁用同步输出和同步输入& B+ o* G' a( g% z
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
2 M) e7 }# b6 {; J0 \$ {. S: Z        // 配置 ECAP 2 为 CAPTURE 模式
/ d2 }* n3 q* F7 N+ ^+ v2 \        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
& m- p5 n/ ^9 a( H/ ~3 s6 s/ s0 R2 `+ P; X
        // 使能中断
5 P+ @( {* a2 p( w: Y' `6 S! L//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
3 A/ a! b1 \# |. v! t  M( _! \. u}% ]/ N- g5 V/ x& o4 L! ~
# \5 e5 s4 s; C* b
/****************************************************************************/: J. L4 g8 o# Z# W2 r
/*                                                                          */3 X* v$ V" n% m( k* i# n
/*              取得捕获结果                                                */
/ g9 ~! }" @: C* k- O/*                                                                          */4 `+ t: U' H7 i0 l8 ?
/****************************************************************************/
- R* l5 s- [3 |: w& K2 r+ [unsigned int ECAPRead(void)+ G; L7 {- f' l2 E6 W# b0 C' _
{
& Z. L9 X7 {+ l0 I1 `/ p# L+ X7 e        unsigned int capvalue;2 [. w5 A" ~! s7 T+ ^' J! O
        unsigned long frequency;% c5 F+ b' y# M
% f# j& L, w* G4 m9 }) l* V
        // Event1 中断标志
8 Q' _( {+ E4 \4 W" u2 J# {        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT)), g6 T+ ?( a  {! C, M/ l
        {
/ a$ [- V2 K' z' Y% |& g                // 取得捕获计数( H" G3 b6 B) H- ]+ I- A
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);5 M# o' J- |5 U1 o% l' ?2 q
                capvalue = ECAPResult.cap1;
1 p2 v/ N7 K& P9 R: X, L2 a! Q0 T# F$ Y. \1 g. t
                // CAPTRUE 模块 228M 时钟主频* r8 R7 @3 K5 b& s
                frequency  =  228000000/capvalue;
, }# S+ V2 _* L  a5 [                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
6 X9 u- a$ Y& I& J# {1 ?2 ~7 M- k* a' M$ P( G8 a) O9 S
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);2 t( C4 J" A5 o4 ]% P6 w9 b9 p
//                IntEventClear(SYS_INT_ECAP2);
1 E1 N6 W  {, D6 G4 w        }
7 [2 k9 q+ w6 i        return frequency;
0 L! i- C* d) d' w$ X}
! E9 M3 T) f% m0 k+ e8 Q
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
* m: B, F5 Q. u2 g) R. i[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