嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
8 d" V; @% K1 L: m' D: v
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/+ r6 y" ~5 E# A8 E
/*                                                                          */
/ J5 h3 C: D# w  K4 N" d2 k% z/*              宏定义                                                      */
5 R+ m! T2 N; ]0 P/*                                                                          */6 L( u+ Y# P2 |; I7 t
/****************************************************************************/
7 N+ U+ _0 `- O% [) e. ^& v// 软件断点$ x2 N/ l+ H3 h, ~  Y$ t' Q- I
#define SW_BREAKPOINT     asm(" SWBP 0 ");
2 S0 a6 z# o$ t
, i2 X5 e# ]0 b* _4 i3 e# |// 时钟分频
# }; ]( z4 x8 j+ b4 s#define CLOCK_DIV_VAL     228
3 e$ d, L# y: C. u3 l  e% w6 u8 I0 I6 _6 Q5 f( j
/****************************************************************************/
3 F* w% q/ G! F4 {% N% x8 J3 i/*                                                                          */
; h. W/ n7 H1 A/ |/*              全局变量                                                    */3 \. b, y9 I/ ^1 [3 H: n
/*                                                                          */! m  a% l& }; e) w
/****************************************************************************/
, |& \+ q3 r7 q2 V/ P' bECAPCONTEXT ECAPResult;; I! }2 E) Y) r6 k2 H  x% s7 k/ U$ s
1 w0 _! ~5 z3 v5 R
/****************************************************************************/
% r+ ^% N! \/ G- l& K/*                                                                          */
6 f, m. X2 c% q( }  W7 Y/*              函数声明                                                    */
8 ]3 _3 V" g( ?  n' `! S' t) R! e/*                                                                          */
" m: Z7 O, p$ r/ E$ F  f/****************************************************************************/
! X/ O$ Y; a* o  G% Q$ }( N% c" L// 外设使能配置
( b' P& f; Z  H( R$ s; p1 xvoid PSCInit(void);/ k) {7 w, e/ M5 e6 B7 Y
: b- b2 P2 B2 N6 i1 P0 o3 c3 d
// GPIO 管脚复用配置
, F; I& ]8 \  Fvoid GPIOBankPinMuxSet();
- A  d7 w8 O' r. Y8 i8 C1 j4 M4 Z' N! [8 X
// 产生波形
5 n0 ?3 q  n8 }5 v0 G- ?void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
' Z4 c& H; m' C9 T* ivoid ChopperWaveform(void);
3 q, H* S$ A. d) \7 s; K! t9 ]4 f7 N" q
// ECAP初始化和读函数
* [+ ~, o, X2 K3 u& l: f& evoid ECAPInit(void);9 M9 Y( V* i9 F
unsigned int ECAPRead(void);3 N) F8 w9 Q9 o" a; b% L7 h
/ E3 O% Q: a9 Z3 n, Q! [
//ARM 中断初始化# d& H: l% G) Z0 V
void InterruptInit(void);) |( W. R; [* h4 Z; T3 S
8 p" P3 g0 \. c( C6 o' Y% Y
// PWM 中断初始化
& s' z% Q) l# g* d% t$ mvoid PWMInterruptInit(void);
+ h; e8 s& V) \. h- V7 ~. p3 }// 中断服务函数( I& u0 R  c5 M
// PWM 事件
% w# N, @% j4 t/ z; U* s4 Tvoid PWMEventIsr(void);
- }. N3 O! U4 b% [// PWM 错误控制事件
! Z. I$ Y% y; P, h; v- z/ a& cvoid PWMTZIsr(void);* z* F) b  B& Z
9 E/ g$ S! d3 w2 @- ]
/****************************************************************************/3 \* k$ j4 {% w% F( H) ^
/*                                                                          */
7 L9 [" }" {- m/*              主函数                                                      */
2 I' I; q* ~, Y  ~: L4 v/*                                                                          */
, L2 W% I* W( Z: B! w. ?/****************************************************************************/: f9 |; x7 X, x2 D  i
int main(void)
; t: Q; A% Y$ I, ]0 z7 E{; u7 I6 c' s7 A" I
        // 外设使能配置& {; B. d6 u6 Q2 ?# o) R
        PSCInit();
' g2 C* v  l% i- \+ n+ x1 D: ~% \! L  V
        // 初始化串口终端 使用串口2
0 n% U8 ]! K: B        UARTStdioInit();, B" h8 t& j: f6 L  M! E
        6 \1 v- P6 {% t$ |# C# ^/ a9 r0 V
        // GPIO 管脚复用配置# s4 g9 S; y+ b
        GPIOBankPinMuxSet();% l$ }4 n& G6 |4 d* I0 X% `

2 q) I$ T$ \% l( p! w. o3 B        // ARM 中断初始化
! c( d7 X- O2 S9 w        InterruptInit();
$ ~: E, O' c9 C; g7 Y
- D& ~& a/ P  X0 {8 U1 y        // PWM 中断初始化
+ [* b% y  B. t) Z2 Q% P& T        PWMInterruptInit();
8 z! r+ `8 M- ~+ P! Q5 `
& I: z1 X' m3 v& k. p$ h        unsigned char i;% ?! I, P* `9 J8 i
        unsigned int j;3 }. z2 T: \4 ^

/ {+ @* w: `5 Q- Y: Z        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
' J# j% Y  `2 q1 Y        UARTPuts("------------------------------------------------------------\r\n", -1);* J9 p1 s( c) @3 L; P: ^% g  X/ f
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);% K& V, Q2 [7 {7 f( d2 ~; G$ K
        // 产生波形
$ v  ]- P9 a: g* l+ n  j        PWM1ABasic(25000,50);
. R4 |" ?- C# n" O- A% I) E
- J/ v9 G6 V, s2 x, ?        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);/ Q0 _. b8 y! M3 r2 }
        UARTPuts("------------------------------------------------------------\r\n", -1);
; O( ^' G, s5 Q4 c7 J
/ M: Y4 I' }3 ]0 B, p* `1 N' N5 _8 W- `- _& C+ N  a  ~0 \
) W# r7 l& q3 F% L' y; G
        UARTPuts("------------------------------------------------------------\r\n", -1);
! x0 \) P# N7 K: L* v: g. g' t        UARTPuts("                    C6748 ECAP Test\r\n", -1);1 e* A2 Z8 N1 a7 H
        // ECAP 捕获初始化
4 c# q: R5 Z1 F        ECAPInit();4 f" ]( X4 e* s
        UARTPuts("Initialize ECAP.......\r\n",-1);0 ?, R- K/ k1 l) L
        for(i=0;i<5;i++)
0 W+ [7 K1 C! ^5 r        {
8 A  D) Q- ^3 D5 ?                    for(j=0x00FFFFFF;j>0;j--);            // 延时* N" A0 ^) v/ Y$ U! P$ p  m: O
                    ECAPRead();% B6 F' V5 Z: `1 G
        }
7 y4 ~0 {( f  x, T  x        UARTPuts("\r\n",-1);8 a+ g$ ]1 j8 V0 ?) f5 z2 F
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
  i2 ^+ G3 j* w        UARTPuts("------------------------------------------------------------\r\n", -1);. p2 a% Z8 n; [4 n7 s! N
" ~8 \, T. @1 \! o: a
        // 主循环
* C  K8 y; V, Y& |        for(;;)& K7 T8 r; R6 Q( H' j3 k" l, Z
        {) J5 X- R3 G: z; T/ B0 ~6 ~
5 @. W, {9 K% i# Q& m$ g# G
        }1 }3 }6 e* K" e8 W6 }
}
4 ?4 \& K" r3 N& @/ E9 d% x7 ]* [7 R
/****************************************************************************/4 r# y  o' K$ q3 r# E
/*                                                                          */
9 h  w' t* L& b) g6 c0 Q/*              PSC 初始化                                                  */* }7 A" o8 I% H# C1 l' {
/*                                                                          */
/ l2 [& e, i$ {+ p2 |# \& M/****************************************************************************/# x* l! W& O% Z+ X
void PSCInit(void)
; P; l3 i( f- D) J9 |7 b% G{2 q5 a( E2 I5 l! j
        // 使能  EHRPWM 和 ECAP 模块( w5 E7 B7 _% D$ r
        // 对相应外设模块的使能也可以在 BootLoader 中完成
1 n. D. v- g' t1 |9 I    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
2 |5 C2 P% h. v5 }- }. f7 G# g    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);& ~4 Q0 C. B$ n8 A
}5 k: I- @+ J' u1 H" B6 U: X- i7 b7 x5 X
* F& o/ P" q( w/ S) y; W
/****************************************************************************/
9 ~! H6 n  d5 e% F/*                                                                          */
, Y( h$ j8 T' M0 N9 K9 }, H/*              GPIO 管脚复用配置                                           */
9 z7 X4 e3 c$ f3 _" H3 G/*                                                                          */
7 B% T/ `5 ~5 y: g: Y( l/ s/****************************************************************************/
; G* O$ o5 c8 r, `, C; ?- s* p$ uvoid GPIOBankPinMuxSet(void)( G; @  |3 L; A: o3 }' l
{% Z" i+ b0 X! X9 P7 C+ s9 Z
        EHRPWM1PinMuxSetup();
: |2 a; s/ r: P& P+ L8 b8 M
& U& Q; I' o! x9 X  \+ j% c        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
- W1 a, h8 k6 K( Z8 D        // 作为捕获功能时管脚方向为输入9 o2 |0 B* v6 m, o+ n* U2 ?
        // 作为辅助脉宽调制时管脚方向为输出
' D* G0 j  N' e    // ECAP2 / APWM2
+ o( \/ c4 N& h5 W4 l3 @! d, r        ECAPPinMuxSetup(2);5 a  c# W$ ?, d
! X% j% P# p/ H; p
        // ECAP2 / APWM2方向设置为输入
- O% O: `' [  V        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]4 W( v# S/ Q% t. @% w1 g5 {# ^. ~1 Q
}! l& o5 Y8 Q7 ^; _2 \
3 B0 p4 R* h& p: l( N% c8 n
/****************************************************************************/
) j9 z" |" @' F4 |. p4 H/*                                                                          */) h7 _  `$ r. v: g4 w- y/ @" L1 |
/*              PWM 输出波形                                                */
7 O" Y. s$ z0 |$ |6 Y/*                                                                          */
0 G3 M0 h2 `4 z- \$ F  w$ H/****************************************************************************/
8 F- h1 K5 w/ }) ivoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)/ q# I% \0 P  ^+ |5 `2 j8 G
{5 |4 Z8 Z: @6 e7 I; `
    // 时间基准配置
3 p+ _/ r, [8 N$ H, @) d% ~, p    // 时钟配置
" g" W" |6 R; ~* K    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);% ]! p+ m( s, I
) A  x+ c6 }% U! `9 g# h
    // 配置周期
' \# X: e& Y) e0 B5 q" y2 Y+ _, u4 K    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
0 x0 S, P% i8 F! [2 i/ W% _0 Y                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
3 m- e6 u, ~. V: }! k, g% M/ S3 a+ F+ g
    // 禁用输入同步信号) ?7 j0 w! f+ p7 o% b
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
+ p5 ]& m- C( b$ b0 R% ?- Q
! f4 i" J- D  e    // 禁用输出同步信号! I3 G4 I$ b0 }$ [* c. c0 w
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
  c; w# }- d' ]7 u/ _- y( m5 C" p2 d' v6 y, A" O7 `  X( l
    // 仿真(DEBUG)模式行为配置
3 w+ A9 q! n5 I" a! T    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);  Z  e9 O1 B8 e# d" y4 Y( x$ t
/ I" P7 M, g1 T" {  H
    // 配置计数比较器子模块+ ]* \4 F( \3 ]5 E" R; D6 b4 f
    // 加载比较器 A 值& T$ [4 d$ }5 F2 |5 X; @. F
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
) f2 I3 Z) ?2 C+ A( N' X; J                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);" T  D( @6 C: B3 H3 t
- u: w! r( R  K' O5 h2 J" Y5 q
    // 加载比较器 B 值
' B. a' h3 G+ G: b6 I  V2 L, V    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,$ n6 t5 L3 `0 c0 L# {
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
( A0 l) R4 U# M1 s8 l; v- d. V9 C0 W/ ?7 P- u' P1 W
    // 功能限定配置(输出引脚触发方式设定)8 M. X. l+ b  n1 `7 J+ X
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出/ h% B3 ^' j. z5 `
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,: I  s0 {6 |% [1 c2 o
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,# C: n; A3 K% f
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
8 V# A$ W5 l* {8 {$ s* ~
' }: G) b5 T$ k$ V, h  L    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
3 M% T! |0 D9 [+ A7 x8 J8 S    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
( p% N& `1 Z( f2 A. O
% k" @/ v" ?  F( i3 W9 a( F7 z3 X    // 禁用斩波子模块' l5 Z: G; c5 {) B% V- O; W
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
& U% W- h0 p/ X* p- e6 w+ y  q* `' |8 ?
    // 禁用错误控制事件
; ]# C2 \5 A# a7 b  G# O    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);9 M; f$ q2 B% ?& e7 _" ]2 P
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
7 g- V/ @3 }! z6 {" C8 {- y0 s( c' H
. }) Y; d0 P  k, U( V2 t* y    // 事件触发配置
9 o% o" {; q9 j- E    // 每三次事件发生产生中断! j% H* |3 D' K1 \/ _# R/ F
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
2 c  q8 K8 ]$ A' v3 E& x. D    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
( o( Q2 ~/ }3 E2 l! o    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
5 l" [. I- v4 d% B    // 使能中断% C! _/ _( i& t! |6 [+ R
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);, z! `$ H8 U- |& X: X; C9 _, k
: e& z4 w8 i. p0 h/ I
    // 禁用高精度子模块
7 A3 ^2 A* r6 ^    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
( X* C; u1 S2 b$ n' U- o. ^1 J1 O$ D5 v7 {; s
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);' F& t" m: [/ o% C& |3 A
}
$ Q0 S% q3 h; y  t& H& ^; S0 F/ Q) T' _; [* a% u) m
void ChopperWaveform(void)# f: |$ L5 M7 L8 x# ?% M- g5 j
{
+ a0 N% K5 \6 i    // 50% 占空比1 ~9 d6 ]7 F/ W7 }& @
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
# `* z% d+ r7 u2 l9 B    // 4 分频* t/ M; o) a* i; ]4 `
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);& M8 R& c7 e6 ^- P: t
    // 单个脉冲宽度
6 v, n5 M! w8 _+ j4 N7 ]) v/ B    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
  t8 o+ \) Q2 G2 }    // 使能斩波子模块
- n6 j0 n6 l( c4 _) \    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);) }# V4 z9 U% |( o3 P
}; m' b% U1 a1 L% v. r  z& e0 H, n
3 S7 x: t2 X" j0 w  }, O
/****************************************************************************/
! W! u1 x  Z: L( i# c  T/*                                                                          */
$ H+ J. `( G* t% w( V6 h. @/*              PWM 中断初始化                                              */
- z1 @$ S' y/ M) Q; d) |/*                                                                          */9 V4 U) Z9 N+ m3 N# u) a. `2 g
/****************************************************************************/7 y* }# ]3 {# `, S) i
void PWMInterruptInit(void)
  z5 l! W* o- m" u) K. I{
% K5 @8 X9 Y9 C5 \- ?6 |        // 注册中断服务函数- t4 O4 v3 u! K" r8 r/ E
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
+ b# ?/ K& J+ q) ^7 f' b        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
# \/ B: k" |/ S4 w
( c: B$ D. _8 o; D. K. J        // 映射中断9 ]0 `9 a- v3 p; P! Y0 r) m
        IntChannelSet(SYS_INT_EHRPWM1, 2);$ J1 n4 T/ a  X. Y; C
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
8 A$ T9 E8 g( ?" k) ?+ i: {0 c7 `2 N: l" _3 O' a
        // 使能中断. a+ S8 H; s$ p! l! o" \& L
        IntSystemEnable(SYS_INT_EHRPWM1);
: V$ R( ]+ F. u1 e* ~) P. C        IntSystemEnable(SYS_INT_EHRPWM1TZ);
* m# f, Z9 b9 M5 t8 A6 Q}8 ^! E( S" B: G- f9 V
# K. `/ \" H! ^+ r
/****************************************************************************/5 d$ y9 g; z7 r9 F; T1 t
/*                                                                          */, o- X" m5 x* k8 y
/*              ARM 中断初始化                                              */
2 {/ p# |; K2 B; [. f/*                                                                          */
; k" K7 ~) s/ I/ T) J/****************************************************************************/0 x6 d) u/ C# C4 W
void InterruptInit(void)/ U2 Y' B3 H' e  K
{
2 ]; r, ?- g# b, n  x" J  O3 K0 m        // 初始化 ARM 中断控制器
% Q4 h/ J/ S" @2 I+ I        IntAINTCInit();
) e; h8 h' k" w3 \
' S2 Y# }# Z; t2 ~; H        // 使能 IRQ(CPSR)) J! }' B" [7 V  `* Y) M1 H
        IntMasterIRQEnable();3 U  D5 r1 Y0 [9 f' H/ @

8 J4 i6 ^2 U" [6 R        // 使能中断(AINTC GER)
: u. E/ g. Q9 N! b% B        IntGlobalEnable();) a  q, ~5 p/ c$ d- O& B
' h0 c% M7 @5 n* V6 l6 }
        // 使能中断(AINTC HIER)" Y; t' w3 I' S6 K8 ^. ]
        IntIRQEnable();* m5 f+ B) ~: y" S2 ^+ e: ~5 O
}
$ _' m8 [& y1 z4 V  p& _+ f' n0 n# d/ O

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/
& I! M& ~  G9 ]1 Y8 n, s/ d8 i8 W/*                                                                          */
' X5 X: s, f+ Z4 U0 C6 ~0 [/*              中断服务函数                                                */0 T$ C; o; O3 f9 t4 }  i
/*                                                                          */
+ o, q0 }" ^$ p, F$ s7 N. w/****************************************************************************/
1 I" p+ F; P- ^0 `! S! Zvoid PWMEventIsr(void)
# p% |5 }0 O" f0 D- t{
0 J+ M( B7 S7 A; |        IntSystemStatusClear(SYS_INT_EHRPWM1);1 G& n+ g! O. a6 W# e% z
; O5 A( ^( s- K4 l% n
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
4 E" J0 \+ ?# F0 u* S& }- D}
5 z% M7 z1 z1 T+ p0 C: J8 i! Q9 Q& k7 ]* D) e
void PWMTZIsr(void)
* w; a5 W& _! Q, k{  \: N% o' g' v) e$ I! V
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
+ g! F+ m& A( l/ Z% h: M: \, S6 z8 F- b
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);; Q6 Z  V$ q2 [7 D0 S
}
0 z* U  U' D) ^
* M& ]& Q+ Q4 y6 T: T) P9 z& D/****************************************************************************/
& p: g3 [! _2 B- K+ i/*                                                                          */- S. q& v. ^: o: {" b# f; z
/*              初始化捕获模块                                              */) }1 s- ~* ?: t, J( z
/*                                                                          */" V" R4 z/ v& [! l. Y1 _+ H
/****************************************************************************/
0 |% q, z% G  x' r1 m6 ~) N7 ivoid ECAPInit(void)
+ z" U5 C1 `3 t- R/ }0 _5 ^{
- f2 E6 h; D$ E2 Q4 t7 P9 B        /*-----设置 ECCTL1-----*/
4 j. m+ N' Y& o+ _& T# M, P. U# L        // 使能CAP寄存器装载. p. }; h+ {% [, d, k! A4 U. [& q
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
8 O& N0 {! t, u9 f( ~* [! ~        // 设置预分频值./ {4 P5 N$ J& |& }' E3 A8 L
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);" M+ U6 l: n" r
        // 上升沿触发捕获事件
2 Z2 p, m% q8 |. f8 ?        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);& @3 R$ M; N; t, N1 X! M
        // 输入捕获后重新装载计数器值.
& u$ p# V/ b; z& k        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
- H, T& M2 R3 k1 t$ x; W7 u+ y1 u# r$ q( A5 l
        /*-----设置 ECCTL2-----*/
$ L! t" C' n* K7 @        // 连续模式
2 [! J4 E: Z; l; E        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
0 i  q7 s% E, A* f        // ECAP计数器TSCTR持续计数
# Z" |% d1 k' C        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);) T; |0 C5 i- e0 U2 r
        // 禁用同步输出和同步输入
) h/ n5 F5 i/ I# T        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
6 H! a" q& C  _/ U+ d9 O        // 配置 ECAP 2 为 CAPTURE 模式
8 {3 s# ~! _! o! w: J; ^        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
% e  l- Q- Z$ N( d" C2 f
. T( \1 Q$ x& I: A/ q        // 使能中断
* R% q4 v9 J# W# W9 K+ I' {//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);" b4 W) d3 A. Y/ @
}5 T  U9 _: @8 ?+ n

% g8 v# Z  r. |/****************************************************************************/
3 @- c0 q- Z8 I: n! @/ g$ ?$ w- ~4 R/*                                                                          */: p$ n$ E) l* i% _/ K
/*              取得捕获结果                                                */" c7 y2 J7 W/ ~- j1 ~* I* G, y
/*                                                                          */5 |( Z4 z9 \6 s9 v/ O
/****************************************************************************/) J9 V) s0 ^+ V4 r
unsigned int ECAPRead(void)# x0 W9 I+ X8 B& @1 e
{0 n2 J( g# L8 O& B, X
        unsigned int capvalue;
9 @8 V0 X- M& V5 C        unsigned long frequency;
6 l2 G; S2 }) H
% |' |3 M/ \% r* Z        // Event1 中断标志
7 t" i0 O. B. J: a        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT)), W5 Z  O+ w- y
        {
- Z# n. F  A4 R: S  Y                // 取得捕获计数0 r" J5 t- r2 v" v
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
, y# B  r/ y7 N9 `                capvalue = ECAPResult.cap1;
  K1 f0 ?" G( t& C$ `7 `
' v+ K% ]8 O# P' C, h- n* H                // CAPTRUE 模块 228M 时钟主频7 S  \- Q% d& s
                frequency  =  228000000/capvalue;
5 ^6 k9 r3 R# u                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
% D: `/ Z$ A# F$ C
* K! d3 W8 B* X' c9 V9 Z                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
# x/ j: Y# W# Q" j! r" r7 N. Y; {$ r//                IntEventClear(SYS_INT_ECAP2);
: A$ d; u% |6 z2 C& C7 e( k) L        }
0 w9 @0 d; r' B$ a8 o/ X# Y; x        return frequency;
1 P& _( v2 R2 T6 E$ h0 |}
) c+ p' @" S5 s! ?7 Q$ |- W1 ?
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。8 x% b0 J% r/ z& R6 {
[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