嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家" o. f7 }0 ?( J; x/ U

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
. Y7 l9 F/ s7 ]! G5 o3 f/*                                                                          */
& M, u* I2 Q  \; u8 q/*              宏定义                                                      */: E2 }3 ?; P9 B/ {6 `4 v/ ~* @! D7 W* b3 @
/*                                                                          */7 n  }" ]6 W* N. x! P0 m* _  B! l
/****************************************************************************/# X+ ]' b7 N' d8 u0 a
// 软件断点+ B  ^7 ~* I- a& i
#define SW_BREAKPOINT     asm(" SWBP 0 ");4 f& a! h3 F4 a) Q

, x+ d" m: p) L" C& R* a// 时钟分频; u0 z% u; d2 v, p
#define CLOCK_DIV_VAL     228
; K% Z/ _5 _4 P$ J- |) ?3 H& k6 G- R* \3 d- p: u! d. g" J) m$ t5 Y2 u
/****************************************************************************/
) w2 q" j: V4 |- L/ U/*                                                                          */" i% a5 [6 `* @' A( w7 E1 F
/*              全局变量                                                    */
* `1 p) _! C/ t& p- ^! {/*                                                                          */
1 B  ^( ]8 c; m/****************************************************************************/
* {& U1 V; U7 WECAPCONTEXT ECAPResult;% x* j% g" A7 G$ Y

+ j. d9 P+ u) Z3 K% b/****************************************************************************/
( }; t6 x& M) `0 i/*                                                                          */3 j/ v( c% G; k
/*              函数声明                                                    */
" D8 I4 b: {/ ]3 K) Q/*                                                                          */& f+ F4 ^! q2 R3 J1 l, e" P  A, c, m
/****************************************************************************/: h5 U4 G+ k4 ]4 g9 w* G( l
// 外设使能配置6 E  H) C0 X+ v4 I7 J$ w/ ]
void PSCInit(void);
' X# E2 }7 C$ w  J: i; D: X) z/ e2 F) b1 D% b/ f) F1 P) }
// GPIO 管脚复用配置
  u9 a7 k; @! ~$ k) I! B, Jvoid GPIOBankPinMuxSet();+ \  |: l) k% O$ _

8 b- m  n3 I* p* ~$ \, z// 产生波形
! T0 ]6 @1 h3 |% Y7 \+ Rvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
( Z8 e) O6 W+ j9 Avoid ChopperWaveform(void);' K4 r2 ]( z3 v0 E, _) p8 s# n% P* ]9 U8 A
7 C1 F8 a, r. b4 `
// ECAP初始化和读函数
: }4 \$ Y+ W# ]) a9 n' V: Pvoid ECAPInit(void);) U4 X2 c$ Y& l* |/ u
unsigned int ECAPRead(void);5 c3 }6 W3 K* \" E

/ ?- A" }0 `. Q. ?* }//ARM 中断初始化- l0 Y- A/ l/ s
void InterruptInit(void);% f. Q2 Y' F2 J# w. t9 n" m

, ?4 C+ D& S9 p& ^4 S// PWM 中断初始化" N; B& X9 x1 f* M: ]; i
void PWMInterruptInit(void);7 Z" @: v, U- C/ m, }/ I0 ~
// 中断服务函数
! X* ^  {3 a: }7 N// PWM 事件& _4 A8 a7 V9 J
void PWMEventIsr(void);
, S( n5 s- v; }// PWM 错误控制事件
3 Q) e6 p5 W% K' C$ i# j/ `void PWMTZIsr(void);
7 w0 J  b/ C' l- ?% I
, H3 J/ ~: N$ N! k& @# B% y/****************************************************************************/
  u- ~' c% N% G/*                                                                          */
# I7 h& m( }* m5 o& v/*              主函数                                                      */1 v1 \+ W- J6 W4 \- @6 Y) F
/*                                                                          */
5 u: H; w. ~" P, z, r/****************************************************************************/
2 w, g3 ?! u/ Z; h% l( mint main(void)
) M4 e7 v2 X. t5 h! b{
( c2 _5 X. k! Z% l        // 外设使能配置
. }9 k0 p. O/ \        PSCInit();
+ f" O4 h' [/ H( @. g; u4 o/ J, `
: W& q. ]2 P$ v+ X        // 初始化串口终端 使用串口26 d* k+ X/ l2 G5 E1 S
        UARTStdioInit();. ^" T; h: i* `3 r- x
       
  N+ n8 m' |# b        // GPIO 管脚复用配置9 D1 a" @6 C( B+ L0 _
        GPIOBankPinMuxSet();, y9 @1 ^; i7 I  ?8 z+ s' ?
7 r1 ?. U% a7 ~4 T6 A
        // ARM 中断初始化
, a# `/ r7 N; U        InterruptInit();3 }+ k) Z9 ^3 Y! J
/ }: q5 S! r9 ~; G1 k& B# E  Z; ~
        // PWM 中断初始化; L! W2 H4 |+ I8 O3 b: f, T& _6 h
        PWMInterruptInit();5 S  D8 I- R* S& D; d9 b; \* P
: H( ]; `+ ]" {3 ~1 ~
        unsigned char i;, w( |% ]9 H; u/ k6 t2 M: Y9 S
        unsigned int j;6 Q% I& e9 t- @

& t+ g6 d" u4 ~  H3 u" V: z        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
: {5 Y# M% j9 d! j3 u/ y  C2 m        UARTPuts("------------------------------------------------------------\r\n", -1);0 H/ S/ T+ f; b0 e9 M
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
; i4 d1 ]. j% L        // 产生波形
, h& t; J: n6 F' U# R+ @) R        PWM1ABasic(25000,50);) _7 {) K. l8 U  E* [. ~

: D/ k7 j( Y4 l; P. O        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
' ^7 w. y+ c. f# N% d        UARTPuts("------------------------------------------------------------\r\n", -1);! _: ^: v+ S) b* r% S9 X4 G! s5 p
5 d4 a$ f0 ?" }) e+ l; Q$ @

& [) M# `- [2 m4 O
# w4 R  @8 B, O( ~- W        UARTPuts("------------------------------------------------------------\r\n", -1);
- u8 o& @; _. [+ ]8 Z" x3 D; e) W        UARTPuts("                    C6748 ECAP Test\r\n", -1);2 W5 L8 s: ?: {  S5 K
        // ECAP 捕获初始化
! S; r7 Q" E: g        ECAPInit();
1 o4 ~9 [, [1 z* i        UARTPuts("Initialize ECAP.......\r\n",-1);* ^# K) s1 s- ^
        for(i=0;i<5;i++)/ Y# e, Z. I4 n1 f0 [, o
        {
" r, M/ T) X% r1 ]/ }3 C                    for(j=0x00FFFFFF;j>0;j--);            // 延时3 I* ~1 c0 f8 m5 ^+ h4 W8 z- V: L0 j
                    ECAPRead();& M# e) j* U8 r/ C
        }" F6 U# G8 [) b8 k, @8 {" h
        UARTPuts("\r\n",-1);
5 M1 W4 r5 t2 c        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
" |1 ]. f, t4 M' o/ c7 j# L4 t        UARTPuts("------------------------------------------------------------\r\n", -1);
. x' r1 D0 k  v" z) c; E+ E
% J) E# R- p$ v+ k0 w        // 主循环1 v. O8 k3 e5 j/ n+ w  v
        for(;;)
+ V5 A9 l" J& V2 Z        {
: {. K8 d/ Y( N9 T; A: }# M) q8 V' Y/ J+ I/ l0 T& j- ?
        }
/ r. L: g- w$ I2 K5 v}
" @+ ?4 Y: g3 S8 Y! E  |) ?' l. O9 w, s, [& A- w; |' }
/****************************************************************************/7 ~8 a) i! d' G; n! w1 `
/*                                                                          */! m" w/ i1 ~4 d* D& j# b
/*              PSC 初始化                                                  */
1 U, |/ J( X) S$ h" d( f/*                                                                          */' I6 r  m/ l) A8 G; o$ M+ ~4 c
/****************************************************************************/; n4 Q$ v" C" S# y: p) N
void PSCInit(void): G$ V6 m* g* ?2 p4 n7 A
{/ v( o7 E/ I6 T2 l. p
        // 使能  EHRPWM 和 ECAP 模块$ o3 m1 ]/ z( n* W. z  x6 I7 |8 ?
        // 对相应外设模块的使能也可以在 BootLoader 中完成# b7 Y) G1 ]; y( F2 A9 k
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
7 T# u" c9 v, F& x# s6 L    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
+ s0 n  e9 c2 a3 ^3 d}
1 l  O3 O, M$ K* Q; @
) R* u, Z2 |' u0 @) J! O/****************************************************************************/% L' {/ b, ]* }/ S
/*                                                                          */) O4 E+ K% i$ H- D& E, t
/*              GPIO 管脚复用配置                                           */2 c) K: N$ I+ Y6 |5 r; Q4 k
/*                                                                          */# L0 [9 y% G  V* ^
/****************************************************************************/
0 C$ `: m& N0 m6 P- Ovoid GPIOBankPinMuxSet(void)3 Z" L' I" {( Z, ^  P5 Q5 {+ e
{( e# v0 ?* h5 L' h  z3 P% [
        EHRPWM1PinMuxSetup();
- ?) V$ R0 }8 u, p; d9 |. K" h* h: _+ w* v- C5 t9 I
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
" g- f5 B8 h- d8 p2 s8 n. X        // 作为捕获功能时管脚方向为输入
6 D/ p& A5 y% U$ P  q$ {        // 作为辅助脉宽调制时管脚方向为输出
( Y: V; ?& A8 I, N    // ECAP2 / APWM2# S  p( Y$ h9 u( M, X
        ECAPPinMuxSetup(2);$ q. W" a$ `! k/ S4 |9 N) [$ ~
2 ]# Y- j) Z' g
        // ECAP2 / APWM2方向设置为输入: Q7 c- M/ t; C/ T4 o  J0 A" T: y" p
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]( z! X1 t- ?! _% [6 m/ {% B
}; n4 t" v% f8 {3 r5 {/ e+ Z

; d) X5 `8 \2 i4 T/****************************************************************************/
( w8 U$ x/ u2 `2 @( Q/*                                                                          */9 S! P* O) B8 e& a; X6 _
/*              PWM 输出波形                                                */
/ \" ]; o4 l2 {/*                                                                          */
; F: Z. Y6 W# A# b2 z0 Q; ~/****************************************************************************/$ O. l5 }- i8 J' ~- ]. h; e
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
" f( @% x' K+ T$ t  I+ o; X3 |{
( c& d  ~, N- O7 ^    // 时间基准配置
2 K  T, `3 t- r    // 时钟配置& }  L) h# ~* U6 E. ^
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);8 j/ }0 j$ @# I# x- w% h* E

( B! |! j! P1 E* J# U    // 配置周期( e0 T7 u* i( M/ {7 R" Z+ c
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
9 `3 e$ b5 I. ~5 z                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);4 u, r1 i2 d8 a9 i" G- ?
( z* G- N5 z; C7 ]7 r& M' @
    // 禁用输入同步信号% e* Z. a/ I6 J# j  Z
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
, r, [8 [1 \3 e$ u3 e0 J. Q) o$ N
% _+ d- y. I0 T! P    // 禁用输出同步信号
+ R; G1 D% L9 I& t1 t    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
' c: D3 v. A5 g9 `/ H
* w6 b# X1 X8 `% R1 u: g& z0 ~) T    // 仿真(DEBUG)模式行为配置( \; e* ]2 M4 O& ]9 o! u
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);7 }( I4 Z7 Q# Y" k

: K: |( J+ ~9 U    // 配置计数比较器子模块
2 R* T, q- t+ d" a    // 加载比较器 A 值
3 J, I1 E% ~5 }# E    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
; Q$ T7 `8 n" S( B; I                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
# M: w. |' x6 X9 j8 B+ Q$ \+ g
' L* E& R- ?( C$ {! y, S    // 加载比较器 B 值! c/ C9 O- g. h/ j, \: O9 \
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
5 \; I# E/ ]& h1 ?8 n6 k                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
+ J1 O+ q( Y/ o8 M1 g+ s7 r, n$ _( `
    // 功能限定配置(输出引脚触发方式设定)  W& n5 O& u/ }1 T& ^: m, W6 Y0 V
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
/ {8 D. P8 G4 |. \# d    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,3 E* n0 O  n; R1 p7 s9 f% x
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
$ p6 ?( x3 w: n! y7 B3 K                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
! g4 O1 d8 ?) |% w2 W
, W" k2 l( J- K* T; U    // 禁用(旁路,信号直接输出到斩波子模块)死区模块8 S; |, x* x' P/ a" L; O8 w9 z4 e
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
; l5 r  f' h, T9 e2 D# |: `5 E* [" O  M; ~# k
    // 禁用斩波子模块% v. N# Z+ P& G- c8 k, T2 o
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);4 P9 Y# E& C3 t' u) U7 [. c: D# l

3 f5 O% ]2 \8 u  y: s7 y+ g    // 禁用错误控制事件
* q& k4 W6 _1 \* j. [" g    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
9 C# o/ C& P7 e$ S/ F: N    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);  U" `3 G. y# O; d# i' U3 X# }* V

$ ?' v& _; p# l# S9 P, }) }. Z    // 事件触发配置& R$ a2 Z6 W9 h0 e' Q) O" x
    // 每三次事件发生产生中断% i3 ~/ f8 O8 i
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);) B8 v) _  u8 P
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
* {) z8 J: e' ]2 H& q  c    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
1 ]8 m; _# d* i' q    // 使能中断0 c. W' a) ~8 n- E* s
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
: _5 ^2 y- u, R: n( b, q
2 ^7 |1 }& M' O0 U+ b    // 禁用高精度子模块
9 u4 l8 j! B# m  W9 S5 l    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);3 X: P! Y$ ?4 q

+ Q! R) k9 w* A, H- H" [    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);* t+ C: I8 {" w2 C
}6 ?- j0 |6 \* n5 _. }4 M5 Z
: n$ t5 {6 e! W8 ]4 j! |
void ChopperWaveform(void)
- s% v5 ?4 W4 f2 ^. i4 m{9 ~; z5 X: W; X2 q9 p3 O  v
    // 50% 占空比3 R: V" R- |) G6 ]' u
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);- X( `5 {) [! M: u0 l- a2 L
    // 4 分频$ l' D7 c* V. K# D+ |( v5 E
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);/ `: [, L- N$ `$ [0 o
    // 单个脉冲宽度
- b1 p2 n3 L0 c3 }" L: Q, }    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
9 a7 r7 O* f) A- d) k  p/ l    // 使能斩波子模块2 u0 }5 L' @0 k4 F% v1 v) Y
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);$ ]5 C0 N/ m/ |- n: i$ U& x
}
) ~8 T; i: q  d0 A$ K2 V) x9 U0 U
, {7 \3 c) D( v* _/****************************************************************************/
2 m' x6 {1 O9 r' t! s# ^7 J% ~, p/*                                                                          */( B/ `8 w+ `! [, {
/*              PWM 中断初始化                                              */
/ e1 Q& n2 a3 E2 S0 V. Z* ]/*                                                                          */$ C# j9 f9 H, _" [" J$ O
/****************************************************************************/$ E) ^$ W5 e+ O# A
void PWMInterruptInit(void)9 I4 A6 H$ I) _, j% t' k& E% Q
{# Z, C; k3 U  z# g4 G
        // 注册中断服务函数- m1 E5 j" \) ^9 B
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);7 i+ h( [- h. p
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
" t( _/ |1 P' h  |6 [3 t' E5 R- P) }1 W# q. |' R" {2 p
        // 映射中断: o% N: I1 w. B  j
        IntChannelSet(SYS_INT_EHRPWM1, 2);4 U& I# U" Z2 M
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
  w: |& y, Y0 h6 L& x6 U$ V5 N: P5 @. w6 ~) F  u3 o
        // 使能中断( I9 U6 n5 t( ^& f! Q( J
        IntSystemEnable(SYS_INT_EHRPWM1);, M3 v8 y( T3 u! Y) \: M* }1 P6 [
        IntSystemEnable(SYS_INT_EHRPWM1TZ);. O$ J: _6 ]" u1 K
}, }5 i2 c: p! M: j: {: ^* [

: E9 v6 x& a5 w& z9 G/****************************************************************************/6 _6 ~2 [6 [8 Q* h/ @
/*                                                                          */2 F6 _- n( |& {5 ]
/*              ARM 中断初始化                                              */7 O/ Z: q6 e' U8 u! W( U
/*                                                                          */
6 K- H& K, @4 m+ I/****************************************************************************/$ G! Z  _/ E, k) n
void InterruptInit(void)+ ?5 |& J# o" \$ \) j
{
  s( m% r8 K3 c% L  ^% D7 L        // 初始化 ARM 中断控制器
; k3 U1 \) S9 k- u, A& I/ Q  e        IntAINTCInit();
$ K  Z, S" r- |" Z
# n; x# S& z( {2 w- m        // 使能 IRQ(CPSR)
6 E$ u9 J' ?5 g7 Q/ d        IntMasterIRQEnable();
( y( D6 S7 ^+ g2 {9 l. Q5 e
. w  Q  {( u8 `9 X9 Q6 h        // 使能中断(AINTC GER)2 \% N- S5 N$ v4 q, J
        IntGlobalEnable();
6 l5 n" W# X7 N6 _. ]! m) Z6 P7 P! W
        // 使能中断(AINTC HIER)
. T  [$ p8 H! \  Y8 c3 p        IntIRQEnable();
5 s' z- J9 N( U+ @}" G* d; Y# P' W2 S$ z0 x
4 T/ ?/ h. d+ N- V3 ^# Z8 u

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/! r+ i) s9 G* k! ~2 j
/*                                                                          */' M* U* @; [2 [3 ?
/*              中断服务函数                                                */
2 W$ P. ~0 {# r+ x6 W1 j% t# G2 q2 V/*                                                                          */; M  e2 ]' Q4 Q! U1 U
/****************************************************************************/
* f# B$ d9 s2 h! B7 S, I9 d. e/ \void PWMEventIsr(void)( K+ v& v) k3 @8 H% B
{
9 R* x9 q# J& a( }9 ?        IntSystemStatusClear(SYS_INT_EHRPWM1);
( s) h+ v8 K/ k% N, d% b
. H9 w' G9 F( P. b  k- V4 R: l, B    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);/ d5 T6 @; e# L4 p0 i5 S
}
9 A9 C6 F$ |* i; W
5 g2 O. }7 N* s; zvoid PWMTZIsr(void)
, a  U8 }1 N! m( b$ G. p{' h' T- T# ^7 r- n4 V- T
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
5 [: a5 F; m* @- x* X
$ Q* E5 X+ j% t% Y8 c( k    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
' Y3 t2 h7 l5 T& L' \7 z" k% P}
& C. I: ]4 ~% @: @2 d9 M6 w
8 _# d0 C+ H# u0 `% |2 ]; m5 e$ y" A/****************************************************************************/
) z8 _( `, i" L- l- ]6 C2 Y/*                                                                          */, t0 m8 k1 ~! e8 S
/*              初始化捕获模块                                              */  U1 z9 Q4 d4 a/ `' ]2 Z; [
/*                                                                          */. `3 m8 \7 b; G0 D: C1 s7 E
/****************************************************************************/
7 i$ N0 L. q! M+ uvoid ECAPInit(void)* l9 s' k' e6 W4 v" Y1 H" B( @8 _
{, Z; V$ R3 {' z0 |5 Y  l2 u! M* M
        /*-----设置 ECCTL1-----*/
; O/ h8 O' F. y: z( a        // 使能CAP寄存器装载
9 V7 W: x+ f3 i        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);& N* y+ V; U1 }+ f7 [8 k2 }2 P* w! u8 S
        // 设置预分频值.0 u. s9 I& H- J; P, P8 L+ R. Y' g
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
3 C* K( c+ `" F- B5 y; B4 \; @$ Q        // 上升沿触发捕获事件
2 d8 @6 @1 H' d' k7 O        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
) M$ z* d! u6 x' d  M# P: P        // 输入捕获后重新装载计数器值.
0 Y2 M8 a, P: w6 e* E        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);! [# \" Q1 ~9 n$ Q( ^
* R4 u0 g8 v% T5 ^3 ~; f( Y  S
        /*-----设置 ECCTL2-----*/: c' c5 J8 j0 h8 E# R+ [
        // 连续模式* p4 b0 h; ~) j4 S9 G, ]
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);+ z. a1 u& i  R
        // ECAP计数器TSCTR持续计数$ P% `+ I7 \# ~5 p1 Q1 A- I( `  W
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
! c5 f) Q! N* F7 F$ y. z! O& b        // 禁用同步输出和同步输入
$ Q" g  @, X, q9 C1 l2 k        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);# Q; B' |/ w( `5 \
        // 配置 ECAP 2 为 CAPTURE 模式
/ D* t( Z. S0 ^  b        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
2 ?0 w' [# [( x
8 T; P' _& k3 B        // 使能中断
9 S: l8 i6 O( R5 J2 ~//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
2 K% }7 x: Q# A6 I}
4 s! \, X! h8 E- ?8 V
, K( a' _6 R' f+ N& U! y0 w/****************************************************************************/$ f6 g) e9 t' s  T: Y
/*                                                                          */2 B2 Z+ r/ X4 Y$ t5 V2 e0 u. z8 z
/*              取得捕获结果                                                */! h+ s$ Q( G  m  Z2 s
/*                                                                          */" g3 Z- M# h4 j6 Z6 @* O: ]
/****************************************************************************/
7 |4 i6 X/ O6 c+ V7 @7 d* kunsigned int ECAPRead(void). A0 y" G8 K* r4 W1 E9 \% j+ C  L
{% {6 g9 R, a* U9 K7 m( W/ O
        unsigned int capvalue;0 X+ L* S3 S) Q8 L+ l
        unsigned long frequency;- m9 r% G) I6 i. p( I3 c

6 y, T0 z, @3 s- V7 \0 j7 l2 I        // Event1 中断标志8 |& i& p4 j, C; N# a% }
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
5 c2 M# \3 n. @* \        {( m( v; f3 H& F7 d  f, N) }) g
                // 取得捕获计数
1 f9 E! v+ g& A3 N$ O. @( G  i                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);% f! ^  j0 f. t2 A1 k
                capvalue = ECAPResult.cap1;$ U" S' C3 z" A& o' g: T4 `
7 Q# |" ]. ^" c2 q$ i
                // CAPTRUE 模块 228M 时钟主频. }- C+ k" u) H/ R' E
                frequency  =  228000000/capvalue;$ y* o2 S- U- U+ c$ K# A: f1 |4 K
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);- k8 P; G. m& ]7 I3 p  i, L6 k* ^

' U0 S3 Z* C( h- v! n                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
9 \2 D' |* E" V# k* Y; X% {//                IntEventClear(SYS_INT_ECAP2);
$ D  c0 l* ?  d" \( y        }
) e& e# f4 N7 D6 ^6 d2 a        return frequency;+ w9 t  e% |3 z# u  t5 J
}" e/ `1 V) T" ^% m# K

作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
8 O1 p7 n# P  |! o[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