嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
$ |5 D' O) q$ g( \3 V
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
& Y: j( `! y( \2 [" K/*                                                                          */
+ W% _; d  H* h/*              宏定义                                                      */
$ g8 H- T9 Y9 ]" l8 f/*                                                                          */
: ^: j: q/ I$ x9 r& r+ v& N! w+ F/****************************************************************************/5 p( c# \, z( p/ c) u, p
// 软件断点
* ~3 M3 N' h: n, V2 O& l#define SW_BREAKPOINT     asm(" SWBP 0 ");
$ T# g5 Z# X8 L0 v1 K  I3 t1 }/ C' m- q4 s
// 时钟分频- b! H% ]8 Y4 Y, X
#define CLOCK_DIV_VAL     228
" T, T2 G( d# B( |2 l5 Y  e, E: \% x$ K, u' U: B* m
/****************************************************************************/9 Q4 E. e& B3 f$ K  b
/*                                                                          */
& A0 A" u% J! V/*              全局变量                                                    */; L% g/ s) j8 X: l1 J
/*                                                                          */
/ M$ m# [& A( Z- Y/ X2 q/****************************************************************************/) \$ \5 [  F; ^) T- e% Y
ECAPCONTEXT ECAPResult;6 k9 o0 S4 x% e* V; `5 P( h5 C

8 w0 V4 f3 {& s$ @) ~; B& Z) ]# t9 @/****************************************************************************/$ V  O% i$ `0 g" D7 [4 q
/*                                                                          */0 t! k, W: e1 V4 \7 I; A
/*              函数声明                                                    */
5 E4 A0 ~  N' q7 Z) {/*                                                                          */
1 W$ M. S$ Q% h/****************************************************************************/
/ @, V( N' h3 X" T/ T- t: ~" p. ]// 外设使能配置# V% H) Q7 z$ V3 F/ z3 ?/ a
void PSCInit(void);" _) M6 i$ F9 C; S$ J' H/ n

, S4 h: e7 f1 f+ [6 v3 j: U/ t// GPIO 管脚复用配置
8 s6 {. D/ a% U% {  P4 ?# u+ Zvoid GPIOBankPinMuxSet();
! ~* ?. B  O( H- `1 p% r9 ?8 m1 C
// 产生波形
6 O3 I; u( U. a: Gvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
: p& U, q2 [, C7 xvoid ChopperWaveform(void);
" e4 y* ~8 l1 }# a) t
5 ~4 k  n/ L8 g2 Q# D5 o// ECAP初始化和读函数* P. v" g% t$ E3 @) j) K
void ECAPInit(void);
8 C8 Z; H5 J9 Gunsigned int ECAPRead(void);
# ~0 Y2 n2 p$ G+ `% Z0 D: B" I/ C& x
//ARM 中断初始化7 e, r2 B: e6 A, a! g+ P$ y
void InterruptInit(void);* T1 B$ Z! W; F

6 g9 V. ^8 c: p& F// PWM 中断初始化9 p, p  S9 `* K' x
void PWMInterruptInit(void);
7 S& b* I, r. L/ a1 W" I2 T1 ?// 中断服务函数* \6 `6 c$ X, P4 {$ U
// PWM 事件
* D' M& Z4 [, L( m, cvoid PWMEventIsr(void);$ K- ]5 k/ I( F, k1 n
// PWM 错误控制事件& p  q6 N9 i" X* ~
void PWMTZIsr(void);
, s3 q' B( w# M  `; K. i; e
: n- |  _, T4 A) j% D: F1 ?/****************************************************************************/
& o6 x7 n1 t/ d% `- ~; d! ~/*                                                                          */
8 C0 o5 W4 m7 h& k; c/*              主函数                                                      */
( p% u7 q9 ^+ A1 B' _! Z/*                                                                          */6 \# h  Z& j: X3 J# R
/****************************************************************************/
* w& Q& t9 l5 s; r  r! u& z7 Tint main(void)* k3 X8 j8 c9 I/ s# ?
{  h6 _% u6 S5 `: W% Q/ X* ?- q& o
        // 外设使能配置% l% x+ U' u* Z
        PSCInit();
: ]& h+ a6 [! t+ u2 S5 ], \0 z  v( O( \. N4 D3 G" l/ e' |0 a
        // 初始化串口终端 使用串口2( }8 |; m) M, v0 s" }: u
        UARTStdioInit();0 `" A) [8 n# H
        % Z# Z% F" l6 c! z& G" A
        // GPIO 管脚复用配置
1 P+ Y2 H6 s0 Z1 K        GPIOBankPinMuxSet();: X8 q- q: P; `  d

1 t+ e# W3 L' g; u4 e5 }        // ARM 中断初始化
+ R" O( A2 ~6 X9 d6 [- |        InterruptInit();
4 A: b+ x% X" M! W8 O! L7 I; t  X* G# v* Y) }; C
        // PWM 中断初始化
% Z9 B: }9 v/ h        PWMInterruptInit();; _& @6 |+ M6 u5 Y" x
# y2 n/ B! U3 V
        unsigned char i;& p2 u) G* \! s3 _7 ~7 N3 v8 M" d
        unsigned int j;, Z! p, z* S# o% R6 D. H2 Q
% o9 `: n3 b9 K. S
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);$ t. u0 U7 I1 O1 w2 B4 ?4 {
        UARTPuts("------------------------------------------------------------\r\n", -1);6 v: j5 z$ C0 W6 H9 }1 N3 D
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);: m; q1 Z4 m2 Z5 ^
        // 产生波形; b% T6 E) X( L6 {$ e
        PWM1ABasic(25000,50);
( \9 n" F& K7 m. |; P7 E  J# i* u9 D: n$ p- D+ m- A* J9 q3 E
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
! _4 T" t( d2 h7 H! |$ q        UARTPuts("------------------------------------------------------------\r\n", -1);
7 W) ^' Q- X1 \8 ^+ e6 S* h4 S0 _
; C% `3 G1 s) k4 N/ a) o7 L! H: `, i+ s7 h7 J( E" `9 j* l4 \& [
/ ^7 D  u- Q5 d9 b. K0 o
        UARTPuts("------------------------------------------------------------\r\n", -1);
/ x9 s: I4 }" s1 S& \; B        UARTPuts("                    C6748 ECAP Test\r\n", -1);
/ S' a! c4 J3 G1 U6 A1 W4 E        // ECAP 捕获初始化
. ~: |, @% Z( s; x. J% z, Y        ECAPInit();
+ p. V' _7 Y& J        UARTPuts("Initialize ECAP.......\r\n",-1);
; s& ^% v) R) W' X$ S4 o9 s        for(i=0;i<5;i++)
& {1 o* y5 s7 F* y        {9 N# z1 s) K- e8 k# A2 r
                    for(j=0x00FFFFFF;j>0;j--);            // 延时% }4 h" q. _, _% V- ]% Z$ v
                    ECAPRead();. h- o1 d) h( u
        }
) d  Q4 h% Y. d3 P0 U        UARTPuts("\r\n",-1);
; c8 A0 R6 E* ^2 M3 V        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
- j0 h$ C$ ?; M3 v& l( y* @        UARTPuts("------------------------------------------------------------\r\n", -1);
' |% U/ W2 w6 j2 S9 ]
7 \; X3 \- i$ A6 o' n' S1 ?        // 主循环; w0 J* P; w" \' y  Z
        for(;;)
5 q1 O: ]# v/ \& z/ t" D        {* q6 E& {1 `/ x& |
8 l: F0 V. ^% I3 Y: |
        }
% c+ E6 B  g6 q! _5 h}
& d1 q9 V4 L, ^; h$ Z# z0 w1 A3 s. i3 z0 Q% A, A
/****************************************************************************/
1 O: b: V* j2 d  b' ]4 H/*                                                                          */( L; l8 B$ m/ L8 ?7 i: ~
/*              PSC 初始化                                                  */
+ r& }& Z6 C8 T  p/*                                                                          */
! R5 C+ ~4 z2 p% {, {5 z0 V/****************************************************************************/% W5 {. H& ^0 o, L$ u- i. g) o
void PSCInit(void)! S9 o* g  U4 I- f& d3 r
{
& f; e) j0 r+ ^1 A        // 使能  EHRPWM 和 ECAP 模块  v* E$ A8 i; W' e8 ~3 H: h( V
        // 对相应外设模块的使能也可以在 BootLoader 中完成
( Q0 p, N1 y8 L# d9 r    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);/ B' E# }6 H  G
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
3 q9 e% P9 S4 J( a# H* J}
; N  i+ c% y. {% N7 C. S( P: q+ r
/****************************************************************************/) q8 l' A# z* a6 X: g
/*                                                                          *// a$ ?* x4 x2 T: N6 C( \
/*              GPIO 管脚复用配置                                           */, i$ p0 q* U/ ?! z" N2 s$ ?# _
/*                                                                          */& v2 L) g3 V0 U- ?" ^
/****************************************************************************/
- q) t) e& i7 _: {# d" x% ]0 dvoid GPIOBankPinMuxSet(void)
# ?# \7 i: y' K9 p( p{1 a" g9 W) f0 ^
        EHRPWM1PinMuxSetup();
% @( X% V4 V( G* E( A; q" s
' C) l9 O/ x( M5 I8 w+ \+ Q3 J( ^        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
4 c2 ~4 P: f. @/ S- a0 i2 a" U        // 作为捕获功能时管脚方向为输入
( i( ^$ N; S9 d0 i0 j        // 作为辅助脉宽调制时管脚方向为输出
. ^# [/ w- Z. G! J+ m* K0 _( {) q    // ECAP2 / APWM2/ L0 _( F3 F# g7 x: L" |; H( |
        ECAPPinMuxSetup(2);
* v9 G% [! P* S( U# X) H/ r1 k6 P7 @7 s8 Q0 \: E# J
        // ECAP2 / APWM2方向设置为输入
; S' K1 B; l) d/ p) r! f' S" r        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
! F9 q8 W  Y) x' A}5 ]7 [" _5 |1 E. g  R- G

$ _" V$ F- p/ `% ?5 V+ H/****************************************************************************/1 ]: P. h  z2 k
/*                                                                          */- l" S9 q/ G% Y) g0 G
/*              PWM 输出波形                                                */* ^: h4 O  [& e" T% t+ d/ C2 {
/*                                                                          */2 {, S1 H- c' E
/****************************************************************************/
6 {9 Q+ X# ?  q8 K, L; ?8 [void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
& @9 s' e# H1 \/ b% p0 i' J{; k, j# F7 ]; \4 @2 }: G/ L0 S4 r
    // 时间基准配置
6 Q0 \. ~* ?* s# U' Z* [& u    // 时钟配置
6 z: g) \! r4 k: i0 J7 k    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);! i1 w2 n" V1 R7 r/ W

4 t4 C' i* E; S+ ~    // 配置周期: R+ ?: E* q- u% A# A/ r; X) d
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
+ L( K: j; t0 f1 ~+ z                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);4 Z7 J' `' J$ v7 ]3 h6 m
3 R8 d. m( d/ r6 q
    // 禁用输入同步信号
$ @  x5 b  J2 O- [- ?6 t/ m    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
: `& Q2 V/ V) a- ]  ]! J- R5 i+ N% G& ~! h
    // 禁用输出同步信号) i+ D: _) X% t2 L1 T5 G. C0 @
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
8 ?% M4 @0 z( @2 m4 `3 F$ U, N+ u# B6 I" l
    // 仿真(DEBUG)模式行为配置
9 x# E# `/ }" x5 y' ]    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
7 j9 ]' s" |& G0 ?
" P  x2 c) X) N, [, o    // 配置计数比较器子模块
$ l+ x( R7 N8 p  y8 P4 U    // 加载比较器 A 值
1 y$ k% x9 ?1 x6 l    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
7 d9 L2 {8 V9 R                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
! M7 C4 q0 W+ p1 s% H3 J: C: M6 S; I7 s5 H" `# @/ y' j/ w8 O
    // 加载比较器 B 值0 }& {- B& |' j8 x3 g
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,, h" q% K6 G2 n. p* i+ {* ?3 N
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);1 u+ H% T2 D( J( p& T/ M
6 d/ V4 t/ p+ \& y! w; D9 X9 ^
    // 功能限定配置(输出引脚触发方式设定)6 }3 v7 H8 a4 P2 B  X
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出  g; H* ]) F, y. a* P
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
$ f1 K7 P# m' ]2 b                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,$ A: J. u  a# a+ V$ P1 R
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);4 C. h0 f& O& M3 W6 _9 g
9 K6 Q! `; a4 s3 C% q2 z
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块: E" S3 f$ i, O
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
" ^1 E8 B2 x' \$ o8 \2 V( c! J0 {( F  Q3 J% ]: g8 y( {8 |$ ~% `7 y
    // 禁用斩波子模块, G( w7 k$ I% _- X# q
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
9 j: G3 d$ Y1 j! a9 s* n) [, N, |
    // 禁用错误控制事件
8 A$ j5 @% Q* L$ l) U9 Y7 @    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);1 q7 G1 {$ Z. d- d6 g
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);1 W% b; M! l" V0 E1 v  ?6 C, Z
4 }' x# G) g3 j1 i! P
    // 事件触发配置9 _: f" o; b  n5 M1 n4 {
    // 每三次事件发生产生中断2 G1 t0 U8 u! x# u! p* i7 O9 b! b
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
/ v- B. f5 r6 L7 N. s    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件. m: `  A* ]$ I7 B  h) L
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);, t7 ~: ^( l9 @
    // 使能中断& n# m4 h$ t" q$ \/ q1 k% W$ _
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
0 k. d% Q! F. |! \" l9 J" j4 ^( ?0 Y* \6 y! ]' Y- }
    // 禁用高精度子模块
# d- C+ ^8 M& m( Z2 p, ~) k0 z    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);% }0 e& c  I5 d2 U  W
8 E0 [/ d5 z3 X+ c# R& W
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
4 U9 S3 V- h9 G- J# N, u}
2 o6 [( N) R7 v+ p/ \1 ?( R# z
. a" v/ f0 V& ^: [5 V. W6 Ivoid ChopperWaveform(void)
8 f5 A* O$ x/ ?. E) d{
5 N6 x+ K: f" R* M' l& o    // 50% 占空比, w9 i: G8 y* o" m
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);) r" D: N2 ^* m/ C# d* u
    // 4 分频
- D* @) C; Q; V. e    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);* Q4 ?% C; z3 N
    // 单个脉冲宽度2 B2 O+ E8 P, v
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
4 {6 O# I, x& p5 B1 o, E2 G" ~) \& x' j, b    // 使能斩波子模块
2 a# `3 }) m' U! I    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);. y, x, J0 A, c& f3 T) G
}
& f/ U6 L7 L* g. C4 o2 ^
# l4 z5 C  W& P" G5 `% w/****************************************************************************/
5 ?1 c( p: j" ]3 d' F1 s" ^" I7 G/*                                                                          */" Y2 M; H, d4 F
/*              PWM 中断初始化                                              */; t5 v* {' U# X: P0 R. T
/*                                                                          */
! Z) g% Q) o: t9 E* M/****************************************************************************/% z0 a) t& Z; H4 r3 ]9 g
void PWMInterruptInit(void)' ~3 q9 W' P8 s# m2 }
{, t% z7 ^) i, y/ u# p) \, W6 U
        // 注册中断服务函数
# @& e5 c8 U; i8 [, r1 s. p9 S2 e        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
5 j# r( ?  L+ F        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
3 r! }9 g' Y6 e) W, }
' r0 M( S/ t$ K, ]7 h4 v        // 映射中断( J* s$ `' o! X
        IntChannelSet(SYS_INT_EHRPWM1, 2);
8 U# R4 U2 A1 U9 n# y# ^  V        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);$ d" ?( V0 v$ C& D
6 T+ A- x# e; O5 ~, Q
        // 使能中断, W, B+ l" b5 p
        IntSystemEnable(SYS_INT_EHRPWM1);! X. a9 r2 x8 b3 `  Y. J8 p
        IntSystemEnable(SYS_INT_EHRPWM1TZ);, z% @4 }5 J: `) K& {; K: Y/ d
}
3 _4 F- l, D4 O7 k5 v. ~( l& `: g) G. u1 t) o. k
/****************************************************************************/8 e. I, q) k6 n# \- C
/*                                                                          */
' ?! o" [) B& I" H$ h/*              ARM 中断初始化                                              */6 s, y( Z% B8 I9 u3 [8 b. T
/*                                                                          */4 x7 m# x6 }* @' n* X3 o
/****************************************************************************/* B8 f- m0 {$ s
void InterruptInit(void)
& \+ N* J" {; M9 V{
/ X" G  k& Q6 h/ m6 a% C        // 初始化 ARM 中断控制器$ m3 k. |! g/ e7 N7 F7 z0 g
        IntAINTCInit();
9 k  m0 P6 K0 L9 t1 t! P; B% b7 n( d7 P, P
, J+ d! ^2 f& [" e4 V  d        // 使能 IRQ(CPSR)
* O7 G$ h* }  ~: _2 H        IntMasterIRQEnable();) }% O: F% @. a' G$ C

2 g1 Y" q* X* x' Q        // 使能中断(AINTC GER)- o( l3 t9 S- e+ H5 n4 N6 ^
        IntGlobalEnable();
) K# Y1 G5 o" g1 A2 @  h$ c  c/ m) m; A" _: r, G7 l, x5 b* ^
        // 使能中断(AINTC HIER)' W, W0 L8 [7 T  K
        IntIRQEnable();
" F3 L7 q3 ?- ]% I0 v}' |  S8 }- P; R! L3 {. J! c$ d) G

& ~5 @" d7 s  b) Z% ]# d, s3 Z
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/& v$ X7 S+ \5 O( R, Z
/*                                                                          */* A8 ^% R" N6 Z9 l; A1 E5 M3 D7 k1 ~
/*              中断服务函数                                                */0 i/ L1 w( E8 y; u
/*                                                                          */
+ n* o! x" S9 L, w# o+ v/****************************************************************************/
4 D6 I: T+ X1 ]6 h' ^* w7 A0 P. Jvoid PWMEventIsr(void)8 H, ^4 q0 B* ^& L* I/ V% m$ ~5 D5 D
{6 X( r: l0 r4 g, B4 Y, D3 Y
        IntSystemStatusClear(SYS_INT_EHRPWM1);2 v' J4 Z# x, r4 r- B+ b" S  Y4 p
5 I4 T9 }! s9 S8 u0 m4 ~
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);$ \7 `6 o) Q: S: k
}
& R8 M; r  @/ i' A3 Y9 f" y6 y! a& \: o5 ^* P; L1 f' A
void PWMTZIsr(void)- C* U- p- I5 |7 M$ c
{
% ^9 w( x6 x" q6 P0 j        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);+ I* d" D) y" V" x5 p! R
$ Q2 H" [9 r, }* \, J$ x1 M4 b4 V1 z
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
6 D$ |. o* p" e5 ^& ^1 X}
; K# O2 ~2 w, V% x$ S
- C/ W0 |. n- C  \1 E: }/****************************************************************************/' f# s5 @9 R5 ]' w3 r/ n4 c" U8 ~
/*                                                                          */
2 _2 `# B. i) l/*              初始化捕获模块                                              */  z  Y# o) U) L& q( o& i* U; C7 O
/*                                                                          */
0 w0 F# R/ S' J/ M8 G/****************************************************************************/
9 x3 M5 g1 R% ^void ECAPInit(void)
+ {6 N* [7 r3 P7 b4 _$ X2 x/ t{, ?+ X4 D7 x  q; B) Y
        /*-----设置 ECCTL1-----*/
( ?- ?6 O: U& ~        // 使能CAP寄存器装载# L5 c% n2 k* r' K1 c: }7 r& @
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
; y  a6 H( ?$ n/ E        // 设置预分频值.
4 p# g7 @: \8 U9 ?& X        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
9 E5 F% D: }2 h  ^) m. p        // 上升沿触发捕获事件; Z5 L9 Y" d4 J- |8 h
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);4 r% T$ D* T( u) X* @
        // 输入捕获后重新装载计数器值.7 Q* h* g" A  H6 D8 W, @5 P6 r
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
9 B) q/ a# v$ E2 H8 w1 a0 y6 W, Q8 y! U' n- z
        /*-----设置 ECCTL2-----*/
4 R& N9 ~( y' J" r        // 连续模式
; g2 [6 _: D) R        ECAPContinousModeConfig(SOC_ECAP_2_REGS);: Q# s& @" W4 J6 {- Z
        // ECAP计数器TSCTR持续计数
, F8 Y# Z4 Z4 }* G+ i1 I6 c5 Y. F        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);: R5 W5 t7 [1 a  b; q
        // 禁用同步输出和同步输入5 c5 a8 }2 b0 l
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);' H# ^' D  q) y+ Z! v
        // 配置 ECAP 2 为 CAPTURE 模式
0 M7 k! X) K, \; ^3 o+ d% K        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
+ r0 p/ N5 i  d8 a& ^, h+ e0 R! c
        // 使能中断
- b# v  F/ P" E$ F" X//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);/ k; {8 A# x8 ~, T; J9 ?/ w
}
7 m8 j5 v* s2 b; \( Z8 w( D8 ?! `! [9 _* W8 r3 |
/****************************************************************************/( ~5 r1 ?, y; u- c' h
/*                                                                          */
* Q5 y2 [& U  ^# L$ O4 H' p& q  n/*              取得捕获结果                                                */
5 O; A* h6 d0 a% A5 N/*                                                                          */$ t' B1 n) ]& \, t; T: y
/****************************************************************************/; E0 z- X& G+ w6 @: Y5 G  ~
unsigned int ECAPRead(void)/ G( s6 {9 P7 [( V( E
{
9 h! z' }! ]1 x2 n9 \& ]3 B        unsigned int capvalue;( O/ x5 b! M0 I( n4 |# [& s' S+ i
        unsigned long frequency;
6 B% J! U, {- n, N+ V/ Z* n# t
+ \* k  {1 A) i' l! m$ g        // Event1 中断标志5 ^/ Y7 W7 T) N; n  `- ^: ]+ a, u. x
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))6 d; g" i7 U3 b2 k7 {: K7 H# F- I
        {9 Y! b9 {. k* O2 n2 O+ T
                // 取得捕获计数
  {) t; \* B& [7 A  P* t5 x                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
' n+ u. n* n6 l; I                capvalue = ECAPResult.cap1;! j% w1 D* S' U: \5 W

  o1 W/ q% c  m; O, R- U                // CAPTRUE 模块 228M 时钟主频
. y; z) E& Y  t+ `1 M3 N& ~% m                frequency  =  228000000/capvalue;
9 X2 D0 N# S% F; {) x                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);5 e, [9 J/ C; r7 z# g7 L* ]" X/ U  \

' j* ]& D3 |8 r* G6 u8 I                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
3 J, ]3 E+ a. D+ R, o" |- N//                IntEventClear(SYS_INT_ECAP2);3 z7 }. g# A) v8 p
        }: T" q+ O( v! ?: V3 Q& {3 e' v
        return frequency;& K8 C8 K: C2 V6 I* }
}
' R% j3 ~9 r, b/ O. A2 B; h
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
% ]9 c, i0 f' i% M( R[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