嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
1 L: v3 q% g5 l, T  K3 L+ _
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
: p% y, d* w6 j. @  F; B/*                                                                          */
$ x( r# V* M0 B& D4 V/*              宏定义                                                      */
# N% F# o: q- f9 }/ ~) d/*                                                                          */+ O$ w" U/ s; [6 E8 V7 R
/****************************************************************************/7 M; Y% m; C# U
// 软件断点6 m* a4 r- j& t7 O/ O. J8 U4 f
#define SW_BREAKPOINT     asm(" SWBP 0 ");
! P/ Y( ?$ B- a7 D6 G1 Z" t( P) H
// 时钟分频, ?) b7 {' O1 p& m: H" D3 I
#define CLOCK_DIV_VAL     228' \- \0 R0 \7 J2 {5 b6 v/ o
8 c7 w% ~3 a: b# S3 G/ Z
/****************************************************************************/
* u. E5 d' B/ E3 O6 p. f/*                                                                          */" t- {, X5 T/ V
/*              全局变量                                                    */: [: D- Z. r$ d2 k9 }+ M# t7 K
/*                                                                          */1 p2 D6 v( X5 J
/****************************************************************************/: J3 K# Q' X" r
ECAPCONTEXT ECAPResult;
8 k* e$ k! l% R+ J5 U! u7 V9 X/ h, F) e; C8 t. ]1 Z, Z
/****************************************************************************/
4 u; ^. |4 h7 w1 x; h2 R2 H/*                                                                          */" \6 H/ V2 U3 i, H4 l' v
/*              函数声明                                                    */
7 {8 e) }& a; t3 u/*                                                                          */  }4 m* h. I& S) s
/****************************************************************************/
  D; q# @( W: e0 z% _8 Q// 外设使能配置. e2 I. E. {1 z6 ^7 I
void PSCInit(void);4 G, I6 _6 |8 w5 ~+ c( O0 S; @6 {
5 Y' E6 i: p  q- `! B- H7 H- w
// GPIO 管脚复用配置
6 @1 P3 _6 y2 ~8 N! }6 }void GPIOBankPinMuxSet();
' I; g; h5 w9 Z# e5 S; e+ v9 P0 x1 b; Y0 ?
// 产生波形
$ |4 A. m1 b) V  ^0 bvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
  j5 w; B$ g& I, C2 Tvoid ChopperWaveform(void);' Q' @$ a, m7 i" m' `

% L+ D5 q3 F; f9 H% z- i2 ]// ECAP初始化和读函数
# E% [, m9 Q7 t# @1 K8 [void ECAPInit(void);( i# ~! l2 K: u
unsigned int ECAPRead(void);
# W, t/ u$ L, ?% O$ |. e9 r" k' I, p8 _
//ARM 中断初始化& d, P+ M, ^  |% f* H
void InterruptInit(void);! M2 S. b. m  `8 D. ~* h

5 q" F5 E3 D' W) {$ x5 B6 E2 T5 _// PWM 中断初始化
) n0 P7 {$ m) i' A! o, \void PWMInterruptInit(void);. a2 H% M" a! V
// 中断服务函数! ?* ?) h& }! Z( w2 f
// PWM 事件
  O# d5 k3 h, ~; P8 j$ Y" _8 Z2 ]void PWMEventIsr(void);
/ ~+ m7 ^% S. D6 K8 h3 T$ z// PWM 错误控制事件
! A9 O7 N4 r, N$ h1 I. ^7 x: zvoid PWMTZIsr(void);
- W5 {% _2 v6 A9 d  o& V- K0 n4 ]; C$ I1 J2 d7 |. x) d$ t
/****************************************************************************/. l' A: \2 G. O# T& K( V9 c
/*                                                                          */
& {! P3 M' A- {. v0 p: M/*              主函数                                                      */$ s$ P$ ?4 y  R- |9 |* {
/*                                                                          */0 w6 b  n; {6 ?0 A7 E$ p6 F& p
/****************************************************************************/
- v, G2 r- y1 y2 nint main(void)% w* q5 h7 Y' @2 I( j! ?
{
5 i1 N2 B- f( _+ I- S+ G/ r4 N        // 外设使能配置* A5 {% D8 R# `8 J0 x
        PSCInit();
, _5 _8 K5 y" \/ d+ J  M7 [
/ e0 G" M% I0 A) R        // 初始化串口终端 使用串口2( a. y) s; m" q7 b: L: |
        UARTStdioInit();& ~0 x8 U0 ^- L: P  W
        ! w* Z2 o2 m( S& E3 p% G, w' n
        // GPIO 管脚复用配置
  Q- i* h, {# E0 n6 d( F  Q        GPIOBankPinMuxSet();
5 l) d- S; [: k' h' B0 S( w' g3 C
/ M' M) x' y# O3 g+ a6 O        // ARM 中断初始化9 Z7 U# x8 ?5 B( h
        InterruptInit();
. z+ u" P9 x; y0 W: D# n& c! n, J0 p: n
        // PWM 中断初始化
7 i1 h0 H% d6 p& o+ W; j        PWMInterruptInit();
) j, D  U. j. m0 A" [- f2 \" O7 C" A* n, J7 R4 ~1 {
        unsigned char i;
5 K4 \5 z% n- U& h5 U" Z) H% O, f        unsigned int j;
! _+ E5 S+ t8 [% X3 K# @2 V
$ ~" @% Q8 p7 v8 d* H9 a1 m        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
2 g- C# }: x: @7 K! ^7 f        UARTPuts("------------------------------------------------------------\r\n", -1);
  |: a" \3 J) o# [' y$ p! U        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
& O. z: L4 w* \. D' s' V$ I        // 产生波形1 t7 h+ r- P: F# i3 F
        PWM1ABasic(25000,50);
3 f+ o. L' a9 U! k  U
% H! J+ L* C9 _; B7 q9 v        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);0 {% v2 ^/ c, w
        UARTPuts("------------------------------------------------------------\r\n", -1);
" A9 B. @- ^$ C. {( b2 }$ m: c; D) p" y9 n% h5 z

8 x0 K) Y( X) C9 J) z6 v6 m: e' e; m# T7 ?* d! O
        UARTPuts("------------------------------------------------------------\r\n", -1);) y4 Z2 A/ O5 I" y( [8 Y
        UARTPuts("                    C6748 ECAP Test\r\n", -1);
2 X2 t" _" J) Y4 @        // ECAP 捕获初始化
. i/ D0 @* `; Y8 s7 S! k2 y        ECAPInit();
7 X( J; X% ]9 {2 A        UARTPuts("Initialize ECAP.......\r\n",-1);, n. u& b) a6 e$ r6 c$ P1 D0 o5 U6 Q
        for(i=0;i<5;i++)* m" i/ \1 G: `0 x
        {% J, s$ z) r6 ^; Q/ e( ]& m
                    for(j=0x00FFFFFF;j>0;j--);            // 延时
# T! D6 k& T4 c! a                    ECAPRead();, S- O6 s% m. d$ D1 D6 y
        }
6 p: `" q4 b$ k# |* E- j3 h$ s        UARTPuts("\r\n",-1);
* q6 ?# X& {2 I0 M" M        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);! h2 {! Z5 x  D) G, `2 `" |
        UARTPuts("------------------------------------------------------------\r\n", -1);- ?4 U7 q8 `5 a$ m% a0 Z

( V' l) J  L) g$ Q        // 主循环* y* s, X8 D, Y! N2 N; Q- W$ ?- A
        for(;;)& j0 S( ]; P& b* A2 h* i$ R
        {  T5 G% j- P. `
. n" R4 r; [! Z+ u, `7 b
        }
( U5 N/ F' a5 j% l  ]% ^2 ^7 F}
$ |) H  f6 w0 |) V( S- z  N
8 G' h  J5 D' K& M+ n7 l0 K* W* v0 I/****************************************************************************/
- j* q/ \; l9 t& W  I/*                                                                          */+ e: ^! _% E* l* |) X
/*              PSC 初始化                                                  */' J9 c, w0 f- s" j4 X2 j' t
/*                                                                          */$ x, v$ m6 p9 N- W- L! J# a4 G
/****************************************************************************/
, ?) h" `) K6 N/ Q$ s  Y! j% avoid PSCInit(void); o( d6 U/ ?. F1 k* h- I9 p
{0 m! Y0 P6 M. ]7 g
        // 使能  EHRPWM 和 ECAP 模块4 H5 R& m* o0 C6 a* C
        // 对相应外设模块的使能也可以在 BootLoader 中完成
% _3 D$ B- _) V; {7 H' R/ F, n    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);4 ~- t* E4 A  d, k$ Z! O2 g
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);4 p0 B0 v/ ]0 H5 I  k
}" N1 A2 V' t# d6 H4 s' V7 F
9 ]/ W5 E- N8 F
/****************************************************************************/0 \' A1 N  r. \, I! b8 d9 k
/*                                                                          */. o, z! b  g1 I" S0 p
/*              GPIO 管脚复用配置                                           */4 P' v# K" V; `0 V/ _
/*                                                                          */9 q$ P4 E, t- ]5 R
/****************************************************************************/
  O/ u$ {9 S4 o2 j: q* {9 vvoid GPIOBankPinMuxSet(void)6 k: J0 A- C$ ^- }) {9 Z# X
{
+ j, e+ |' {, j; j! U8 y3 P  {        EHRPWM1PinMuxSetup();  y3 l( T9 j0 |8 P$ w
: i! P, i8 C+ [6 v
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)1 s1 R: A7 U  C4 V4 D
        // 作为捕获功能时管脚方向为输入- e3 G. U. U& M0 N, U/ C: }
        // 作为辅助脉宽调制时管脚方向为输出
4 ]4 o  T+ C) z) G    // ECAP2 / APWM2  Q! k6 _2 W# w/ S& F* u
        ECAPPinMuxSetup(2);0 E, h7 L) i4 Y5 m# s
% c) j* ^6 q6 c8 k7 K9 @
        // ECAP2 / APWM2方向设置为输入
9 f$ C9 q) A3 P        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
( z& X( C/ {9 ]5 o}
0 f1 P( I/ M0 G1 H9 M! f4 P* r
* H- z4 |" l( M% B2 S/****************************************************************************/
( X* w: U% G0 Z5 [7 k/ T& F/*                                                                          *// o- `% Y& Y6 c  R' p* c
/*              PWM 输出波形                                                */
& x6 o8 m$ u6 b" ^$ p/*                                                                          */
3 M) r0 g6 H. S0 f  i/****************************************************************************/7 i* I' y; ~$ E; O1 R0 R
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
1 ~5 |9 I4 R4 G9 n{; m8 D( l7 N0 b
    // 时间基准配置2 @/ b/ i3 L8 ^. O
    // 时钟配置) A: F- |7 ?- o3 G! T
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
4 s+ W# ^( K. ]! Z" Q6 W
6 b, T& t; j  Q  z1 d; y+ `    // 配置周期3 A' I2 m& p9 z# p: X( U
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,8 A5 r3 C& j% \5 E
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
" i+ V/ Z: S# G8 m
. v$ ]4 B! i# w% [- q" [6 H    // 禁用输入同步信号
- E; ?" ~: N$ t& t) E    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);2 W6 t/ `2 ?" p$ w0 v6 U- X
& h* F8 Z1 I1 S9 D$ E% ]# O5 i
    // 禁用输出同步信号4 X$ m- ?* N2 \2 b$ H) j
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
$ |4 O$ |2 t: q9 ^" E7 ]+ K+ R: E% p5 X9 o) ?  c8 [0 p- S/ y
    // 仿真(DEBUG)模式行为配置/ P2 c' U  _4 \! P; L
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);6 S9 t$ m" C8 C/ N, I
# X( A* g; w5 e9 V
    // 配置计数比较器子模块* w. T- M% w5 i% U4 K/ f
    // 加载比较器 A 值$ ^2 E1 b) S' h# v6 k! ?
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,1 C2 J8 y, K, y: J6 i
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);# V3 N8 b1 u( r

, \) d$ F9 w) Y6 t5 d/ W    // 加载比较器 B 值
; b8 C1 e( |9 g2 ~3 j/ h! v    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
+ ]: ?; _, n" P' O8 M( O                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
5 c. Q' z  p2 b$ e  Q* q% ]. t) @" `* s( D/ S
    // 功能限定配置(输出引脚触发方式设定)
! {3 A2 F$ J9 h+ Z) Y& l; a    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
# b5 V/ H9 O' W    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,/ [; e/ V8 k& f; J; b
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
3 a9 u! `- v+ P( B2 t& g# p                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
; }" F# {% i/ W8 R, W. f. e! \8 A: S" n
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
: _3 G+ [- a9 J+ B* X    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
" H. G/ t& `2 k( `% h1 a% V* k; c5 a" U' p
    // 禁用斩波子模块
# O1 ?8 O- _0 n: I    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);+ w0 z$ O( Y3 S; U1 J
& }; \( q9 a( i' c1 l9 e
    // 禁用错误控制事件
" L4 X/ s2 Q$ _! Q1 v; T    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);. n2 T% ^; k' n+ h8 H( s
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
6 o* O: X0 v+ a. o" T" n; g7 O8 c' u
    // 事件触发配置$ s1 O4 I5 @( Z& c' S+ M
    // 每三次事件发生产生中断
8 h6 W! o. y5 p( `% S% |7 V    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
% U: }2 T* Z% G+ `+ D3 i! A    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件4 x+ V$ c% K. u9 E' |
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);% W( I$ c5 I; X$ S' _
    // 使能中断
  p+ x, B% B7 r' e$ {6 ~' O  U# O    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
" ]# Q& `) s/ K( b' @4 g8 ~0 h- V! _! H7 S9 D
    // 禁用高精度子模块
: W3 B! i" X( B( ~/ @: P8 j9 A    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);+ h0 }1 V* P1 p

# i* f  ^1 U4 Y: I# [# e    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);6 T) A$ [, q* m- {) _0 x: ~
}% q; _7 i$ Q9 c' T: ^

. b$ f# [* K( j& G/ c8 t/ p  dvoid ChopperWaveform(void)
& _- ~* o: e$ S  ]4 Y2 w# k. m{
/ Z9 t3 e; k8 l    // 50% 占空比
# [$ O, H: w. m9 m* e, i) T& D    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
, W& G8 x2 M8 h2 g% `1 I# W    // 4 分频# B, Y4 J* J4 g4 C! V
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
3 @0 }# V8 y8 j3 \+ m& \1 w    // 单个脉冲宽度' q9 ^% C; t  p( A1 h0 `) T
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
- t: Q' E( Q/ D4 [: V# n    // 使能斩波子模块
/ F4 E" h; j' l    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);9 E. j  M) Y: i
}
6 }' |1 ?* O, Q, P$ `
" e& e" _' X6 ^/****************************************************************************/" x% s0 s, m. j
/*                                                                          */* }5 p' C8 N5 {* {( x) P7 b
/*              PWM 中断初始化                                              */, n1 z. i, m- w) j
/*                                                                          */$ e% b$ p9 |- F& J) n$ |; u  Y
/****************************************************************************/
; J- U$ m/ l: U8 _1 evoid PWMInterruptInit(void)
) u* K& z2 B% v{
; c* i+ b+ s/ |% C+ \        // 注册中断服务函数$ N" |. J  t6 F3 ?3 K. L, g
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);) c. [0 X' o. }; N
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
/ ?+ d% o5 B) T: N% m  `1 h# i  d: P4 j( C1 `) j
        // 映射中断
$ X  J) g  n9 W  {3 v& Q0 T# i4 }3 b        IntChannelSet(SYS_INT_EHRPWM1, 2);
. E2 }+ X! B, R8 c9 b- M0 D, M  T        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
% G" J' I. d  e8 D8 R1 Z+ f. \! O1 f) Z; k, _7 ~) s- U0 h
        // 使能中断4 a/ I$ ]8 N# Q0 [
        IntSystemEnable(SYS_INT_EHRPWM1);
3 y; T' w: \: a$ U9 e9 \8 f+ q        IntSystemEnable(SYS_INT_EHRPWM1TZ);' e1 e) H& p4 J  F
}
* N9 N0 g5 O0 c1 N2 \
  V$ V- Q, h$ J/****************************************************************************/1 E. E! R( C) @8 @8 @5 ]
/*                                                                          */* q# g: u2 K* C: \8 B  t
/*              ARM 中断初始化                                              */
: W7 A0 W6 ]2 H# O  e7 p9 g/*                                                                          */; q  U6 q2 D/ i8 K
/****************************************************************************/
+ Z3 ^6 r9 m6 ]$ b$ bvoid InterruptInit(void)
1 F9 X4 A* W7 ?! m& S2 u4 U{! Z2 Q/ v3 M* t( ^' l! d$ ~
        // 初始化 ARM 中断控制器: A+ ?/ O3 F$ ]3 d8 W" P
        IntAINTCInit();& {4 a0 |4 h$ @! c: `' `; ^
8 V& C; T. C" H6 c4 H  o
        // 使能 IRQ(CPSR)" ^, _" q0 x  G0 e  z
        IntMasterIRQEnable();/ X* X, H, V, v% Y0 j

1 M6 A2 n4 r7 f4 i  A        // 使能中断(AINTC GER)
- ^2 N+ R2 o' O3 k3 Y" J        IntGlobalEnable();4 ?' o+ Q$ s2 ?, r1 S

+ J( G7 Q+ y" P, d        // 使能中断(AINTC HIER)
6 z. \4 e% q: x4 p4 X        IntIRQEnable();
- M) f8 `- g5 B4 ]4 @% w& i. f( _}, w# l- a3 [! N* o* A( K
  w9 v4 z1 s) |. F

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/  o  b) Y1 t1 H: I; r
/*                                                                          */
+ E6 c4 C8 q! ]; s8 @* r5 S/*              中断服务函数                                                */% |/ b2 `3 ^3 H( G7 ~; f9 x. I
/*                                                                          */
/ v. g1 c7 p! ], E2 {' n/****************************************************************************/$ q5 J! J$ p3 X
void PWMEventIsr(void)
3 u- u3 k4 {8 H) L. o! P7 F9 R* M6 y' r{8 w# L9 e6 I. M) D
        IntSystemStatusClear(SYS_INT_EHRPWM1);6 J0 g( n3 ]) U7 N. T( |

- c  ^: e+ G1 ~; |" M    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);3 _" c$ k1 a1 A8 R  O9 V0 Z2 j5 w; U
}
( h4 ^9 o* d( j8 G$ ^' j) x9 z5 {3 x: u6 ?
void PWMTZIsr(void)1 H6 E& n' J) G+ i% ^$ e/ u+ o
{
$ I$ y  `0 P$ c0 W6 Q        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);: Q3 }7 f" m- C
* s- I) ~% G8 B) ]" ~5 _+ b. \+ x
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
9 x7 U: C/ e! i* n' A8 q6 {}, ~6 g  y  n- Y; I( X0 d4 W

# U; p. n& ]8 S& l2 ~- e+ {- X- R/****************************************************************************/
0 q3 y  v4 z% C+ ^- P) o7 \; y/*                                                                          */: o, ~" o: B  j2 D. F3 m# V
/*              初始化捕获模块                                              */
! r3 R' u2 d* v/*                                                                          */  E0 J8 X2 ~0 g; V& x" K( u# @
/****************************************************************************/
. k4 v1 O0 _, f  wvoid ECAPInit(void)  n' N! `) k0 @8 k+ y
{
/ i; ^5 M  e. b0 h        /*-----设置 ECCTL1-----*/, S! y1 [/ i8 R9 p8 d
        // 使能CAP寄存器装载
7 t* q/ ~; y, @# _# h- m$ d1 I        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);- R* A4 C( [& g5 Z) W' t
        // 设置预分频值.! \1 w/ c9 \8 t+ q( {  {
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);1 Z$ ?7 G8 n" L, W) V3 d  b, L
        // 上升沿触发捕获事件! I2 Q8 `0 `/ P% `, r& C, }
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
- P$ [  s8 P' c" k0 g        // 输入捕获后重新装载计数器值.
* M8 T, r- g, n& q/ n5 d7 S+ \        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
% W6 Z7 y' w1 ]) Y, L/ _2 d4 j+ o
        /*-----设置 ECCTL2-----*/
: U, a8 C7 u1 P7 o. L# a        // 连续模式
8 ]* {1 `& j9 O( r+ h        ECAPContinousModeConfig(SOC_ECAP_2_REGS);$ m4 G1 t  o6 l! K  e% E) r* t5 g" Q, Y
        // ECAP计数器TSCTR持续计数$ Y" L; K! S7 N, C
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);+ J/ ]4 J7 g$ m6 b. ]. w, c, U
        // 禁用同步输出和同步输入7 H1 o! V7 _) _
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
1 Q- O  Q/ M+ L7 a        // 配置 ECAP 2 为 CAPTURE 模式
& d& N2 I# R. C5 v' o        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
# ~# b& j% F$ y9 C' D: B* b
& m: [6 s8 M) A5 F2 s; K  a6 Z        // 使能中断
8 ?' @( Y4 ]2 b' D//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
3 Z, x3 L5 v* Z. ~6 r}
7 \' g) h/ [9 X% t, ~' k
1 L0 t7 O, Q7 {9 q4 H8 }9 @1 R4 o/****************************************************************************/
3 m* U% P' G9 X+ z/*                                                                          */
' r/ l$ O. e: m/*              取得捕获结果                                                */
, P" ]$ n9 Q0 I3 i& A5 t& P0 ~/*                                                                          */# V, C. b& Z1 i5 X
/****************************************************************************/" M! D6 m* f. y3 M
unsigned int ECAPRead(void)
. c7 j" E; ~6 [4 Z5 z7 s2 \; b{
( X7 o- J4 G; N5 W' |        unsigned int capvalue;2 p' x; X7 @  r" D4 q4 Q  i( @
        unsigned long frequency;! Z3 u5 U9 z/ Z4 e7 E8 F+ L9 J# K

+ t* z3 ~2 A2 i5 H        // Event1 中断标志# I& x3 q) {1 E; S" l3 t
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
6 B( b" O8 ?' Z+ J/ t7 H        {, x( h# ^" @; R% y/ ^" B) o, O
                // 取得捕获计数7 A- \9 h# ?, {) t
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
2 ]/ m6 D0 c1 M4 a2 j  k; N                capvalue = ECAPResult.cap1;
4 T3 x' @( @/ P. @% H8 }4 {0 L1 k- U* c
                // CAPTRUE 模块 228M 时钟主频
: Q9 C$ R' ]& l5 i                frequency  =  228000000/capvalue;
7 X: \$ V8 z0 M! g                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);  Q9 j$ y. m: W& d8 ?
/ R4 }" J4 Q) v9 r& W
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);/ x2 Y+ w5 {2 k7 Z) Q
//                IntEventClear(SYS_INT_ECAP2);
4 A7 t" v$ F, P; m$ U1 y        }
$ t' @! A: d8 Q4 z7 J2 H9 d2 Z        return frequency;3 d& F9 Y2 W* p1 _
}  s0 D- Z6 P8 P

作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
( Q3 \4 i9 J) L; \[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