嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
" ^7 o4 N1 K/ I0 h
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
% b& }) V  C; H' t, I" \8 N6 v/*                                                                          */4 F, t0 |% I+ u  i2 v$ Z
/*              宏定义                                                      */( @( T' ^0 F: ?4 f6 f7 a4 t) }
/*                                                                          */5 e9 Q' m* Y- @, {8 m% x
/****************************************************************************/3 M9 n! I7 S& I* v5 G- K2 X! H$ m
// 软件断点/ N0 A4 Y6 I' q& A& S$ _2 [8 |" T8 i
#define SW_BREAKPOINT     asm(" SWBP 0 ");1 w  o; a8 k! N" A1 Y
- B% j( b, t& v: g2 P
// 时钟分频% v6 @4 j/ c3 P  R
#define CLOCK_DIV_VAL     228
& l9 z0 J% ?. `; P, o* m/ S) k
  y$ A; m# q# w- k& r, V/****************************************************************************/
! y  b/ w( m# {" g. O/*                                                                          */
, i' H) r* o/ V# e& B5 k/*              全局变量                                                    */7 K: h& D4 Y" `) q9 t# b5 g
/*                                                                          */$ \0 g( r8 d  I" V2 V7 }: ?% ?6 K
/****************************************************************************/
* |: z0 T3 P# w  oECAPCONTEXT ECAPResult;
; x6 Q( u/ i: x' N  y" k! h" I$ `3 {$ G, J
/****************************************************************************/( c( R' N9 W0 B! u5 G' G( j8 Z
/*                                                                          */
* |0 E% m+ J) e  _/*              函数声明                                                    */! r3 A. W0 U/ g5 [$ j3 @- j' N
/*                                                                          */+ O& c2 A9 {2 F0 P: f0 Y) _" j
/****************************************************************************/7 y3 ]  C( t5 ?, i9 O) n! d
// 外设使能配置5 y) p- w1 S. l0 ]# p, a  M
void PSCInit(void);
% T: K# r( ?9 ?6 |% E' `' y- _6 `* e! Z$ t1 g4 Q7 {$ r! M2 S# y4 y0 v; m
// GPIO 管脚复用配置
2 R8 w/ o, c3 bvoid GPIOBankPinMuxSet();
& N7 g8 d- ]9 z4 N) @% q) |2 I; L' y5 A9 u3 j6 c8 o, `3 }- v
// 产生波形3 `% P. a" ^+ R7 X9 e8 X
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
2 p1 D; g" E& M! |' b" \void ChopperWaveform(void);
4 I& Q0 N$ W) H4 u, S3 m* a9 m5 Z. S6 |
// ECAP初始化和读函数, C6 m; X2 _) V+ L
void ECAPInit(void);; e& m0 D, S9 j! ^9 `5 @* o
unsigned int ECAPRead(void);$ s/ ^& R* r! ]! c4 b2 m: q

7 Y4 j3 o  J6 m/ S1 p% A( C; U//ARM 中断初始化6 W2 s  F# `% W0 ]
void InterruptInit(void);
# Q, U8 B* w: H# a: P; U8 G! i
& G  |" |- B: [9 O% s3 {// PWM 中断初始化/ ~8 A& q4 A4 z- h4 t! _7 t0 r
void PWMInterruptInit(void);& w3 `! \  F" X* Z1 t  v2 D- e4 K
// 中断服务函数) o3 Y3 m# |( q8 L" x" a- c4 [$ U: M
// PWM 事件1 ^% @& B9 Z! w$ V# K1 U
void PWMEventIsr(void);1 T  N$ d4 h$ _6 ~0 [  }0 i1 C
// PWM 错误控制事件
% h% F4 Z2 D/ H$ C9 @void PWMTZIsr(void);) [/ o: t' {4 N! X
0 y' ~- R0 P6 U: |9 v* w- W
/****************************************************************************/9 g' o. _( U0 n# e( p: @
/*                                                                          */
1 D. K& W$ R& R1 d& H/*              主函数                                                      */
4 R" G* I/ J6 V* P( V/*                                                                          */
# C5 }' @" B2 T( }/****************************************************************************/
: {0 z, `& W0 u6 y" `7 @# t5 Sint main(void)
8 k$ N8 S3 ~4 k& ^1 D{
0 \& [+ k# b% w' Y; n4 ]' s        // 外设使能配置
3 V0 Z+ g: _% K) ?+ N* k3 |        PSCInit();. l/ o2 F9 h# h$ u2 V' T
5 {0 U" \4 @4 X7 z
        // 初始化串口终端 使用串口2
  M+ G+ Y* m# `$ p/ u0 f        UARTStdioInit();
/ p) m) |8 b4 @: x" ~        5 P1 A' C: P- W$ O5 p
        // GPIO 管脚复用配置! M$ \* N9 q+ \
        GPIOBankPinMuxSet();
8 U6 n9 _/ s5 T2 Q9 Y3 n1 K+ g  j, o9 X* D) h  h( Z& u
        // ARM 中断初始化8 @8 S& Y* B+ `, B% i* S0 S
        InterruptInit();6 W! {9 i  B/ N. [
* K9 r0 U% @" G8 n. C
        // PWM 中断初始化
, [; H1 T+ e& A2 w        PWMInterruptInit();  c) k! B3 e; U. [4 ?/ B2 ^
' [/ B2 \8 L2 i! s: M
        unsigned char i;
& G; a  a: V2 N1 `        unsigned int j;" ]% R( N0 y( Z$ l  @% U+ T
* S  R8 Y$ ~- S: D
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
$ y8 l. X: {" X! k/ L! t2 T        UARTPuts("------------------------------------------------------------\r\n", -1);
' }8 B; Z- }6 T        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
/ G# c9 a) A: m3 ^" T4 l        // 产生波形, V% N$ x  y+ N
        PWM1ABasic(25000,50);
+ n! W4 [0 s! K$ X" N7 |$ I" R4 D' u) k; P4 L4 E7 ^# Z$ y
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);3 c5 Y$ L2 a( x
        UARTPuts("------------------------------------------------------------\r\n", -1);* _' N- L* I, f) y- z
/ |+ H# g0 [- [6 I4 T. e! c" B$ [

: S3 V0 W2 y, N( g
" {+ k$ P: O' o" R5 b/ Z9 q        UARTPuts("------------------------------------------------------------\r\n", -1);
. j+ {; b+ i4 z. |5 K# @/ _4 i9 j/ |        UARTPuts("                    C6748 ECAP Test\r\n", -1);
  P2 x# W  V- B" g- j8 p        // ECAP 捕获初始化
+ r/ {; W/ B( l: P  M        ECAPInit();! Y- v3 i  {" K5 r! |
        UARTPuts("Initialize ECAP.......\r\n",-1);8 r; _5 `: t8 N. D4 S! ^3 h" |' p, K
        for(i=0;i<5;i++)
9 }% a/ {" ?" |. \        {( H0 _7 e1 t- l& S- Z* `. l
                    for(j=0x00FFFFFF;j>0;j--);            // 延时
: }) k  w, E) t3 R                    ECAPRead();& R+ U( v3 M# W: p7 ?7 C+ A  Q
        }
4 g% A2 v6 J$ Q( N% x  T2 B        UARTPuts("\r\n",-1);
7 A: r/ r5 M/ p# a( w$ \        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);- g3 _) x1 [  y; B3 h) P* A9 K$ d
        UARTPuts("------------------------------------------------------------\r\n", -1);, k9 @* ~" L% h8 |. L# S9 h
- k0 _" _' I+ o0 ?  z0 n& Y1 Y! p
        // 主循环  ]" h+ k7 i4 P
        for(;;)
# U. z9 a2 P4 r' `        {, w* X: ?) S; @. o: F% \
$ D/ J% o" W4 O$ i; n9 @* Q$ q
        }% s! y2 t7 B/ ]# q( W
}- B( F# E& E+ t) ?( Y
! H( z: K9 z0 q
/****************************************************************************/
6 g, b7 l/ Z1 p- x/ B! y% I2 b/ `/*                                                                          */" k6 D4 h0 n) F- `
/*              PSC 初始化                                                  */
( G" ]3 G9 y9 `; o/*                                                                          */2 h# n- ^/ Z+ j/ w  R8 e  \( S
/****************************************************************************/, X+ i3 C3 h8 b4 n' c# n4 D3 }
void PSCInit(void)9 E- M4 \: _8 U$ P( y& W2 Q4 \1 C4 x
{
6 M' ?' a' N  x% t& s/ M( r: o1 S( Z# z8 X        // 使能  EHRPWM 和 ECAP 模块
. c. y$ O+ Y: t        // 对相应外设模块的使能也可以在 BootLoader 中完成
6 K& }5 {. ~+ h8 {) k    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
% O# p5 l  S" O8 y, H! x    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);6 C9 e7 [3 z, o) H- Q# B
}
( Q, ~$ m( l+ A0 v( B; t9 W
8 w" g" _+ W7 i; o( u( R/****************************************************************************/( q# {# p. M% r% {
/*                                                                          */
3 X$ `+ A1 x5 e  y. b7 C/*              GPIO 管脚复用配置                                           */
' h; r$ O$ L# C' \6 K  T3 U2 N/*                                                                          */5 m) {1 t& |" u9 C
/****************************************************************************/( n0 B- O0 e+ n3 O$ `. R
void GPIOBankPinMuxSet(void)
8 {; [. r" f& z& H# r. T! {{, T( {8 `6 k# I  B/ Z8 w' L
        EHRPWM1PinMuxSetup();% T! M* S1 Z( @0 ]9 h

" x9 \& E% @, g' j$ Q, ]        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
! H' s) l0 u. q2 a5 ?; m$ s        // 作为捕获功能时管脚方向为输入
! ~; Y" o( i: l; g        // 作为辅助脉宽调制时管脚方向为输出
! P$ D3 ?7 m) S8 n0 W    // ECAP2 / APWM2, ]! n% j* g! W) m
        ECAPPinMuxSetup(2);
# }$ i) w" _9 f5 E
' p3 s: j. i- o4 |' {6 m% E. n        // ECAP2 / APWM2方向设置为输入- K+ |. y: s8 F" N* @8 p; l
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]1 w, S1 T3 }) M/ o- j+ A! I  U
}) \- ^  O6 O8 C% _- h( U

  s: m& {- L0 l/****************************************************************************/( U0 u! D# Y8 z* V: `
/*                                                                          *// p1 v2 K' Y( X
/*              PWM 输出波形                                                */7 m2 ^; u# H: H% P
/*                                                                          */
7 {5 M/ z& ^: U/****************************************************************************/. C/ I+ l+ o7 s& i/ B$ n
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
. c" M- J0 r' E* R{
: L% z& I3 y% Z( \  A' g1 L    // 时间基准配置( q, Q, A5 C& e& z8 Q
    // 时钟配置
8 ^, `' R3 L: L( n    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);* d, f9 U3 j) [4 R5 g) S- V# k
8 G; t* |3 b  t, O. \
    // 配置周期
6 a5 s4 _7 b, a/ B" t    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,0 L$ u5 R+ p8 i
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
' d0 K3 `5 U, T% z4 [" _6 M& e: {3 t3 K0 ?
    // 禁用输入同步信号
. j' g5 k8 d9 T$ s) q    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
* }% \* x! ?4 o6 p$ q. {' z# {
9 j4 u# C% |/ X3 Q/ B; s( k5 w" a    // 禁用输出同步信号, d) s& i5 l: C" k! c2 f6 p
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
, @! Q2 w. F  k' U/ l3 E5 R: R% W& g. e0 M0 I' F- M
    // 仿真(DEBUG)模式行为配置8 v$ w! T4 r) H: k' U% J
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);! O" W$ l0 d7 f+ E/ _' M

% h$ B) r% o; z- I7 x    // 配置计数比较器子模块
- |  W; v# i, n% n+ Z! J* a# q" A    // 加载比较器 A 值9 J, n& H2 i* f
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
. O$ _  s$ T9 F7 s+ U% S6 Z                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);5 _9 w& d, [8 e& `; P6 R

; p4 W2 b" T) I/ N( D    // 加载比较器 B 值
/ p( g0 ~. I7 {! H- ~& p9 {1 S4 A3 J    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
9 f$ ?4 A4 E( f5 X& M6 c( t                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);; \/ n4 E# _& d% Y
  |/ S( |* n. k  P
    // 功能限定配置(输出引脚触发方式设定)
3 C+ {' H1 v# k1 ?5 {6 ~8 c    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
- e1 \0 W/ e" D9 k, m7 w    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
6 x0 ~* e! `7 D) c9 B                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,, Q# X$ K- Q0 u2 o0 \6 C  ~
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
5 G+ v0 P; G( X1 ]0 i; x  t
7 U, `" y6 ?' ]7 w# z+ U) o( M    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
7 a4 c$ }$ H. v2 P1 s: A    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);, \$ w* n2 P4 T: k5 k
' E3 [3 z9 q9 K6 [! ]
    // 禁用斩波子模块
' ]5 P. w$ p5 J4 H/ ?& J/ A    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);; V0 B7 {3 S0 |

* V' j0 N; o' ?1 k4 a3 E2 c* B7 E2 l    // 禁用错误控制事件- e! P; \3 r# x
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
$ t( E8 _* M& ]! S) r5 R+ W/ D4 }    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
& n- g; A1 T0 D! l2 M+ Y2 C. }% j" n& ]& U) \) a- Q- Y
    // 事件触发配置
9 p1 O) g. z9 `6 b; }1 U# B. L( i    // 每三次事件发生产生中断
1 J# k; b1 N! ^$ ^' }    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);% C' `' {3 J+ z" Q
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件, _+ h9 n7 J9 ~: ?& A/ |
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
8 `/ H5 _* x" D" x! V% P    // 使能中断
* ?1 `% R1 @. t, k( s    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);" B# ^  [# F0 v, q$ j

, v! X, c# e2 j' F) c: ]& C( U    // 禁用高精度子模块7 }. f: b9 ^' \& D: z) }, p2 G
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);- y4 _8 _6 u7 W, d

- X2 _& {2 V0 F0 u    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
* ^$ J% X9 E) ^/ v}
& s+ a) n' p& C
9 |* G+ K: M8 I8 uvoid ChopperWaveform(void)6 F' W  j$ Z7 W" Q
{1 z# C, t2 A, J7 [$ R* P
    // 50% 占空比
( O. @/ l/ z  w$ I, j* F    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);8 i) c: O8 o6 K- E
    // 4 分频4 b9 P. p4 j. s% ^/ |5 `
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
/ a8 {$ b2 n3 C( j    // 单个脉冲宽度( z% W, g, }9 j. t
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
0 e* ^! j3 u0 _    // 使能斩波子模块
! K* r+ Q* c$ T, {    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);# {. K0 o1 q7 K: ^
}
7 G1 a. i# }3 r8 t
2 t1 @% N' Z& R2 P/****************************************************************************/% s* x) [$ u/ f  r9 l/ k
/*                                                                          */: {0 I: L8 f2 g4 b- ?& R; y3 M- T
/*              PWM 中断初始化                                              */
1 U1 m$ l+ P( n8 Q' E/*                                                                          */* W- f2 Y" X  f: L' i
/****************************************************************************/
" O( c5 b( g5 o4 h6 H7 fvoid PWMInterruptInit(void)
& _/ C1 g( M% a- `6 @{
% O8 w3 R- X7 M: d7 |        // 注册中断服务函数1 e$ X6 S: G3 t) ~: ~* d
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);* W3 Z% O8 q. J1 ^8 v4 A
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
% Q2 k1 \0 J- v; C+ D
" o0 `. d  D# M) D" [5 }$ h        // 映射中断
( B5 R! f8 f9 e8 D        IntChannelSet(SYS_INT_EHRPWM1, 2);
8 h0 v6 f- f9 H- I        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
4 k; n2 t2 q; C
3 V# [  E) z' @  k+ P9 M8 `$ X8 J        // 使能中断
5 K1 L9 ?1 Q) j- A0 Q        IntSystemEnable(SYS_INT_EHRPWM1);! |' h- j& N2 V% n' i0 T1 B
        IntSystemEnable(SYS_INT_EHRPWM1TZ);
( v4 D4 L& m& a8 b2 ~}3 A0 i4 }/ _9 E  R! v
2 O# j- Z" l& Y% r5 |* c
/****************************************************************************/0 Y  O% ~+ E/ ]3 P* ?
/*                                                                          */; @: F7 `( A& ]3 m) \
/*              ARM 中断初始化                                              */6 c1 [  M6 m6 b( F" C
/*                                                                          */2 w) w  K0 Y8 y  Q5 h
/****************************************************************************/
0 F$ T, w& q& S. A# s- _void InterruptInit(void)4 Q* b1 S9 x- m% t
{
' d2 J) a5 ^. C) F. s        // 初始化 ARM 中断控制器
! c% Z5 X" ~9 s, x* x0 V0 o$ N        IntAINTCInit();' z) A( O( N( W4 [* |7 R; l4 a4 \

. l% n* d% z/ r        // 使能 IRQ(CPSR)
4 ~! p( |1 P  u+ J9 m7 ]        IntMasterIRQEnable();; u$ I1 I$ R5 b4 r( J

/ |7 m( ]( B  X; Q4 M& g        // 使能中断(AINTC GER)
- j- J, ~9 F4 p* m        IntGlobalEnable();6 h5 ], o$ Y/ v! _; R2 w
2 W+ v% K7 v  i, v: s2 t3 r0 c
        // 使能中断(AINTC HIER)* i$ t7 y, a3 }# ?  |- v. X- J
        IntIRQEnable();5 V" w3 k6 S- i5 k# I
}
5 z3 V3 {* C- m
# F$ i8 |* k& L  y7 \
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/; p  D2 l) p2 p7 K" b8 N
/*                                                                          */8 b) \( c" H: i) W8 H# v' g
/*              中断服务函数                                                */) i7 v/ v8 A6 D; Z2 b7 ^, H
/*                                                                          */
- s) X. H0 E. D: b* n% _/****************************************************************************/
* m  @4 y6 C; Kvoid PWMEventIsr(void)/ X3 W  }' {& n. n# A; W
{
3 M# w9 l  C) K8 J0 U; s1 f( y5 @        IntSystemStatusClear(SYS_INT_EHRPWM1);! {+ r+ H, L' U# i

- c$ {1 n; ]4 Q, L& l0 V0 J    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
7 f; j3 s: P& T}
2 S6 k9 G) u& x5 B3 }6 v. w8 w6 q( V& s' V* Y! W
void PWMTZIsr(void)2 f; p" H' T! S7 [
{
2 @. p( b( Z7 U5 H2 r        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);1 g: B, A& }) q/ |9 N

, y( ]4 m2 F4 k1 j0 C3 u4 Q+ }6 ~    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
6 e2 _2 B) |) K0 X% _7 b6 R# m/ V}* Y$ X; D- U8 g$ p, ?) I& E
  M8 I- z$ a7 K& D! m" S8 O
/****************************************************************************/
* F3 s" `  \2 x& l, u/*                                                                          */
: B0 r4 ~  o' t/*              初始化捕获模块                                              */
( i' X# K* g6 j6 t/*                                                                          */; a: q+ t9 U8 Q( c
/****************************************************************************/
; S& X  P! Y, \* u* [void ECAPInit(void)- ?) t1 P, [' m+ u: k) S
{( p7 \, Q! r! m( g. G  B; P
        /*-----设置 ECCTL1-----*/
$ k, D. ]) {2 a! n; R9 F        // 使能CAP寄存器装载0 k) x2 y% J, m: S  _- h& L
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
& ~1 e: e& l0 {# P        // 设置预分频值.
$ C1 R! }/ M4 [% O4 Y- f        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
% i* M& k- ~# p% n3 I+ C        // 上升沿触发捕获事件8 C* [: @8 b' z( O& T  R
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);2 G* C9 B( p, w, R- Q
        // 输入捕获后重新装载计数器值.( h+ b' T- P3 F
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
. s+ h; G# z& J' I) ~9 b2 e3 e- ^0 X; t# }6 A
        /*-----设置 ECCTL2-----*/. H5 O+ t( [1 K/ ]
        // 连续模式0 W  y( v( {$ d
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);7 y) `! f0 L5 {# y0 M/ ]
        // ECAP计数器TSCTR持续计数
& o( v* j& w& d( Y! V, W9 @6 x        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);: a0 u, q" s2 A' G+ ^- d1 H
        // 禁用同步输出和同步输入
: b6 [4 B& m# U/ o2 U( m& j% p! Y        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
. V* @2 v, a$ n# Q6 D. `+ K3 V        // 配置 ECAP 2 为 CAPTURE 模式
( }% V& Y: N2 D% g" D        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
0 U8 e1 Z7 d& k4 U8 S3 @$ _5 a# f2 s. t# |2 H- N* r- R
        // 使能中断' k& |% V& }- [7 t2 j- H. \! p5 r6 A
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);4 s% b& w, J$ l- `% w( |
}
0 N  I$ a0 `/ ?7 z+ S% L7 }7 }, L: s+ G+ J2 f
/****************************************************************************/# O* d+ T, K2 w+ u# O
/*                                                                          */
& Y+ U4 n; d/ v- F. ^. N; k/*              取得捕获结果                                                *// U0 K+ r5 N( F% o: c
/*                                                                          */
6 R$ Q8 D+ \  X2 U2 j' a/ H/****************************************************************************/9 n( t5 Z/ N; k  ^7 j# u5 n5 P
unsigned int ECAPRead(void)8 W6 G3 p# G" M) |/ h
{
% a- p! V" ]  x( V# v/ d4 [        unsigned int capvalue;/ N! U. p  O, Y4 P5 _; Y
        unsigned long frequency;
# v8 x$ J: I# \& |& ~. }+ G) x
, N! T! I& ^3 t, O3 C4 u; p6 _        // Event1 中断标志- Z( T) R* F- g+ j' x9 }# z
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))6 m4 C5 N" e+ h% s
        {
- a2 U, C' B& {- U2 k                // 取得捕获计数
% N$ o* L5 T0 y' g0 O8 z7 c                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
7 Q  E) s' \5 @1 b$ A" C/ i                capvalue = ECAPResult.cap1;# P& y* `% y' ]6 Y7 l
1 K" v* y9 I( u% O$ v  p! S3 R
                // CAPTRUE 模块 228M 时钟主频* E: L. Y: {6 v6 S5 M- Y5 T
                frequency  =  228000000/capvalue;
: R4 I- {1 [  s: ]1 O0 g                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
/ }* Z) J8 ]4 L4 v9 B8 a. k# @& `' L
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);4 i0 ?/ I1 l# u) T! p- G7 w
//                IntEventClear(SYS_INT_ECAP2);8 a8 z: v/ v4 b' v5 l1 R0 E/ O
        }! x; X7 t9 s3 Q. Y2 p" c
        return frequency;' s1 d- Y% H& l8 E
}
% s( o. ?7 q- _2 @* Y* |
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
$ P2 @3 F4 p+ s, G0 m0 [7 G[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