嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
- [. ~/ v! }$ |) U
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/8 Y! D& k* B5 K  a% k
/*                                                                          */
) H: W, V% k; {/*              宏定义                                                      */, T: O6 M, _( m7 V& s, h' P
/*                                                                          */1 F7 s8 ?# v' }. v* ^
/****************************************************************************/
; r% J- Z% G! Q8 h8 \7 S8 ^' y// 软件断点
: B* ~3 M( N! T, e, E) `4 O5 r#define SW_BREAKPOINT     asm(" SWBP 0 ");
1 E! O# ^% O7 D2 K) C& p. o( h
// 时钟分频
2 i7 P$ s7 q8 R7 E% ?#define CLOCK_DIV_VAL     228
7 Z1 ^3 ~; k; z" A. u8 T$ {2 W% p: k. H- G+ P, b* i' k( z
/****************************************************************************/3 k0 l8 l/ c% e: F. G
/*                                                                          */7 I: w3 L: Q3 B: U7 w0 h
/*              全局变量                                                    */
8 |; W+ n, m1 N$ G2 j. V3 r  ]/*                                                                          */
( A4 r* g) b0 w4 Q$ R8 x7 e/****************************************************************************/! j( ^, _/ o/ z+ m
ECAPCONTEXT ECAPResult;$ R2 y% o! ?$ Z1 I
: H3 @' n$ ?8 i1 _- m1 @4 G
/****************************************************************************/6 b& g, h4 ~( H: v. n6 k; o2 z
/*                                                                          */
4 K$ M7 h6 u, l/*              函数声明                                                    */
0 P3 ^, q$ }6 P, y7 K' c& b; M/*                                                                          */7 u. E* p# n# ^
/****************************************************************************/
$ Y& N  D( V4 p( `5 C/ h// 外设使能配置" u, S0 r; t6 Z. d2 ?
void PSCInit(void);
4 Y; X  p/ n2 K; W" l9 T& e& I  \9 q& C* j0 E  A2 |
// GPIO 管脚复用配置
) {6 b% c( a) m) f( lvoid GPIOBankPinMuxSet();0 J8 `- A& U1 ^" a7 F2 A+ Z. O7 u

! X" P. X9 f2 I9 J4 r7 }# o// 产生波形3 c  P! w3 b/ j- r
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
& ?, Q/ P) Q- V" W4 x7 Q  Vvoid ChopperWaveform(void);
1 w. U0 L. U! B" k) g: R, \0 R% t: x' O0 a
// ECAP初始化和读函数, _* A1 b. W* w% U9 \7 f
void ECAPInit(void);
6 i# m0 n2 U, @* \% munsigned int ECAPRead(void);8 y, o' U+ |+ b! {
* V9 P7 q, x+ J; I
//ARM 中断初始化- h7 _% s. N% R8 j
void InterruptInit(void);) \3 o' L% @) I; Y- ~: h

; V2 ]# k8 p$ J7 B// PWM 中断初始化
8 {, ?, W0 R/ s" @' k9 b1 Mvoid PWMInterruptInit(void);
4 h3 V( `5 J$ I1 X) P5 Q// 中断服务函数/ p& k* S& H& e8 U& k% H: G$ F" k# i
// PWM 事件, x  S0 O% ?" z" V1 r' H
void PWMEventIsr(void);7 w  @! U& `" ~8 J9 E
// PWM 错误控制事件
) m: R& e- h8 c$ `# [% z  I1 F/ kvoid PWMTZIsr(void);+ Y( t% ?$ A  r0 l

1 g* o( k! c+ k9 D/ ]( |) V  I. K. Y/****************************************************************************/
! i2 I+ E8 p& ~6 u/*                                                                          */5 K8 g1 V1 N# e' p6 Q
/*              主函数                                                      */& E( f; W, v0 s$ Z  f
/*                                                                          */
1 E3 u6 r7 Q1 P$ s* V/****************************************************************************/
& w6 K8 H2 y8 m  oint main(void)
4 W( L8 D& u% Z" X5 r{, f- P" n  \2 A( h/ P3 m, P" U
        // 外设使能配置) l% w/ A* c* j- Z$ [, q' ?6 y& l
        PSCInit();! J5 d! E; C" b. w9 a5 e# G+ e
) t  C  l" n% U
        // 初始化串口终端 使用串口2* X, K# O% n6 |0 t7 U+ p9 O/ x
        UARTStdioInit();1 Y# F- a. `+ t( A' N
        7 L/ b+ _; e! v+ x5 P% C4 c( T5 [
        // GPIO 管脚复用配置
) H6 J$ _; k  `& B7 G        GPIOBankPinMuxSet();& j" @# C( K* W) I
' C* k1 f: n( Y1 F% g
        // ARM 中断初始化
# p! o3 }2 [. i# ?' w        InterruptInit();/ ~  Q' h; S; y* O/ i4 N- W
* H3 a" b/ a( _+ Q  `2 y. ^5 y
        // PWM 中断初始化
; Q1 o! Z6 H5 D! f! R        PWMInterruptInit();3 ^8 y) z4 e$ B5 R0 w, E6 R

% q7 R) Y! _8 s" v% |" m$ {4 z        unsigned char i;& J3 h4 K+ A3 h$ X
        unsigned int j;. P8 V, Q' B% l+ T2 I" d( ~" ]
, i5 q! Z% {" M  X9 o
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
: p& e" D& x3 {9 s0 V8 }$ r9 ~        UARTPuts("------------------------------------------------------------\r\n", -1);8 X4 Z- `4 y% I3 M  f
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
! P4 k. b% O; Q0 X; W6 }        // 产生波形( G0 `2 t. k( x# M' f" P
        PWM1ABasic(25000,50);  s% h, B7 a, ]& v9 n* R
8 S) [: F, e" t* c$ e9 m
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);; s& \; o# E& j; h/ A0 k' ~( K: J) I
        UARTPuts("------------------------------------------------------------\r\n", -1);$ a- \/ ~& V9 X) o1 E6 P
( u7 D9 r% q! \8 q/ \
% M8 v: o9 B, q, N

/ m$ t( z+ i5 O. Y! z$ e        UARTPuts("------------------------------------------------------------\r\n", -1);
0 K) X% T, a) f: r7 R8 p5 B        UARTPuts("                    C6748 ECAP Test\r\n", -1);1 \- z  w* B% y6 g; _
        // ECAP 捕获初始化
7 u; h$ H7 S6 H# F% _8 e        ECAPInit();
- y: g- ]8 P; V. d, {% [% V* z: T        UARTPuts("Initialize ECAP.......\r\n",-1);& Z0 ^' T$ s( o# f* c5 N$ B' s6 y2 S
        for(i=0;i<5;i++)
# I! x. @/ {) d2 w0 m+ B        {
: x  Y+ [, a% G/ J5 Z% g# b8 K                    for(j=0x00FFFFFF;j>0;j--);            // 延时/ I0 F6 z; M- m. B& G' K7 [, h
                    ECAPRead();% a. j8 C/ ]- O' K' f
        }
; d+ d2 X: Q# ~/ B( p8 k        UARTPuts("\r\n",-1);/ _! t+ {( Y0 Z: N( F7 V; I
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);0 x" @" H7 n) c
        UARTPuts("------------------------------------------------------------\r\n", -1);. M' L7 G  M% i  c9 R
1 K: }4 D. y. m" Y) Q
        // 主循环
1 z. T6 t2 Y1 F5 l        for(;;)
& s8 t( a5 |, N3 Q4 P2 }        {/ d, n' }7 v  u

% H# a; L2 m- z/ A        }
9 |- u, I# E' r}1 P3 O9 }6 P  n8 k
  F. X( X4 v# T! W) P
/****************************************************************************/
8 r; K) z2 o' @- L: y7 z8 ?/*                                                                          */
1 A2 F: v" a/ ?7 r+ Z/*              PSC 初始化                                                  */
: }* j/ K" a! t5 P/*                                                                          */
" T' [* F5 W* f! B- ~# t/ Q- U/****************************************************************************/1 N" t# v$ M4 q. q$ I
void PSCInit(void), f$ {8 p" N6 N+ C
{
  q" }/ b- a# @' h/ {8 ?' w. P        // 使能  EHRPWM 和 ECAP 模块
/ R! T- R$ K7 _% s7 K        // 对相应外设模块的使能也可以在 BootLoader 中完成7 I9 |3 J; x  ^, X2 U+ L
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);5 Q9 `, c0 _7 H1 {- m9 \
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);5 u, W7 Z+ G1 d6 k8 ~3 X  {
}& P4 ?2 I1 Q3 q( y8 \8 g
  ]+ \& w% O4 H! Z
/****************************************************************************/
) j/ ?& q0 ]- [+ ~0 D5 I/*                                                                          */
5 _# G9 {. s7 b' l2 G5 U" M/*              GPIO 管脚复用配置                                           */* T  ?% |1 K( O" `3 f
/*                                                                          */
, Y$ [! {+ c7 c# N/****************************************************************************/
6 V; o# x+ }; z& Y4 l; M6 Uvoid GPIOBankPinMuxSet(void)
  L( M0 C1 S9 b{
4 [0 l) q& ~/ H0 M8 {5 z, e# v$ c        EHRPWM1PinMuxSetup();& j) V4 H1 _2 n2 `
: b0 N% I8 t+ }  d. `- d% g
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
9 l0 t& C  F& a3 r! s        // 作为捕获功能时管脚方向为输入) D. I5 {# G1 k; W3 B* H/ P2 y. ^- n
        // 作为辅助脉宽调制时管脚方向为输出. y5 M3 O3 l' @: d* a2 I
    // ECAP2 / APWM29 }; d$ }" H2 W# V
        ECAPPinMuxSetup(2);
- i! X7 J6 G) ^- ~; V* P0 j% |" W2 }, c, _1 s' g6 p
        // ECAP2 / APWM2方向设置为输入
7 c' g0 H( R4 Y1 z" R* E* p        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
9 h3 Y6 t& T$ G4 M}
5 I5 t, x1 @5 g0 |6 C9 `. |: Y+ c$ k, B
/****************************************************************************/
- ]/ L( N) n& h; L- W: I/*                                                                          */
- c4 j2 y  l* k! O/ {: O/*              PWM 输出波形                                                */. ^, \1 T7 _1 q$ w* i
/*                                                                          */5 H( X2 B5 e* `* }
/****************************************************************************/- f: ?8 f- T( Z  V/ h; b) f% q* a* k
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)2 C+ O. d# n6 {, u* D; M; a
{/ n& j9 ^+ s3 H' p
    // 时间基准配置7 V/ ]: h6 ?2 x3 G' C  U* P
    // 时钟配置& a4 I; w6 g; W2 T1 I% `" v
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);( K% r  e% \6 y& J0 p) a
' R/ v  M& t4 B' ]
    // 配置周期" s8 ^4 d! D" E# L# _9 @6 q  x+ g
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
, j: a7 e( P( b) t. J8 m& X& V! e                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);: W) \$ W$ ^7 T
- h( T0 W" a& R9 j/ [& s
    // 禁用输入同步信号7 b' F, X! {# {
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);: [5 n" u( \5 W, ^3 \* Z
9 M  L+ `9 ?9 }
    // 禁用输出同步信号
8 r3 W" P; A. V: x% Z, ]7 |( j    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);% [6 Z# e3 k+ `2 j

3 I8 E& F  {6 @+ L: ^( h' X    // 仿真(DEBUG)模式行为配置
5 y# J5 l% @( [) o    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);( W! s/ }; H! U8 h- @8 Q
" K0 f0 A3 v# e
    // 配置计数比较器子模块# r! {/ V  J0 s) q4 j' H
    // 加载比较器 A 值
; j0 O% C' o3 R4 [    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,4 [% a; z$ x. @3 ^& V
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);; _) [" e0 u+ U: I9 r% t; i7 H

( ]. p; F4 V: k+ l6 S4 `5 t    // 加载比较器 B 值6 c6 B9 P. h: q/ t$ c" b. L# P7 w8 e* n9 P
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,1 q, L4 f/ Q% L' d4 I
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
* P5 U( T3 B0 T4 i0 d
1 f* D, E  d# ^. M    // 功能限定配置(输出引脚触发方式设定)
" l& E" r( f9 t5 ?    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
( m' u# S! @1 G4 J4 i4 g    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
0 M) o( l* ?# T2 Z8 K! k. k                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
1 r4 w+ x4 G) }7 e; d                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
7 ^; p. h0 @( l# z# N8 v
6 Y# k" p" }$ F, H    // 禁用(旁路,信号直接输出到斩波子模块)死区模块/ \) c* A6 ?  \+ _
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
2 O, ?! k4 U$ H) s" ]  M) z. D) L
    // 禁用斩波子模块
* S# S' v6 l; T; D( ^$ f    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
0 Q, z+ {6 M; z1 [# ?3 W/ G5 l
3 E7 q0 y: }- R    // 禁用错误控制事件
$ U% y4 P, q$ B% k% I0 i' c: k    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
' A6 c, o( T$ U' z, F/ V0 d    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);7 e2 m% W! i" g* ~) d* ]' Y

9 X; H2 k+ T2 G- Y    // 事件触发配置) S, g; z6 d5 R; O& I* ~/ q- R
    // 每三次事件发生产生中断$ k0 F) a8 f  n
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);3 B; Q9 x4 x" w* ^
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件% [/ i3 S3 i0 w9 s+ w9 a- e7 M
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);. }0 G& Z3 k5 o1 b9 V' Z% |7 j1 Y
    // 使能中断
' v! X3 K6 A" A    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
( P( k5 c- }% d5 C9 Z5 \
3 g4 Y  y0 x  s- g( D( ~    // 禁用高精度子模块3 s" z& u6 H0 j$ D
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
  {5 G; V. l1 P# n* N. G) `& Q* J2 A0 D. _  @4 R( L
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
6 `2 B) {) w; @7 @8 \" I}5 ]" s1 t$ ^( ~+ z- \

/ w! ^7 j; G1 E6 z* |void ChopperWaveform(void)2 _+ C2 E6 ]6 d( @$ n
{/ m+ y( p! P: ~% d1 L4 f% O
    // 50% 占空比
% y8 r* [+ j4 `/ q    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
' e( {- `" T. L% V7 ^" s- J    // 4 分频4 n3 A% Q/ R& I  D
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);! c% s7 i% @3 b3 R
    // 单个脉冲宽度) \8 C1 X* `5 G; f; v
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
6 f( Z5 _2 m' y* o/ B6 D4 U    // 使能斩波子模块+ ?2 L- f3 U# k
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);# s  r9 k5 _% l5 z+ l
}$ |/ D9 t" f# O% n! b
+ K7 g& z9 u  P6 \1 ^4 w; P3 F9 p
/****************************************************************************/
/ u( f# t& m0 n6 H/*                                                                          */( D  }7 B0 R8 A0 h
/*              PWM 中断初始化                                              */
9 q2 v* K6 K3 q2 h/ ?/*                                                                          */& n3 J8 z: z* V" U2 s2 z7 L
/****************************************************************************/
: k" K. {) G2 m+ T( Lvoid PWMInterruptInit(void)3 }, ^! w9 `! h' F' o
{
* d+ L9 z' \5 ?2 c4 s* c        // 注册中断服务函数
# x8 a* n  r* E; j1 K* o        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);; E: B- n7 f& b% N+ w
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
* V* Z8 G. c+ W/ P5 l! R8 ?+ a, ~$ _, A$ }  {
        // 映射中断
( f- z5 L8 ]3 \9 f; e7 n        IntChannelSet(SYS_INT_EHRPWM1, 2);
! g2 I" X1 j- J' T0 ]8 `        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);5 P2 }+ _( j6 x$ u5 I

2 N' g) F+ V! q5 B        // 使能中断1 L! h& x# Z8 R+ C4 x- q; v
        IntSystemEnable(SYS_INT_EHRPWM1);) x* f+ Z$ L( p) R
        IntSystemEnable(SYS_INT_EHRPWM1TZ);% `  U2 \5 }5 u0 Y$ J. z) b; r
}. ?& T( A9 ^& _3 J7 t- b& @
; `1 f6 A7 Q3 i  j
/****************************************************************************/, {* Y5 Z6 D) L
/*                                                                          */* h* {# Y+ t0 t7 C2 P
/*              ARM 中断初始化                                              */: r& {+ K0 r" C. n$ P
/*                                                                          */* _- Q) Y3 @7 P' F. t* l; k
/****************************************************************************/- G5 {6 Y$ N/ ?6 t3 d9 H* K
void InterruptInit(void)
, O# R, m; o/ J: l{
) O! V0 W" |7 `% M3 {3 x        // 初始化 ARM 中断控制器
$ J8 y0 N! }/ e+ y. E6 A4 Y5 J        IntAINTCInit();
2 Q- L3 z" ^. T* y8 \2 W$ h/ _3 A& Q- v  Q3 \7 _1 G7 e
        // 使能 IRQ(CPSR)! I* T0 @( B3 |# Z$ {( f! q1 n
        IntMasterIRQEnable();2 W5 T- `3 [, Q  }( }% n
" D9 s0 w  ]2 U) B/ p7 e, E
        // 使能中断(AINTC GER)
- o: e/ v5 v( ^% t9 N        IntGlobalEnable();* P; \2 d$ @! _) i

# D; k) R. Z& ^7 j, {        // 使能中断(AINTC HIER)  G' E4 T6 v3 x7 A4 R+ b
        IntIRQEnable();6 F4 W5 A, X* f6 Z9 F9 z
}/ L+ L+ J( Y1 X$ p

0 H  S* G: Y; ]) y# W
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/
: F0 ^' i: F; v2 p. D6 k: P; ^/*                                                                          */0 Y' C, u3 c$ c+ i1 b$ u9 |
/*              中断服务函数                                                */0 A: |% b- r4 B/ R
/*                                                                          */
' e8 w0 [% h0 j# ^/****************************************************************************/
  p1 X% D: u/ ^2 V6 Nvoid PWMEventIsr(void)2 F$ n, H8 L" m0 f
{
( P1 A0 r0 \* H        IntSystemStatusClear(SYS_INT_EHRPWM1);( R0 `, G; N+ [5 u& }) o6 N

% A$ L# k* G/ b  M' p5 U    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
  S) ^, c" c5 l) W% f}
) Y% h5 ^5 N3 O, {6 g7 L& `6 v
void PWMTZIsr(void)( {% q1 c* R# F
{
: v, n$ d2 U+ Z" o4 U; u) T* s. X- s        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);, j  \) J7 k- X; y/ t% ]* O
7 y& N/ w7 x$ v# Z$ u; @/ W- H
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);8 ?2 x3 K: O4 Z/ {2 q' u7 S! U
}8 ^4 A) o. V; }) _2 y

$ \  E; s4 X4 ?- _3 d( N% V/****************************************************************************/$ J8 B4 E' ?# g( ]+ d9 d
/*                                                                          */! K* U5 {% d( f* f! y2 i' _
/*              初始化捕获模块                                              */1 l) \6 \! a9 x* u) A! H7 K
/*                                                                          */9 \5 ~7 r  l+ T" F2 c+ L9 y8 A" B
/****************************************************************************/
  p  @! y* e9 G$ Fvoid ECAPInit(void)2 a0 ^1 C) @5 j% h' L( O
{& b& j, n; U8 S
        /*-----设置 ECCTL1-----*/
+ g' E* ?  E+ W4 F- m        // 使能CAP寄存器装载
/ N6 o# g) p, J/ x        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
' G+ g* X" ~8 R& Q        // 设置预分频值.
2 l' O5 U/ j2 {& h        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);# w: G+ j! i6 R, i8 s" X
        // 上升沿触发捕获事件( t% C0 H+ P( {+ ]" C$ H
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);# O* v1 U9 }, z" \" ]9 g. l  B
        // 输入捕获后重新装载计数器值.3 f* L/ z7 _3 i
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
+ W) m5 O6 N; i# y" Z, l
3 i8 B, K# s4 C        /*-----设置 ECCTL2-----*/
6 Q! R9 I: X7 K+ a        // 连续模式
- ?' A) j" }4 @# V' E/ U( H        ECAPContinousModeConfig(SOC_ECAP_2_REGS);4 b2 v( K8 y, h
        // ECAP计数器TSCTR持续计数
6 x9 b5 Q) g: |8 B7 _. V        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);7 x3 j+ y0 `# z4 [3 X4 P
        // 禁用同步输出和同步输入
  D% A/ ?8 f8 F& ?        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);- w. a4 p' \9 `! ]( c5 w
        // 配置 ECAP 2 为 CAPTURE 模式6 O" v0 q' ~  }
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);+ X7 f- @4 C; G" S

5 Z. f- ?% _# ]3 H0 [% x( U        // 使能中断
" L; v' Z, l# ]0 `. `6 T//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);( t* y8 }2 j) H& j
}
; d' P* i% {) Q7 R, ~, m$ Y. C0 }# q, |  b( y) t
/****************************************************************************/
1 N# w0 T# m0 c5 K- Z. B/*                                                                          */
: B5 E5 @, n; F4 N" z0 T+ R% {/*              取得捕获结果                                                */0 a1 B; c2 M2 _7 G) \
/*                                                                          */
+ l, l7 x" i( k2 u! y* [/****************************************************************************/
; u' w# v0 |( \4 z% {unsigned int ECAPRead(void)) n. C3 o+ \4 U: D/ w) G
{
# E$ I2 N& @* g1 U3 m        unsigned int capvalue;) w; G9 o* a# s5 W1 H
        unsigned long frequency;1 W# w. g- @, [; E$ j# e

* f# M% s: G9 N) Y        // Event1 中断标志
0 G# h7 n" A' S  r! l8 i        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
- y& {" r( {9 ?% Z& ^        {9 a$ M0 ]9 Y6 R7 o+ W; |' f6 H
                // 取得捕获计数/ R7 H' [6 L6 A/ L+ Q# ?" o
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);9 Z6 C. I8 [3 r; L1 A2 ?8 f; T
                capvalue = ECAPResult.cap1;5 w, F3 e% o( |. ?( e$ W
, d  J' a- Q7 T4 z) M9 M5 B2 v- G
                // CAPTRUE 模块 228M 时钟主频
1 o$ q* f- d4 H; t6 r                frequency  =  228000000/capvalue;" ~" F0 l0 K4 M3 J* _* q0 V
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);3 p: X2 T$ Y& c1 E6 Z
% B( ~) f" a- \/ S! H7 A
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
% r+ ]$ @  _% V! Q1 W/ J* w//                IntEventClear(SYS_INT_ECAP2);
# o: w, Q# L3 l1 o1 P1 @        }
" I. \# l* F$ Q4 U- m& n) V        return frequency;
9 I% Q' _: a( I0 i) O3 ]% o! O" n9 q}+ f8 {: e: X& Y: _/ C

作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
7 ], |/ l1 h% A( v- w! @2 U" q0 {[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