嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
+ \$ t6 _, c& A% T
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
) ?7 F- e6 |; j/*                                                                          */
+ ^3 i0 X1 y7 h! M5 Z/*              宏定义                                                      */& A8 s+ e3 z  Z5 H% j
/*                                                                          */
- U% m* p3 I: e: y. U4 W* B/****************************************************************************/
, L7 I  m1 E; e7 f// 软件断点: ]1 r. k: d6 E4 A2 B9 o; [
#define SW_BREAKPOINT     asm(" SWBP 0 ");, q/ T, p9 r, `  D& x

. x+ |. e! g. M' ]* r+ q5 c' ]// 时钟分频
' v5 g) R. ~( |  O8 s) h& ]#define CLOCK_DIV_VAL     228
7 O8 _) B5 Y1 K
' S) ^" r- R  D9 `& @2 P1 g, t/****************************************************************************/
1 X2 S/ N" X/ T1 R/*                                                                          */
. w/ U" [% v0 c# c/*              全局变量                                                    */8 L, p, _  w- ]
/*                                                                          */
* U- g1 @: i. {: j, z4 n  a7 g/****************************************************************************/4 _5 Q8 L6 d+ i% T2 g2 b4 x
ECAPCONTEXT ECAPResult;
4 e- w' g2 X$ V  z" I$ {
; M$ k6 n$ @! Z( W$ a/****************************************************************************/# c: @4 E& e8 s. L, C
/*                                                                          */
9 t. e. G- t( \+ ]$ n" r/*              函数声明                                                    */' U( ^0 y2 t8 w2 V/ i" q! u7 \: s7 D
/*                                                                          */
. M% s% w6 E" o& N/****************************************************************************/2 f# P" t7 x! H
// 外设使能配置
+ ^+ O) ]7 Q4 F5 nvoid PSCInit(void);
" N9 u- Q$ Y& \; ]5 H" `3 u2 x9 A/ m, q4 F/ x4 \
// GPIO 管脚复用配置/ n6 F6 W8 h0 x  X) w: K* M+ s: S
void GPIOBankPinMuxSet();
! |4 T, _. e6 s/ L  C, P, f4 H; N6 L7 A! _1 s3 c9 N) p. }  ?- `
// 产生波形2 m3 S, l/ a7 F' D5 h9 A
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);, Q" h$ ?. q; d! C; E; ^
void ChopperWaveform(void);3 v3 C3 U4 z" n
3 {2 `% L: ?# U. `
// ECAP初始化和读函数( U9 v# I4 Q' z# H$ v* ]
void ECAPInit(void);' S" b2 W2 l2 E% b
unsigned int ECAPRead(void);. m( w& \8 {# I& m: ^

% q, g  k6 S4 Y4 [; Y" F//ARM 中断初始化
/ c: v2 h' ]! Y4 Y# L0 dvoid InterruptInit(void);8 @. O9 f, X/ ^, v" H5 b

3 {0 |" S# _/ Q1 y/ @, Z// PWM 中断初始化
" ?0 k8 a9 U6 nvoid PWMInterruptInit(void);
+ m/ M! b0 f; ~5 W# U// 中断服务函数
3 H" N! p& s3 w// PWM 事件5 {. b! I7 |: F% i( ]2 B( r( w
void PWMEventIsr(void);
# ~! |6 s1 z& C: u// PWM 错误控制事件+ d7 @: L$ M% q+ \% D
void PWMTZIsr(void);( ?  q- N$ g5 N3 a

& w; w, ^- ^. l: I/****************************************************************************/
5 X- b+ D$ h2 r/*                                                                          */
( e- t/ b! A, y! g- e% C- |3 T& \1 S/*              主函数                                                      */* N2 G5 K4 S6 Z( T6 m
/*                                                                          */
. ^6 R$ A$ s* e5 F. P) N& q- s/****************************************************************************/
, U+ A0 ?/ H; D$ I9 zint main(void)
: G8 y7 R3 r5 Z{
/ x4 T  k6 y1 P4 A        // 外设使能配置
+ A: y. J; n! c$ K' m' W0 P+ r        PSCInit();
0 z/ ~- a4 K  g* b" j; a7 Q: g$ Y5 F; f+ }7 f- ]5 R
        // 初始化串口终端 使用串口2
0 h" _$ f- L" p) {4 h  p        UARTStdioInit();: Y  t7 e6 P, Z" t& S8 }
        - S5 H0 F) N$ K/ d4 @7 K3 T
        // GPIO 管脚复用配置, C( h  q1 [- }1 s& w9 {( Z5 H
        GPIOBankPinMuxSet();
; z# |" J* _; x) F  W: k- k, R; ?: k" z5 T
        // ARM 中断初始化) P2 a2 U/ k) ]8 D' @2 ?
        InterruptInit();
/ r. q' C! h' o+ C9 C, w( q! i7 e  M& j- D! u
        // PWM 中断初始化% N! j8 h1 ]. D: L
        PWMInterruptInit();  U+ h- m/ a2 L# j, b7 u

6 j: V, i' G, P; `! k, c        unsigned char i;0 L) f1 Y. o; k9 X+ K5 b/ {
        unsigned int j;* k# M- A* Y4 I6 J

2 v9 S. W! F0 W( g" p- W. n        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);4 w. {# C9 @% k2 ?5 ?5 b+ y
        UARTPuts("------------------------------------------------------------\r\n", -1);
- c# t2 j. L2 j' ^! S- H/ U        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
( p: w+ i# u: W; Y9 \        // 产生波形9 d  F7 l6 o& s. l2 |, b8 H, I: @  E
        PWM1ABasic(25000,50);
' p# z. l8 p. M8 o0 L8 l- {+ T1 `0 y- A8 u$ n
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);* C$ N; n3 ^) X4 ~, P% b7 A
        UARTPuts("------------------------------------------------------------\r\n", -1);
% n7 N, w7 N9 n# k4 s3 w- Z
/ I$ g: D0 c+ r3 T+ W! C8 U: o! j# R" \% O7 P9 T

3 Y: c; ~/ [( i: ~4 _        UARTPuts("------------------------------------------------------------\r\n", -1);4 }' H5 @" c! R. R" m
        UARTPuts("                    C6748 ECAP Test\r\n", -1);, }+ b! w6 B9 \! |; H
        // ECAP 捕获初始化0 N$ v7 C" B3 _2 n
        ECAPInit();
' J6 R$ a9 @% x' W" \1 v! v- W        UARTPuts("Initialize ECAP.......\r\n",-1);
0 L3 t. w( I. H" \        for(i=0;i<5;i++)1 I6 U* q/ P( q+ J+ o' M
        {
- R; `% h; H. s! n                    for(j=0x00FFFFFF;j>0;j--);            // 延时$ P3 S* l* @; F# t: @
                    ECAPRead();
* h0 D1 L) l6 ]        }
4 H7 o8 v, H$ H- x' y8 l6 n        UARTPuts("\r\n",-1);7 f7 c/ k! f& X4 p
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
; O# h8 x' z6 X6 k  A        UARTPuts("------------------------------------------------------------\r\n", -1);
8 ^, ~7 T. J1 ^( C- m
1 a2 q/ ]/ c7 u8 i0 \        // 主循环! H' t) n0 [) ]( C- x! b' u
        for(;;)  ?7 D" e4 K/ t) ?9 Z4 u
        {( G7 c* m/ Q( l- n+ Y
1 c$ _) I) W- Q. G
        }. U9 @; u! E8 v2 e2 P1 b
}
; e8 A2 Y3 g, a! y6 P! r
7 g5 K5 z1 v7 U; y/****************************************************************************/
2 {* n9 _5 C1 [" ?/*                                                                          */& R. u7 R) a" I% Q3 C$ E
/*              PSC 初始化                                                  */! N- v" X4 [$ m( o7 v
/*                                                                          */
8 n% a: b6 L4 A; R' M1 Q7 s0 T4 C1 D, V/****************************************************************************/$ P/ _; F9 f) [' e) C
void PSCInit(void)) p* \4 l0 A2 p7 _0 w
{# v# }- E: @" E8 b) e6 }
        // 使能  EHRPWM 和 ECAP 模块
, B  M) r! I( U! `2 P4 Y        // 对相应外设模块的使能也可以在 BootLoader 中完成
( }6 n; Z. f+ _4 a2 L    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);/ x+ E7 R! p& D4 H. S7 d1 b
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);( Q5 a+ w* r5 X! _
}
: _# {3 z6 P' r7 [
$ `! \* i. A1 b( b9 e/****************************************************************************/
$ z# Q  Q" u$ x  _3 O. }, W/*                                                                          */2 o/ s7 |* l/ L% ?" T  Q0 T3 b
/*              GPIO 管脚复用配置                                           */
) u9 e  F/ @8 m. z2 z* Q1 h/*                                                                          */3 [: V; w# ?/ D' o# I
/****************************************************************************/# T6 x. ~  q6 Y( ^; v$ j. T2 H! l
void GPIOBankPinMuxSet(void)
  m- z, v1 r% A2 f{9 Z* F) I( h6 d
        EHRPWM1PinMuxSetup();
! f+ h' \# t  `. i) \9 j* z1 ~( Z- T
) r( z6 X% p7 ^% B/ i( R5 j) w        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)' X3 ]& ~" e  H+ P# K
        // 作为捕获功能时管脚方向为输入. g. P2 t2 {- q& Y1 k' @6 B
        // 作为辅助脉宽调制时管脚方向为输出) J  j! O8 J: x+ B: j3 ~8 L$ t
    // ECAP2 / APWM2
* f- [- v& H2 M9 d) {        ECAPPinMuxSetup(2);
5 `4 \2 h* }) T& I( E3 w/ |2 Z9 G# j5 n0 g8 Q
        // ECAP2 / APWM2方向设置为输入
' D- p9 Y% H9 M- i" m" ^% }        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]4 c. P3 }: I' f0 N3 S9 m
}9 d6 P1 i, _4 z6 l9 i# l4 B
5 p2 K5 `- M+ d: Y% F
/****************************************************************************/
/ E/ X/ k5 B* ~5 L6 D$ {% ]/*                                                                          */6 B8 t6 V; f& Q8 S1 `+ f
/*              PWM 输出波形                                                */  ]' W' E( I+ e- Z
/*                                                                          */
' ~, t% N& I- u, u3 N7 b8 }+ V/****************************************************************************/
, W: C$ W+ S9 \& o- ~void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)8 C* K- C+ P0 V9 e2 R3 Y8 a6 Y* G
{8 c4 i- z( C0 a& H5 V, }
    // 时间基准配置
$ X/ k7 |) Z4 {. u* L, V    // 时钟配置
$ Y& I$ W* _/ h& Q6 d6 N# a9 p    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
0 ]4 V4 C/ O! K) ]+ b6 S6 W6 b6 M6 _: x) @0 r& b4 M
    // 配置周期
  r) e  o; H7 j6 J- H1 J    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
) I5 m1 Q3 E; U  o" F4 G                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
7 [/ E; z5 v7 i
7 ?6 r( J- M1 S' `3 ~0 _    // 禁用输入同步信号' ?9 p+ g) j( }( Y2 A
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
  g' V# O3 Q' ]8 U& l2 ]6 X% W$ P: L4 b8 j! a& ?9 T3 f
    // 禁用输出同步信号
3 s. M$ d! ]5 V  U+ ?" V    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);) W4 h; v6 Y8 [$ f8 I* U/ O

. S( x, c# J2 F" ~0 U' c# C    // 仿真(DEBUG)模式行为配置2 Z, P1 q/ u- X
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
. L+ D8 r8 y; J/ Z. M7 W7 J4 s6 o, [2 m
    // 配置计数比较器子模块2 g( S9 E6 u! g" D% N
    // 加载比较器 A 值0 g+ q7 c% o; r% f# f
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
- W. g5 ?& u2 O/ ]7 g+ a- A* p                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);, Q( j6 _- P' f3 e' i( _2 ~2 J
- E5 Q: d* I  j# X  M* m) l: B: ?
    // 加载比较器 B 值
1 a% `, a6 Y1 p) n/ Q    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,! J6 y& v2 ?6 b4 U* `7 a) Q
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
4 k: C: \6 D3 O1 z' m1 g
' P6 y* }# i/ I( t' _0 Y    // 功能限定配置(输出引脚触发方式设定)& S% x: O8 u# _" D' c2 x- e; h
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出2 o: q( \+ d) E' Q1 B; [4 F+ @
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,' D  I- p  V5 T, a
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
3 J1 g& }( C# Y9 i4 [2 M- j                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
8 g3 m& v- {+ c3 S' w5 |6 h* D
5 N5 [/ ]3 T5 Y- v8 |- [    // 禁用(旁路,信号直接输出到斩波子模块)死区模块5 h! c8 u) Y# F
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
) |* k9 ?' w9 N9 Q! _2 C; e) w% W: r) ]* h& y
    // 禁用斩波子模块! T4 d; W  ^; d! }" n  X- A) ]
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
3 d( ?  L/ @; I7 t  q, J7 s+ v
9 f: V* u% y/ i7 A    // 禁用错误控制事件
- F/ u# \; o( I! n+ J6 h: b0 G    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);8 g# X0 Y. A) u5 _& ]; ^
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);: M" m! p% @1 }( D5 V. w. R
' {; E. s3 v7 Q! }& u/ K
    // 事件触发配置
; s" C% j  i# D* ]( N: Z0 u    // 每三次事件发生产生中断0 P9 `7 z0 H( @4 @5 _- ]
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);, E' _6 M/ h6 ^% V7 q
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件* J  V' O1 I. _& ~# [. k! I3 [& s
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);" C. g2 k+ i' |6 o( H% u7 k7 `
    // 使能中断
7 f5 X! d; V2 x2 R8 Q' w1 p1 z' o    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);( o' L: a6 l) D0 f) u# n
( s! n3 m# P- `! X1 L) ^7 _8 Y
    // 禁用高精度子模块
$ {5 D! S# [( {8 \/ ^% {- L! k    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);) |0 S. N" J& Z2 m, u9 M
1 `# v2 s0 q+ m9 D# q- L0 a% m
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
$ k8 c+ M* |  B' B}5 P" w3 C1 ?- p5 k5 M  Z

) u! [9 b: \! I. t- Evoid ChopperWaveform(void)" u( R1 e* m% F; J* W; g
{% M% Z5 B6 m, i
    // 50% 占空比# _+ n1 r7 I# C3 O
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);% x% P0 {& z+ h& \- @+ E
    // 4 分频
+ p* O9 Y: @4 r8 D4 E5 h: |    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);! r, }/ [+ p. A$ ]$ b* N+ }- w
    // 单个脉冲宽度, i  s6 b7 K3 K& L& W
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
, f/ B/ f  {9 W" X: J6 Y    // 使能斩波子模块
& z& V% _; B. z: `    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
+ ~6 f. f' I# o9 r% i}! X' [7 F0 n1 S9 s

8 x8 r. q) }1 ]7 U( o# m- h5 m4 D/****************************************************************************/
% r3 w7 V2 X. F, p4 j6 D) M/*                                                                          */; R* b! X& R0 U
/*              PWM 中断初始化                                              */4 b! F$ F: D& x' O0 ^8 Z; A. K9 b
/*                                                                          */
, T+ w. m# S3 Y% ~/****************************************************************************/
% p1 O8 f5 X; {6 u- }, P2 {- svoid PWMInterruptInit(void)
7 e& Y% i! j% R9 u{
. ?* n9 K  U1 S% O' v        // 注册中断服务函数
+ |; R) |8 c, i8 ], J+ ]        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
; J+ f1 y* \0 L: j: V+ D& V% Z        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
1 k' N! N; z$ Z
- b0 R) t& F' b        // 映射中断
4 \+ Z2 [8 \$ I        IntChannelSet(SYS_INT_EHRPWM1, 2);6 X# Y: ^/ Q% ]
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);$ Z3 L5 h1 y4 A* a; l( n2 A0 `

( n9 G+ Z8 j2 G# l  a+ `        // 使能中断
: t% {" b! J/ u' |        IntSystemEnable(SYS_INT_EHRPWM1);/ |: d* R1 v/ d/ {7 r" @& m
        IntSystemEnable(SYS_INT_EHRPWM1TZ);
; V* J3 z. n# v0 ]# D}" n/ _0 l+ g9 n9 _7 |  J7 T
0 n4 H9 [; c- _0 [* |  X1 P
/****************************************************************************/
6 w$ Z! }/ a( E: C/*                                                                          */
2 K, U, e6 A; Q4 u6 x  V3 Z/*              ARM 中断初始化                                              */" p) `+ |  J! S3 v( O+ [0 a
/*                                                                          */
* |4 s* q( q; @4 ^& \! k/****************************************************************************/
8 u2 m, Z* O! S9 Z! U7 gvoid InterruptInit(void)
5 I0 n" F" E7 `{9 z' ~* Q; o/ L
        // 初始化 ARM 中断控制器3 [5 e% }6 {) ^! F
        IntAINTCInit();$ ~' [( R# e# c( k

+ l. U; J4 @# B1 p        // 使能 IRQ(CPSR)* {. [' ~0 u# o, `! n- e1 T7 R. {
        IntMasterIRQEnable();! H, N5 p5 G7 [" E. m! t% B
9 o: S1 b$ y5 Z0 ^. }! a
        // 使能中断(AINTC GER); f; ]: ~) Z( r& g6 L
        IntGlobalEnable();
: Z) Q: i' S0 Y8 n( \9 T
" G& ^8 A8 R" Y4 [! T- `        // 使能中断(AINTC HIER)- Z: p$ n3 C* k
        IntIRQEnable();7 d+ G! ]3 V3 f; I
}3 x2 o( \( ^0 p+ b: |/ h

" d* e+ b# K5 W9 U0 f& G* p: ?7 P
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/% f  y1 d- l! u: Q& [
/*                                                                          */; }! k1 d# o% R5 v+ t
/*              中断服务函数                                                */
; K( s, v$ y3 m% @7 A/*                                                                          */% K# p4 K$ T8 P8 ?8 H4 Z
/****************************************************************************/0 z0 r+ g) ]2 m  P" u3 P
void PWMEventIsr(void)
8 @) q" F) Q* b+ R# d) `# K{
1 u8 ~& }! C8 w- L! G( ~' ^/ |        IntSystemStatusClear(SYS_INT_EHRPWM1);2 a5 N7 ?# ?, p

$ x4 O6 H/ Q" T( b# {4 j. w1 D    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);/ L' u2 f- d3 K6 \- ~  j( |
}
( q9 Q1 b* M! I$ \1 l8 j
) D2 |7 B$ X" P. [void PWMTZIsr(void)1 r5 i* @: Q' }
{
8 j9 i! k- D7 S, d        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);8 k, ]  h) `" X% Y! t( R6 X
0 {+ u0 \* h% Y' L8 z) b
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
$ G2 k' l" g, I  t; N( _' V) G- y}2 \% \: x3 h! |

$ I& {! I5 [+ a! S, p/****************************************************************************/( Z+ f4 q/ S$ M! x: I
/*                                                                          */& Q8 u# G* T: Z9 `, e8 g$ a# i! O
/*              初始化捕获模块                                              */
; x' v) a: ?/ F. U$ s& \' B/*                                                                          */
. f  l1 y# }* N4 R8 j- u1 b" I# m/****************************************************************************/# U* ~! W! |5 y  j% e
void ECAPInit(void)
3 b0 i2 V# H' I% f# @9 v{
( f8 l# }$ S& f5 s2 {        /*-----设置 ECCTL1-----*/: ?! N* N% f, i6 \
        // 使能CAP寄存器装载* I2 h, m, X$ D# z  O
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
' r9 J$ r: j  p( V- s  G% @7 I        // 设置预分频值.0 p( ]6 b' N6 b% M3 E/ l
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);# [& N7 m6 m; V9 l
        // 上升沿触发捕获事件  e  p5 G$ l. ]2 V
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);' ?# ?! J, `/ Z: z4 b$ b" [1 a
        // 输入捕获后重新装载计数器值.
4 a5 [+ v  C4 x; f& z# v) u: B: O        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);. P7 v4 h) _' i- b( f

; M% g, V& u4 `: K        /*-----设置 ECCTL2-----*/
2 f7 `: S/ _  b9 R6 Z! T        // 连续模式
8 ^, s3 j! @* t0 q6 |8 X' [        ECAPContinousModeConfig(SOC_ECAP_2_REGS);# ~$ z4 l  M+ C4 L
        // ECAP计数器TSCTR持续计数
0 d" F+ Q7 d; ], S! m4 V7 A        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
% F! p4 j; U8 ], f% E: E" u        // 禁用同步输出和同步输入! G; R! w1 N7 g- o
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
' Y+ @4 L/ T9 u0 Q        // 配置 ECAP 2 为 CAPTURE 模式
8 U" ?. U; P$ e" w        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);' `3 i9 n; M1 C5 n/ e* _& c

' U2 `6 f- ^* e, c5 N( T        // 使能中断
& U8 i8 Z- a1 n0 W9 o6 A//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
: \0 ?- j$ G; ~( n: q" l8 R; y4 _, a}0 R3 F6 ?9 |$ b0 w

; G0 T' f( n4 d( h# m5 A/****************************************************************************/
- K7 m* A( w' h/*                                                                          */9 t5 v) U2 s& `. t1 z  A& o8 |7 G# [4 {
/*              取得捕获结果                                                */
2 b+ p" x" f. G/*                                                                          */( V: Q& M! [+ ^% n
/****************************************************************************/
: _- v/ \; b+ K  I7 }# T: Qunsigned int ECAPRead(void)
! D* b6 x" ^+ _{) H3 [8 @3 D$ f9 |! g5 `5 B  P: ?
        unsigned int capvalue;6 e2 J" u( t# r% ~4 f
        unsigned long frequency;
% {& P7 O! @: B# _4 v
, k6 I* D% x7 B( l        // Event1 中断标志" X9 w$ {% y/ m  Q$ Q3 E4 {9 t" U
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))/ j' o3 ?8 Q. Z
        {
; h8 j: {6 \  b  W. `5 T7 x                // 取得捕获计数: F. s5 J0 x0 i( D8 K$ [
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
0 Y9 F. O/ l. M- ~/ a3 R  l                capvalue = ECAPResult.cap1;4 o  q* y4 `6 A. ]: F3 p

9 D2 l) u9 g$ v4 l( E8 r                // CAPTRUE 模块 228M 时钟主频" ?1 T1 i- R! a' g+ a) r. R2 g
                frequency  =  228000000/capvalue;
9 b7 g0 b$ q/ l  S8 \0 D/ X                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
. g! P( t" y/ V) D1 G
) @5 J3 r0 j/ n* y                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
/ [/ Q* c" g5 q5 k5 o//                IntEventClear(SYS_INT_ECAP2);
; j& t; i6 d( \# R' c        }, I, m5 U% Y% I: Q- }/ A
        return frequency;
: c) Q2 Z3 `# i- x1 u$ h& x) ~1 m' ^}
% a$ W" ^5 }9 E0 z5 `; X
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
5 M* J% l9 |( y: j/ _) v0 W8 S& y[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