嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
, k: q; l0 V/ C  u) C4 Z6 N/ W
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/% q; `" C, ?. Q8 B8 D9 s+ a
/*                                                                          */0 n* T2 k6 O" k' i1 i
/*              宏定义                                                      */) R) j! b4 \# x% x  n
/*                                                                          */: Z5 H- P& [8 L6 f. Y# B
/****************************************************************************/* |/ `6 ]3 _* W3 J9 B) I: A
// 软件断点
4 I& M+ t5 Z$ d6 u2 K#define SW_BREAKPOINT     asm(" SWBP 0 ");6 n6 r; f0 }/ F* s) S& v- J2 T

; T! x( y% a8 U- M  H! Q// 时钟分频
0 z, Y) |) D" i' h, u' i/ i#define CLOCK_DIV_VAL     228
& G. C6 |# X" |. V" C- ?; x& N. C' n- f. h% n& e
/****************************************************************************/
- K- M3 R* y* ^/*                                                                          */
. W1 z0 z" B/ }9 J% d/*              全局变量                                                    */4 u- v) M; t. J) F
/*                                                                          */1 V6 ?3 J0 m' r. G
/****************************************************************************/
2 u/ s/ K1 d8 g4 k& B- lECAPCONTEXT ECAPResult;, O  E/ F3 R; T) R* R
5 O% m/ r9 X1 r  \8 m
/****************************************************************************/! h) Y3 z& n, e, C; o
/*                                                                          */
4 S9 X% ?) O$ z9 _+ E4 J/*              函数声明                                                    */$ e: N. K) y* s1 X; b: r
/*                                                                          */
) P6 Y2 r9 Q, c6 W9 K2 R/****************************************************************************/, B( y2 t# F# F5 h  Z) Q
// 外设使能配置
' P3 `8 Y2 G( S0 Cvoid PSCInit(void);
& E6 k5 U  b6 m' f/ ?/ a! o0 r$ @* T+ D9 O
// GPIO 管脚复用配置
7 T3 y! q7 @0 v4 u% t3 q9 evoid GPIOBankPinMuxSet();3 U- N) m* E" I. H! R
5 _: I) X3 H8 Q) ]- B
// 产生波形/ [# b2 W! z7 \1 J' y& f8 e6 \  b
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);, h+ b8 ]/ G6 S: A, U0 B
void ChopperWaveform(void);4 K. @4 t1 z: z& a1 ~9 s1 _* g  C  ]

$ i$ j# w& _+ Y0 C$ M// ECAP初始化和读函数
: a9 e) l" o0 v( r. Fvoid ECAPInit(void);2 i0 o+ K" r- |. D. E+ S
unsigned int ECAPRead(void);
8 ?# g1 ?! ]8 b+ g) Y# p) n6 L3 Q5 l' c1 R) a* b& i" k( @
//ARM 中断初始化; b% }' e4 G, J, v
void InterruptInit(void);; p/ ~( E; R  M( j7 f

, \4 F( p2 @2 b. w3 }  J8 o// PWM 中断初始化
1 S1 s- ?- D  _! Avoid PWMInterruptInit(void);
' H: p7 ~. a" Q- V6 w# @0 G8 F2 g// 中断服务函数
# k# d6 w- I0 f0 ~/ r% w6 n- D// PWM 事件
0 X8 _9 u- t1 x8 |0 _void PWMEventIsr(void);
# i# m+ ~7 u! G" N4 L7 m// PWM 错误控制事件. ^7 q) W/ e6 |& t2 v
void PWMTZIsr(void);+ Q, ^5 l7 ~. c0 \

: W2 F; B& B6 X+ q5 G: H/****************************************************************************/
0 v7 K" k: m0 ]/*                                                                          */
& o# H& X0 {1 }/*              主函数                                                      */
% s. V/ X0 S; l" T& r2 k) h: k& [/*                                                                          */
: D3 R$ B& h1 b5 P/****************************************************************************/- b6 o) |6 j  B1 p2 N
int main(void)2 T' [* h/ x9 V" `0 y9 v$ |4 i
{
' ?/ O5 }6 t! s        // 外设使能配置
% P. ?# z: _1 k        PSCInit();: F0 C) G, R3 @' |, p' Z" M

. w6 a( w8 z! k+ V& l4 C" I9 H: e        // 初始化串口终端 使用串口2, d: }  `, |8 M- M9 n& [  K# @" f. }
        UARTStdioInit();
* v3 ^$ b9 q( O8 `! t       
% R2 B. W2 e' V3 z# F9 c4 g        // GPIO 管脚复用配置
5 z  [! E; d5 f( ]( p        GPIOBankPinMuxSet();* ]6 q, r' h, w+ k/ p9 {- H

1 D) F0 H. P3 b  T; @        // ARM 中断初始化
4 J/ x( ?: ]' v& C        InterruptInit();
, Y# v$ d! ^! V7 b* ~( ~+ u0 J, A. U: i4 E" k9 m) N0 f6 s9 C# U: \7 R
        // PWM 中断初始化
/ q9 Q! b" u) v2 z3 Q" W        PWMInterruptInit();
# C8 g0 N: N, z
9 S- a4 g. ?- r! X6 e        unsigned char i;
# ]0 |4 f5 S+ L/ z* P- R        unsigned int j;) N' J" D9 d+ s+ R% O. J

2 y# ^' D9 m6 t( z2 ^1 {  m        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);/ a% I( t/ R" R
        UARTPuts("------------------------------------------------------------\r\n", -1);
1 ~3 a& j) t8 h2 P( j        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
6 P7 z% r0 D/ }        // 产生波形; A7 \. l- R" S3 }* w- X- o; t
        PWM1ABasic(25000,50);9 \( g/ K" Q. M
4 |+ ]( N% [* C+ _
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);8 Q2 A, E/ z% l5 |+ a$ c
        UARTPuts("------------------------------------------------------------\r\n", -1);0 _% |5 k9 S5 O" F
# |$ C, K3 B3 _$ U

1 p! e+ @. {  h7 B. l4 r* I% u) j" y) b5 [1 `+ N+ [
        UARTPuts("------------------------------------------------------------\r\n", -1);" E+ {; q, I  E9 U. N" o
        UARTPuts("                    C6748 ECAP Test\r\n", -1);. A; x. J( `3 @& `
        // ECAP 捕获初始化
0 `( k/ j3 t( X% Q3 q1 d        ECAPInit();
* m" e" b0 y9 d9 V' b        UARTPuts("Initialize ECAP.......\r\n",-1);) n' l4 Z6 |6 O; J& n2 Q: @+ N6 l
        for(i=0;i<5;i++)
- p% _; K( g) ~- b# B3 @- ^5 y$ y        {) `4 L  ~7 i  k  W: O. o
                    for(j=0x00FFFFFF;j>0;j--);            // 延时. ], k% y8 ~# X4 V2 E
                    ECAPRead();6 F7 I/ m  p0 p% H/ B  b
        }
9 P+ b* ?5 r3 O        UARTPuts("\r\n",-1);
+ a3 _8 }* M2 P# F! X. U0 r. `: {        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);8 \8 O$ F( o( J, d
        UARTPuts("------------------------------------------------------------\r\n", -1);
! w) y8 ?$ h: o/ l- m0 R8 e
6 o1 j) O/ \  e0 h        // 主循环  k7 [2 b2 `% ]0 l
        for(;;)
$ A+ B3 n; c/ A& K6 w        {3 z' N: l+ @+ n& u/ O  ^$ B
) z7 z0 B" ]7 Z' T
        }
( {- W  c6 S- ^' w0 z: {0 ~& ~# k}
( J/ d8 t( ]! M9 @4 g$ T4 N! G; M1 y! i6 `
/****************************************************************************/
8 S% L% b+ H" }, X8 o/ v3 z7 M/ a' I/*                                                                          */
) b/ B/ C3 U6 t& e- G& E/*              PSC 初始化                                                  */
  C3 r! k% t4 b0 N( C/*                                                                          */
% W) e/ M5 R% B7 K$ G: k3 G/****************************************************************************/
& W" f. Y% \  Z& F6 `: Z+ Ivoid PSCInit(void)
- Y8 z4 h& F: k5 ]1 v{/ a( M/ }2 a* e
        // 使能  EHRPWM 和 ECAP 模块
- n  V4 Q- [( a) R$ c3 w9 R        // 对相应外设模块的使能也可以在 BootLoader 中完成
1 c# e- O( G$ l0 G$ p: \' K9 s; B* |    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);0 g5 }( X7 v$ N# ]
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
, Q2 C) @* D! ]: t2 y% d/ v6 _}
* I0 u4 f; ~8 ]  g% B* k! x
. I& ~; {8 q) o, }/ f/****************************************************************************// F  ?$ @. ?# Q% d! r- S- v- o" ]
/*                                                                          */  n+ r9 D. `" n1 X, r1 C: o
/*              GPIO 管脚复用配置                                           */3 _6 y% O1 ^3 g8 |, Y6 i- w
/*                                                                          */
4 f1 i* h4 P) t4 Z0 Z/****************************************************************************/2 v) H* ]7 @  E& w! M
void GPIOBankPinMuxSet(void)0 z; q( b( X$ h5 Q6 j7 e3 m
{
2 }# t# t7 J: |+ i        EHRPWM1PinMuxSetup();
; E. e2 C# p7 C
- ]/ U+ j9 T0 k, H0 R7 z        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)2 m2 k" d  U" L0 \
        // 作为捕获功能时管脚方向为输入
1 A9 \% ]$ q7 [4 l1 B6 g0 B6 W        // 作为辅助脉宽调制时管脚方向为输出0 ~7 D  G4 G* [7 {" i
    // ECAP2 / APWM29 b9 x! p& D' Q" q% z
        ECAPPinMuxSetup(2);
8 P& f7 B) a/ {2 q+ j: v+ n& |  K) {$ P8 a# I- e& N1 U
        // ECAP2 / APWM2方向设置为输入
: A  t' f1 B) f% c' m8 N        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
) u, j' v# J# B: ?, z2 W}+ q) |$ I. P+ _) z

& ]' \7 j- S$ ~, k# U4 h1 d% b* @/****************************************************************************/$ K& l* C; d2 c, R. m; V
/*                                                                          */1 k# E8 S6 D2 R, V9 c) R; M* L
/*              PWM 输出波形                                                */$ n/ f1 n, s% L* x6 ?
/*                                                                          */1 r6 h6 ~1 u" G1 l2 r2 p; S' v
/****************************************************************************/
3 z5 m' }0 B  r& \4 s/ \$ qvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
9 H! ]4 `% N  D1 g, l) x' G{5 v1 A7 \4 H6 m7 |" d! \# p  A# G' j
    // 时间基准配置
" u% l/ |, D3 S& e6 G" {8 j" v    // 时钟配置
7 i( J5 @" }5 E1 P1 I    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
) X2 N; J, |+ ?+ g6 f; B6 X" y$ {+ l9 a. Y! S
    // 配置周期
% N7 t2 c7 K5 I6 y. ]: K+ S    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
* r( x1 ?( u, A: v                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);# K' J0 a! k( h. W; D! t$ P# _

" B9 P" }. I6 @. }/ K    // 禁用输入同步信号- v2 l0 }) `% r  ]% h# x3 Z
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);% c5 K4 v/ }( g: M) N5 G6 U

1 v  T" D& P+ d) Y    // 禁用输出同步信号) I1 z. b7 W( j: r* A
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
# E* U9 T' _5 N2 Q
4 N9 o7 o  z# D& O$ ~    // 仿真(DEBUG)模式行为配置7 Z4 J' G" S* ~! D5 N8 E9 L1 k6 H
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
5 M' M! N" [) g5 f( X( F' G; U/ @; B& \( {6 N. f" Z
    // 配置计数比较器子模块+ F; T; {4 u( ?' x
    // 加载比较器 A 值
& `( T" r6 U+ f, i# x* R& s    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,7 r% e: ]+ h5 Y% Z' M
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);, i- c1 e2 f* P8 {; u

* R* M4 y- Y0 g- B0 h3 \: p    // 加载比较器 B 值% f& n7 ~( g3 ~
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,- b( h" i: C1 U( v9 ?+ ?
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);( ^! V; X7 C; i. Y
- i/ z, o$ @0 Q4 J, Y
    // 功能限定配置(输出引脚触发方式设定)
  q( H4 }5 R& Y0 {    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
* E5 }* ?: I  J0 }  r+ v8 r* Q4 |    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
- L' F: L3 H9 N6 ?9 s/ _                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,& i4 n- R, x+ `$ o1 z2 c3 _1 D8 h
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
6 w& A! H# d3 p: v" K" |1 ~
' e' G/ v1 ^1 d7 M    // 禁用(旁路,信号直接输出到斩波子模块)死区模块$ I! d2 V' P0 l6 u) ?8 r7 I* P
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);: Y7 f2 B1 Y- h* l; `/ ~8 c

/ |% {3 z+ I2 f4 f+ H- H    // 禁用斩波子模块2 k$ K9 o8 I( l; p( ?  x, l4 b
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);: y5 W8 q* j% i9 N2 N5 Y

8 S# i3 O7 C5 f/ u    // 禁用错误控制事件0 S: Q3 C1 ^  @+ V; t
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
8 {# T9 t1 C7 q/ W9 M8 M    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);$ }. ^+ J( ~7 q( i* t

5 ~" u2 r+ Z% c  _    // 事件触发配置5 V. X+ b7 v6 W( X: Q/ e
    // 每三次事件发生产生中断9 x- N  f0 ]- R2 R
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
! k! g; N  ]- ]8 N# ^/ E7 |    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
* [4 k/ c4 B8 e* r  L9 B0 o; U; L    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);- D0 C3 L: n& P$ d
    // 使能中断5 h. I/ q% g) X1 o
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
, _3 l2 I. B( @2 u4 A) S9 R6 |. h6 X! o! K4 `- g- S
    // 禁用高精度子模块/ E9 S5 |8 ^; \1 C% @
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);# W( D( m4 F  [) J" u
( t0 M* ^" X( u' h
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);! o2 l+ P# w5 F' @3 O/ }& j
}
( b4 o7 d3 N, Y' M# Q) i5 J/ |. Z
void ChopperWaveform(void)0 q: ^4 a" E# \7 L) z7 ]
{
, N( ?" J" _0 E$ L5 T    // 50% 占空比
; N9 [9 r8 O! |    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
4 v& A7 _. V9 k% h* \    // 4 分频
# D' v  q- e7 m! @    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
5 j# z& f* k% T1 W4 J( v+ t    // 单个脉冲宽度
4 c: I2 |# D7 g    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);* k( P6 O3 G* w/ \. i4 \( {7 G
    // 使能斩波子模块
4 v" X: p( J! l( Y    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
: |3 y5 F0 {0 o% K) _}' k" Y8 f/ |/ v- f1 B

2 {* T4 p/ e' |/****************************************************************************/7 x  w$ X* @3 ?$ f) s% [3 r+ X
/*                                                                          */
0 t  K! w) D. D* G6 O! R/*              PWM 中断初始化                                              */
6 ~0 [/ b/ E% R- t4 D1 c/ f/*                                                                          */; F8 w- ]. P$ N9 J* V
/****************************************************************************/
0 r" z' t. I9 [: w& rvoid PWMInterruptInit(void); y$ K" {, L- d8 {* D* N
{( J( W) i; T1 S0 y. w4 s! Z) o
        // 注册中断服务函数' `6 X) z5 ^  K) x+ F# v
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);" v8 j3 ^" l+ q& |1 I7 x/ B, P, F
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);, |. Y' A" X, J) X* F" f) `5 l' f7 z1 F

/ ]2 J1 _5 T% w        // 映射中断
) Z: _- [! D) N        IntChannelSet(SYS_INT_EHRPWM1, 2);
! A& d  p, |! |  o5 ~4 ^        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
; Z5 A5 L9 G1 ?* U8 L8 o" s* p2 Z" d; Q3 F; u# ~
        // 使能中断# g( N$ I+ A  ^& {1 m
        IntSystemEnable(SYS_INT_EHRPWM1);3 h# Y1 q( D) B' q% b: ]' v
        IntSystemEnable(SYS_INT_EHRPWM1TZ);
; A" ]6 F9 Q8 y}$ x0 n4 }! V4 B; `  E1 Q
$ i- R1 b3 d# K- F( ?5 @) E
/****************************************************************************/
% R1 J! Y. p7 i  n- Y- W: f/*                                                                          */
$ T  A( Y$ O* b/*              ARM 中断初始化                                              */7 u" V# v4 Z8 K
/*                                                                          */
" [8 i! o8 }, _/****************************************************************************/, p  u4 {) w" T
void InterruptInit(void)) @3 G4 g6 C5 Z0 x: |; z  h
{
( K" N: R- M* q0 K: I        // 初始化 ARM 中断控制器
5 ^+ t# r- T) {% Q  M        IntAINTCInit();2 w5 ?* M/ R9 V3 {6 y- k0 s& k( @" d# \

4 o7 E9 B" o2 \3 G- ~0 Q        // 使能 IRQ(CPSR)
3 N% K( {  P/ Y+ y; @; n        IntMasterIRQEnable();
. Q' \9 Q- S) c, k6 X
. |: ?3 E4 ]" X$ B        // 使能中断(AINTC GER)
4 }7 W$ c4 E3 v+ @        IntGlobalEnable();  v# i/ g- r/ ^/ @/ b- ]- w/ f( S9 k

3 D0 [! {' ?* H+ A        // 使能中断(AINTC HIER)# v2 _, t% o! T0 ?4 k4 A9 g
        IntIRQEnable();
; q  I" \8 p) r/ w4 F}8 O( T8 x) b' y- a3 ^7 \5 @" F. k

; S9 Y) Y9 t. m2 ?
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/
2 ?' l# J6 a: J' }7 B/*                                                                          */
+ ~$ k% p; i1 G) P" ^; [/ B4 }/*              中断服务函数                                                */
! T. u8 O( V; ~, p' W/*                                                                          */9 y( x- _' ^" I7 w3 |1 C6 j9 s0 Z
/****************************************************************************/5 |' R' ?$ o" ^* C: ^
void PWMEventIsr(void)5 p% d7 ?% B( W8 H
{% y2 O' }9 P. j0 V
        IntSystemStatusClear(SYS_INT_EHRPWM1);) |5 O, `% s) X4 ~/ q% p  k- J% J
/ C) c& U. k' e1 v& z
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
1 Y0 c9 Y; ^4 p}
6 n% y3 K0 A; L. s
3 w- r3 _5 A  a) Dvoid PWMTZIsr(void)
; ?) j  f3 k* A2 u" x" M$ V{* u' Z8 T% A& R2 h& S% w
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);7 k& \. }. }2 a) ^/ A0 ^

* a0 E0 f8 q* G( u. l* Z0 L& f    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);" D, @5 d/ D; ^. W6 y
}
! m& q# r1 h2 V1 ^- ^0 d: [9 T8 W. z+ s$ u) i; ?$ C: D
/****************************************************************************/
% o$ Q$ y, _' L& E- d# v/*                                                                          */1 g, N1 v2 j6 X' n- W6 I% w
/*              初始化捕获模块                                              */
& D$ l) A, q. N6 D, V6 Q/ a/*                                                                          */
  T7 S4 D" L: q  h/****************************************************************************/5 _4 X+ u" ]0 m% t! b4 z
void ECAPInit(void)
: ]6 L; _, R0 }1 a# |{
% ^3 b, z& O& ^* V& U        /*-----设置 ECCTL1-----*/8 g. F; L! J: ]) L+ {# M1 t
        // 使能CAP寄存器装载2 }- E! t4 @* C2 Y! R. ?  z
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);7 T' d7 q4 s4 E, c# ~2 p# f1 y: d
        // 设置预分频值.
( i! u. L! \# Q% k        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);( e/ J( ^' ~- x' t8 v7 d( v! F9 M
        // 上升沿触发捕获事件
+ C8 s4 M3 R6 S" G6 ?5 X% f        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
3 }6 J2 F: [4 u0 T. E3 T3 V" X. A        // 输入捕获后重新装载计数器值." t7 K% x' H. c; x/ t+ p' P9 n2 q
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);- D9 @+ ]* W9 \1 `5 l: o
; _$ J( z" e# V! U7 k
        /*-----设置 ECCTL2-----*/
# e9 C' i. C& x5 w7 {        // 连续模式
$ k, }4 H. l2 C3 v        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
" n/ H" S3 }+ \$ t5 R$ H        // ECAP计数器TSCTR持续计数2 Y' k% B4 b" b' @7 X8 @1 ]
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);: u/ ]+ {; C( L7 b5 H' ^+ [: T/ @7 o& P
        // 禁用同步输出和同步输入4 z2 F* y9 L% I, D; \  f
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);5 }- y" |$ I; A
        // 配置 ECAP 2 为 CAPTURE 模式
9 R8 C& @9 o9 Z# \2 E5 T4 t$ `        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
, l1 P1 Q8 t  {; {: j# \# s" j0 u9 s5 q; _8 c# ~- I( q
        // 使能中断
/ k* p  v9 C) x, ?$ [- F& A//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
# V: y: ], Z, R( Q, F. g5 R% G# x}
1 V* v! \: d- O% @
( o: L8 o. ~) O* z& r/****************************************************************************/- V! j5 K0 z9 n5 I, x" ?$ g5 y
/*                                                                          */! i( w) T# r5 Z; v% J7 ^5 ?9 q
/*              取得捕获结果                                                */
! V% U# k3 ?3 \3 a) e) N) {: F/*                                                                          */
7 T; _- V* w2 t. s3 [& ^/****************************************************************************/+ E9 j1 O7 [1 H+ G0 V
unsigned int ECAPRead(void)
% M% i1 _1 P4 _* K( [{7 v, I" g% j& U& u
        unsigned int capvalue;
( m6 c7 S) e) s' f        unsigned long frequency;
" {) Q: z+ D  z# ^  R! ~& u5 j+ e
6 h- e( V! c8 s; ?; R. N% q# ?        // Event1 中断标志
6 e1 T" Z5 r4 u* A- v        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))9 E" b9 f8 V! Q0 e4 p' J
        {
  Z4 t  e7 _' ]% W# C* ^" o8 J% r                // 取得捕获计数
: J' U3 E& ~( M                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
9 Q# C0 l: l1 M" |' f, f                capvalue = ECAPResult.cap1;
% Q: m( ?6 G2 e, K; l% h3 e( ^3 W% |
, _( F4 Z$ S4 V% _3 m4 k                // CAPTRUE 模块 228M 时钟主频
2 e9 G* D' o' D0 h& i" o% F0 O                frequency  =  228000000/capvalue;/ t" S9 r) c7 d0 }% Q
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);8 [" ?. |% `) O) b
% Y6 C" `0 R4 Z& G/ N$ g
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);4 B% P: u* @! }0 u* t; Z1 D  O
//                IntEventClear(SYS_INT_ECAP2);
9 E# n& G0 u  D. r" N  T- S! K        }" o9 R  R: O# N( X2 q& E" m
        return frequency;
& T2 y1 P* r0 G/ L7 Z' j}' u5 w4 Y' {' Q& d. C, J

作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。% Y9 f+ k& }$ N. ]& V2 R' G
[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