嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
% M9 h) h! \% R& q
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************// d2 Q) ~6 [. V: c& ], N" O
/*                                                                          */
6 y4 s; q, b( V3 T/*              宏定义                                                      */
9 e2 y1 b3 y3 ]  c: w/ _* t/*                                                                          */' S* E% P6 f! L& M: [
/****************************************************************************/
+ I8 m+ c) f, A, R* G* b// 软件断点; U/ }2 J/ L! |: |
#define SW_BREAKPOINT     asm(" SWBP 0 ");5 I- n) T( z- ~* O4 x/ J
+ w: J+ M8 t6 g7 B' G
// 时钟分频
& V3 y" w" p2 L% H#define CLOCK_DIV_VAL     228
+ K" x* K5 f  Z' D7 Y2 Z; \9 l0 K; j" u2 W
/****************************************************************************/0 q+ X: k) Y( D6 @
/*                                                                          */
: F% a! a8 s. K4 ?/*              全局变量                                                    */3 G, o7 f& J/ m0 u, i
/*                                                                          */0 v' M1 Y' X1 J$ I: y' S
/****************************************************************************/
0 Z! P: e$ r, R7 _  X' c/ b+ R$ OECAPCONTEXT ECAPResult;- B' Y7 Q* _* I7 X& u7 x9 A" N7 x
% T: ^% k# v3 x+ ^
/****************************************************************************/
. D0 ]1 t5 D+ g/*                                                                          */
! m2 R( z1 j7 U" C/*              函数声明                                                    */
# y8 @. R7 c$ ?  Z  P/*                                                                          */0 h7 G' B& A7 I
/****************************************************************************/* m* ~& d& L3 q6 t( R$ p
// 外设使能配置" N1 [7 G+ a5 e6 S, ^+ B
void PSCInit(void);
8 e/ W( h4 @# W. }! N* T( i3 S8 N0 \2 b1 K4 ^
// GPIO 管脚复用配置
( p- o- z7 ~# i  a7 \9 Lvoid GPIOBankPinMuxSet();. q' r: [5 H3 s# G

5 n. F) K+ C" G" K; o  |; S// 产生波形
9 y, c& @2 X1 X6 W" Rvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
  ?0 L2 d( f' g7 J* N5 Gvoid ChopperWaveform(void);5 r! o9 a) R) a1 [4 Y) N1 Y- C
5 y8 x! I' J# ^
// ECAP初始化和读函数$ T$ }* W! ~% A9 g" D' e1 w0 R/ c1 e
void ECAPInit(void);$ x: y2 O9 b2 U& h9 e) Q+ `6 d
unsigned int ECAPRead(void);
; K8 i9 X: W9 ?3 c. A) V% `7 Z/ v7 G. v6 t
//ARM 中断初始化% F- r- r- i6 t/ f6 F- O
void InterruptInit(void);
3 \) @  q2 T3 k+ s5 f2 J6 L  b% g; I/ s7 w6 X3 I  c
// PWM 中断初始化* q6 E3 ^9 O; Q
void PWMInterruptInit(void);
2 l1 Y- z: `! D+ {4 C- m; x// 中断服务函数3 ?% a) V, y* i& P6 h) C
// PWM 事件
  p5 Z2 a4 x( J8 n$ G9 Q: ~void PWMEventIsr(void);
6 g* U! K! R) W$ J+ r% \// PWM 错误控制事件, j+ P& c7 U# C: R/ M
void PWMTZIsr(void);1 N  d0 Z/ U9 {. t! v2 p

8 T' S4 I0 C0 \5 J) i& h/ G/****************************************************************************/
/ K4 j, }8 K( k! G! e3 L" |; I/*                                                                          */& f3 h6 {) _% g1 _6 d) ?$ K1 m
/*              主函数                                                      */
7 U$ Y2 s# d1 a& d% O7 B: ?- s* ]# |/*                                                                          */
" j+ b9 \' m/ d) p3 Y/****************************************************************************/" }  ?. e8 h6 ?& |9 {1 X
int main(void)* |& Q- i$ f' J$ Y# F5 x
{
0 g% _2 U- Q2 ^        // 外设使能配置
  P7 |& Y, h, w1 f0 Z4 i        PSCInit();
9 o1 f6 ^3 x' ]9 T* P! P2 a7 H1 v) n( D: h5 v  ~+ X6 T$ D) t9 e1 j
        // 初始化串口终端 使用串口2
7 t9 _+ d3 D/ w5 y2 j: p, h        UARTStdioInit();
% i2 ^. Z# E  i8 H0 ]" C* j% c       
& M- E$ e( w3 a0 ?/ e. n        // GPIO 管脚复用配置
  Y# }) g: M% [        GPIOBankPinMuxSet();0 A- f3 [4 a, f& C7 ~, ?1 y/ Z
; x( n; {3 m* _  ~; j7 Z
        // ARM 中断初始化
) a: |' ?2 x# I+ e; E) N, y        InterruptInit();0 E# k/ ?* F9 z- M
9 E. J5 z0 O! X2 f# a% F
        // PWM 中断初始化, |0 m$ w; G( _5 A# ?
        PWMInterruptInit();4 W& N% [2 E: ~7 ?5 T

  W% c3 g; F8 y# [8 d2 e        unsigned char i;
4 H' ]- o# R; K, e" u5 J/ O        unsigned int j;3 ]! ?, Q: u+ ^% w3 V6 P

$ {3 v( c% c9 L/ t( }# ^        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
+ U1 k  D/ D% m8 D; B8 w        UARTPuts("------------------------------------------------------------\r\n", -1);
0 ~+ r' k; w7 `% E5 F- r# `        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
! R$ D1 ]4 `% J, F2 i6 T        // 产生波形; {9 @7 y0 O7 k. f
        PWM1ABasic(25000,50);# k. l1 u3 P0 N, z: \- H& O

% h+ W% h' O9 S; w- ?        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
8 z$ p8 K' `+ T1 `! J$ _4 V        UARTPuts("------------------------------------------------------------\r\n", -1);
# x, @4 W5 ~% N- b9 P
7 {$ C3 ]" ~' {
# Q5 {6 ^2 k/ R4 o- S, r
; H3 C1 x5 H" v, V; w2 I, ~        UARTPuts("------------------------------------------------------------\r\n", -1);
) R/ l5 ?/ P0 A& j5 P2 {        UARTPuts("                    C6748 ECAP Test\r\n", -1);
  o0 n3 g, I7 X( m) i. j( a+ u        // ECAP 捕获初始化) J0 O* j6 C2 i9 G- D  u7 F
        ECAPInit();4 K3 P" N8 u+ I) k
        UARTPuts("Initialize ECAP.......\r\n",-1);0 a( ?" J* t, {( C8 j3 G
        for(i=0;i<5;i++)
6 ^5 f. O1 {6 H* Q& x, a5 [8 Z        {
& Y) M$ B/ O9 a0 m                    for(j=0x00FFFFFF;j>0;j--);            // 延时+ P" k4 H& C9 f" o7 q2 s, t: U
                    ECAPRead();
+ Y& g' v/ ^, N* Z: C        }) r4 _( E3 V" Y0 }
        UARTPuts("\r\n",-1);5 \% E9 K- r% a5 K" |8 G
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);. V# W3 T7 m0 [+ I' D0 \
        UARTPuts("------------------------------------------------------------\r\n", -1);& d4 P* R4 ?0 C$ C

5 K* v' l" i5 \% |7 o0 X        // 主循环
  `3 j& W$ _& d0 L4 [& T4 \# f        for(;;)1 a* a" x& C4 l# @1 t( x4 o
        {
: M8 U, P6 G  M. Z, `1 t" Y$ _  ~/ V1 ?6 j
        }, _: y" ?+ R% B, v
}0 X/ r) P1 I; `0 w4 {* G1 R. D
0 Q& z, l5 Q! J
/****************************************************************************/
0 |% b8 U% n4 G1 ]& J4 |0 E/*                                                                          */
0 r5 c" I) d# _3 E+ M' h( t' B/*              PSC 初始化                                                  */
' `4 _. a) j4 Y8 e& y' d( K0 n/*                                                                          */  @) V6 L5 d' \( I) d4 A$ x
/****************************************************************************/8 y8 Z0 G1 |+ K; ~* m( m
void PSCInit(void)
4 \- J$ E% L3 A  S  y{
3 a0 m# E9 _  `# ^( D$ ?  ^        // 使能  EHRPWM 和 ECAP 模块% y/ }+ v( K( R! V
        // 对相应外设模块的使能也可以在 BootLoader 中完成
" p( j0 v8 y5 J2 r    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);7 d+ b4 [0 t+ P# L* V
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
+ G6 B7 _: @7 t! j- j6 L! `}
  e+ }# b2 t  ~
, ?& b- {. D  {% {& T8 A# }1 y/****************************************************************************/
6 j. }7 l5 \2 T/*                                                                          */& v! ]* E4 u0 I$ I
/*              GPIO 管脚复用配置                                           */2 ]" m, V, e. K
/*                                                                          */
3 a; X5 ]. v3 {9 R% T/****************************************************************************/3 z+ i5 k/ d7 c/ E3 S) Z
void GPIOBankPinMuxSet(void)0 K' l5 Y9 r+ J4 k) x
{
. z% C, Y, O- k0 G3 P        EHRPWM1PinMuxSetup();
. g& o, K2 U1 `" ?! s: @
/ E% |9 B7 s: ~6 }5 W* k        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
1 j) Q+ t$ [! T9 B/ D* Y3 t        // 作为捕获功能时管脚方向为输入
' x9 s9 o* Z8 R. s7 {' d        // 作为辅助脉宽调制时管脚方向为输出$ s; n0 L, K5 j' V0 j
    // ECAP2 / APWM2
6 J. V* {% v9 P1 j9 f7 I* W# ^( V        ECAPPinMuxSetup(2);  W5 ?* `0 H  C

) x9 {4 \: R/ ~  v        // ECAP2 / APWM2方向设置为输入
# n9 G4 T7 a5 x, Q" T! o        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]- M5 C! q0 v  I' l( p! S
}
; s: h1 z* |; X+ A
* r2 r3 z# |1 }2 I, N; s* w6 A/****************************************************************************/
1 |2 x# B- [5 b$ w/*                                                                          */
: Z  ^3 e* v. L2 ?* c/*              PWM 输出波形                                                */
0 e! N' g4 S5 B0 W! n/*                                                                          */0 h6 O. D' m& d. ^
/****************************************************************************/
  J; X# c( d. z% Z+ Ovoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)' }% X- @, a9 H. d% p' ?7 X
{
7 B* n4 o! M3 }2 q: J5 E    // 时间基准配置: W7 j6 i0 M$ F) u1 y# j
    // 时钟配置
  ~3 J( R3 ?/ s, O: w. s; t& E    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
( g5 o* J) n, |. P
) U5 K4 Y8 r7 g9 }9 V/ i8 F) R# {% G    // 配置周期
; D9 |, k8 {) d; w    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,+ p$ S$ s! i' d' H- i
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
, t- J6 a5 d# a0 Y, B' M9 o, I' q2 D8 b# |7 k8 T& R
    // 禁用输入同步信号* k& B( @) K1 {  ]: D4 w! X0 n* F
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
) S  r, |5 x! p0 k
7 v, R8 ~, ~+ p* |( d    // 禁用输出同步信号
' F! `& M; T/ D0 D1 Z. g2 @    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);$ A! k; v, R' Y8 [0 h* _& P
5 x# a8 z( Z; `0 P) @5 I4 K) P
    // 仿真(DEBUG)模式行为配置
8 @- {: A* t6 H" `! U& Q1 ^+ g5 _    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);9 u, d; @4 @* }" g$ `5 }
% R4 ~2 A2 O' T
    // 配置计数比较器子模块+ G( Y8 {( A( j, I  r) z7 X0 a8 w
    // 加载比较器 A 值/ L  U: P# e2 c0 D6 P
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,' n& \6 h% G3 P8 E+ N
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
7 J( @6 f8 a$ \8 |6 o% @. i! |. ~2 Z
    // 加载比较器 B 值
+ f0 `1 R. E" X, q: {4 L    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
/ M0 t* }/ _" s2 _7 A+ l                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
7 M3 L& M* {! |4 i4 ^$ A+ m6 I2 v- j  H/ {
    // 功能限定配置(输出引脚触发方式设定)# E  W7 C9 @, z: Y- x9 \
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
! f% O0 O; d# X0 p5 `    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
8 k* `5 Z4 J+ l5 ?                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
' {. A" b8 W! q; P, S  a                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);/ F# y+ z4 [- p1 E$ @
- V0 J+ c+ E9 F8 {  V% `) v7 Q
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
' X. _; I! d1 Y7 _+ R$ n    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
+ t2 g5 \; R5 J
$ M, c+ }0 t; t- u2 M2 M4 o% i$ c    // 禁用斩波子模块
) j+ e8 l8 M- _, U3 g    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);, x# m. V- l( W! ]) `" Q+ D; @# B
- C; ?8 U8 P4 ]; `; Q* I
    // 禁用错误控制事件
9 }6 w. F% ?5 ?2 m/ W    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);3 ^; D" P7 Y* k2 D) S
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
; W/ U( A2 A7 r8 \% O5 H& J" y
5 v3 @1 b. T5 Q7 M+ V+ Y    // 事件触发配置& e# R2 U; I7 M2 d# H) |
    // 每三次事件发生产生中断: s/ y6 Q8 p& ^
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
  t; t. I$ h- i1 k  q    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件, |9 s. z. _# ~0 c' O8 J
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);" {6 g# V9 h( _6 i1 ?
    // 使能中断) d  T. }! T/ X3 p
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);) c  J8 H; R4 p  L+ @: u

3 w4 H% z* {/ [3 c: t6 `# _    // 禁用高精度子模块
+ J( \; w1 f* N( z9 D3 ^6 V    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);. R6 _# ?$ c% u* _

1 C" k& P& a; \% z$ ~4 U    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
; W0 {) T7 Q( O! s& ]}
) t+ d& k$ L. \6 s; U
) l/ D) M& |, X4 x& c) l( Uvoid ChopperWaveform(void)
5 m7 t! r, x' d{4 W9 z( m) n" g6 Z+ V2 w' i* J% W
    // 50% 占空比
4 D& J5 H: Q, i! `0 \    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
* o% X* z" X' U" u: v* r    // 4 分频
) B3 ?2 H- x( E: i6 N    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);# u  p$ P3 Z: s2 f
    // 单个脉冲宽度1 p* @3 a. e" q9 b7 s1 I; D; [
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
! Y$ z9 c0 n2 Q* T& {, d- n    // 使能斩波子模块3 {5 |) i* |8 r) x1 ^2 W
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);" C, p- G; ?6 E1 l  N
}
4 w$ Q6 `# ^5 v9 b4 O6 h% y1 }8 m, W6 r" S+ X
/****************************************************************************/" ^& C2 \! r& ^; s
/*                                                                          */
, D# v1 C6 w1 r6 F& K$ B/*              PWM 中断初始化                                              */9 r; T/ _8 F. S# d" r1 v
/*                                                                          */$ s/ p- h! V$ t+ M  f; R& Z5 e6 j: D
/****************************************************************************/- W( H! \' ^' ~" {+ [; x. M- O
void PWMInterruptInit(void)
4 q  R4 E# P1 E{8 B; \7 K% X2 H& F$ l0 ?1 l9 O
        // 注册中断服务函数
5 _* w8 G: f  B1 Y3 d( R        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
2 o4 e5 @- [9 @! a4 |& K6 {        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
/ e9 U! C& Z5 H" a9 X* y: O; k) h) A7 n  Z8 f; ^' L
        // 映射中断, \* @' I4 Y: `2 T$ M1 ^/ ]
        IntChannelSet(SYS_INT_EHRPWM1, 2);2 r1 w# X7 P# H( l2 j2 K/ N
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
1 r8 m# d$ d: m7 ]
- t  B2 d# t( Q. r6 j        // 使能中断& e' u/ l0 U' `/ M3 J0 Z5 `% C
        IntSystemEnable(SYS_INT_EHRPWM1);
- `5 f3 U  ^9 g; D! a( x0 G        IntSystemEnable(SYS_INT_EHRPWM1TZ);
* [1 Q- A4 r6 m}
. ~2 r3 W( J% n4 q3 G& o. W( E7 Z2 x- Z6 n3 ?( z6 }3 ~! {! o% ]* C
/****************************************************************************/
$ h" E! x" ?& G9 h/*                                                                          */+ Z; i7 L5 @. t3 S# k5 X. x: f
/*              ARM 中断初始化                                              */( Z9 J9 n9 `) B2 e! P# K
/*                                                                          */
! m& v1 x( }% S: w1 I8 j% p2 q, ^/****************************************************************************/
( h2 G0 o' Q) `: n  Nvoid InterruptInit(void)
" \1 o- [2 F2 O+ t{, _# f( |. N" C- K3 Z/ _4 @
        // 初始化 ARM 中断控制器
: U1 |& ~' z7 n& I0 f        IntAINTCInit();
, W" A  I: o" @* u+ {/ {* C4 S! P
        // 使能 IRQ(CPSR)( m( Q) v$ V3 k8 o
        IntMasterIRQEnable();
' Z) P) c9 K" Q5 t2 i, _, G  ]$ M2 r  B$ D9 Z# o" {! s
        // 使能中断(AINTC GER)
/ g2 W4 z; Z6 q+ j        IntGlobalEnable();
% P$ w* r7 O, `$ `9 d! e8 r3 }) U0 k& d3 d1 }2 ~' Q" L$ }, x3 G
        // 使能中断(AINTC HIER)8 ]5 U4 W, L$ m; z
        IntIRQEnable();
1 D1 q$ G' z# A3 n8 t}
6 H4 ?8 i0 A" m! G, }8 Z6 e
2 J# ^! d3 v' u# p6 Q0 b! \
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/2 m  q, L. M$ G: n6 w: ~
/*                                                                          */
2 C4 A* w! l- B, d& ~/*              中断服务函数                                                */
) q. S9 i' ^/ i5 p1 P/*                                                                          */% O! B, Z# h' b
/****************************************************************************/
' b6 U8 Y  c% D, |void PWMEventIsr(void)
7 ^$ z* ?! }. d' \; b{
  I# Q) e  z) @% b$ K$ h9 c        IntSystemStatusClear(SYS_INT_EHRPWM1);  V; u) n' ?0 p- Y

! _7 ^. M( X# d    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);' s9 h8 ^8 h0 j9 G
}
4 ], I2 z9 {8 T5 B% s
1 Z* |' q; M0 D* lvoid PWMTZIsr(void)
: M1 z8 u# L3 l7 O{$ G( X/ n0 {, T' S0 j3 Q; z
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);( W/ @* ^) L$ Q4 t; m. y

9 A6 Y& G' a$ }0 r4 }    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);" q. x, R6 {% ?! A
}2 V1 s( u; M& X9 g  O0 G7 f; K5 f
0 P' ^$ z) \8 H0 S) `
/****************************************************************************/
; N; j. V; k+ v0 T; e4 t2 E/*                                                                          */
5 q4 L' X" a7 ?* X% J# }0 Q/*              初始化捕获模块                                              */5 S5 z  j. q* W) \$ e0 G- T7 H
/*                                                                          */7 M( N, H4 ^6 ?/ M! |' O4 q% J0 j
/****************************************************************************/9 r) t  y; `, a; q  j$ Y$ W& `' w
void ECAPInit(void); _: F) G4 E4 o% }+ D. t2 }; P. T2 {* D
{) m* g0 W  G8 \. i* h2 B7 {
        /*-----设置 ECCTL1-----*/6 f8 @/ z5 B# o6 D$ F/ [
        // 使能CAP寄存器装载
6 S' a3 M: t+ @        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
% N: i* q; v. T& @4 z5 c6 O; _        // 设置预分频值.7 d2 c3 J! S3 O3 n! ]
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);- ?+ m4 d# K. r1 T( |% f% \
        // 上升沿触发捕获事件
% l3 Y* q1 b- ]( E2 I# T        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);, N/ K9 `8 |2 w
        // 输入捕获后重新装载计数器值.6 h1 v( W* z; k% T
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
5 r$ `; I- ]. d2 H. @+ {# A5 N* ^# [( y0 T
        /*-----设置 ECCTL2-----*/+ A+ V/ f5 \" b9 ?
        // 连续模式
2 N  }  @5 ^5 [0 u2 e% ]+ f        ECAPContinousModeConfig(SOC_ECAP_2_REGS);9 l4 \/ n: G! r% N% @! v$ U/ ~
        // ECAP计数器TSCTR持续计数" C3 `( \! s  [+ `
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
: B( _* G4 k  h) ~        // 禁用同步输出和同步输入
( W1 j: K2 B, e; W/ E9 ]% G9 c" W8 E        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
2 z' @$ T. L. y  V        // 配置 ECAP 2 为 CAPTURE 模式4 l7 y+ D) K3 N! ^5 n6 J0 C8 E
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
0 t4 U5 L) E3 h- V( B8 {& _9 O# J" t- j" Z( V! A$ S+ y! Q
        // 使能中断
" y: f) b# A6 i3 p//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
; v/ U8 G0 d$ D$ j- X4 G# V+ h}
. [6 Y( u5 k# E! Z5 y( j9 h& F& A* s' E& p: [+ m3 [! f% |
/****************************************************************************/
5 e0 b3 Y  K9 Z9 X/*                                                                          */9 S7 ^7 ^4 _( J
/*              取得捕获结果                                                */
. {6 G' U7 O& d' b! ^0 _/*                                                                          */
  X) n' [* w1 p5 y8 b6 [+ L/****************************************************************************/1 i3 s( U# O( e1 \
unsigned int ECAPRead(void); y' n1 y$ c7 V
{6 h1 r( [! k: J: E
        unsigned int capvalue;: `; M) O6 I! G6 o
        unsigned long frequency;
# @  I. U. D+ n8 {( @4 C9 Y: x/ y1 R$ m, _
        // Event1 中断标志7 e; `: g5 P3 P2 G) d! ^& D6 V+ r5 _$ h
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
  ~' G9 P) |2 D& J+ s. e" C1 Y        {
8 o, d3 n; O1 G: n/ r8 h( G                // 取得捕获计数/ V+ x- k! Z8 f1 m
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
4 J7 @1 r' S) `6 y                capvalue = ECAPResult.cap1;% Q; w1 M2 J: N, Z/ Q/ g
3 }) q1 h0 ^& d) O0 V8 w" S+ r% P( c
                // CAPTRUE 模块 228M 时钟主频* A: f( Q6 P1 g. h
                frequency  =  228000000/capvalue;. X$ [' c' |3 s* Q2 N1 G9 h
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);3 u2 p3 O7 d  W+ {+ l

0 B- A+ l' |5 ]2 c: Y- U                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);+ p- o6 L4 f* b8 [) B4 I2 e1 [' m7 J! `( i
//                IntEventClear(SYS_INT_ECAP2);
2 X* m  T4 y  B2 O        }! q: c$ j7 b7 y" r
        return frequency;8 P( v3 U$ N: z
}
: g  X1 e- ~: E7 `3 B) ]% Z# E
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
: }/ e1 m3 `: h0 b+ q  ][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