嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家7 a/ V7 Q+ J) t/ l! g& w! C2 u

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
8 H4 h0 h: k% v/*                                                                          */
' v2 h! ?# p' V; T9 E4 y) ^/*              宏定义                                                      */
, _0 E. k6 t2 Q" h/*                                                                          */! w5 V+ {" u& H; a
/****************************************************************************/
& `6 e. [% L4 \& R1 v// 软件断点
4 `% P4 L- H- M: A+ v" ]" f#define SW_BREAKPOINT     asm(" SWBP 0 ");% Y7 E& c: t: ?) F, x3 ^, \6 F) i0 ]
8 o4 h* r% s) a( A1 o/ a
// 时钟分频9 e/ F% x7 m8 R
#define CLOCK_DIV_VAL     228
5 A3 o/ _3 G- S7 V
. y) P4 B* q$ w7 y) X/****************************************************************************/
( ?/ z8 f; g1 h, _8 u7 |8 D/*                                                                          */8 Y$ [: E6 G! [: [* V& h" t% N
/*              全局变量                                                    */7 o1 S+ f! K4 Q8 Q' d9 Q" V( G' Z
/*                                                                          *// ~, M1 P* A3 V' C" ~- e
/****************************************************************************/
& F8 A7 K. U, ]9 v* NECAPCONTEXT ECAPResult;
9 j) q( ^" \2 v9 K  [8 U5 t9 j. \" s- d4 `! j
/****************************************************************************/
0 B( i8 N3 G& k7 L) T( j; @/*                                                                          */  a/ w; A+ R! X# t8 ]: @+ I3 P
/*              函数声明                                                    */
. _2 N0 l( X! @# R; |4 {/*                                                                          */. V. \7 a9 q7 ]" D6 U
/****************************************************************************/0 a6 \  b1 d# G& F6 c- U5 T
// 外设使能配置5 M3 P& [0 u. f9 `
void PSCInit(void);- T% t$ h- L4 h( {! C. p, f1 Q
4 d6 e: L; ]5 h3 E5 i3 Y
// GPIO 管脚复用配置
0 P5 X+ ^, U. Ivoid GPIOBankPinMuxSet();
: |- h6 Z& W+ R9 Q2 d& d* Y9 Y! J
: z0 ~2 V( n2 [, q2 o% J6 [+ ?// 产生波形) [& z6 C1 I: B; e' j
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
* i# V+ G4 }3 y) g+ Pvoid ChopperWaveform(void);
& ?$ m1 l) f5 v4 V# c9 I( e9 O  c0 g" L( [* N
// ECAP初始化和读函数4 f4 W1 j( f3 }6 M# {
void ECAPInit(void);% u+ n$ ?* n, K% g. m; [
unsigned int ECAPRead(void);
9 m* P# J" p- l0 }& d/ R& q& i/ w* `4 a
//ARM 中断初始化
/ {. @) z+ a" F, f3 ]$ m& w4 fvoid InterruptInit(void);! i- W& D: r: B" n" Y2 g5 T% C8 j' S
4 \- U0 p; i. \& v
// PWM 中断初始化' Z$ D- U  {( H7 C
void PWMInterruptInit(void);& x" g# s: N& a5 `/ _$ W3 P
// 中断服务函数: V% c: g* [0 Q" n0 F
// PWM 事件
2 z' {$ a) A, V( t" G, r7 evoid PWMEventIsr(void);
8 \, @! z2 O; c2 M6 M0 k) M* J// PWM 错误控制事件* s* y0 D0 w. S& m
void PWMTZIsr(void);
2 V" Z0 F7 ?+ K) w% P  J* W( |$ v8 N0 x9 b/ V: r
/****************************************************************************/9 ]1 A5 B% `, h' w' [
/*                                                                          */
7 i! `7 M9 ^! k( J* [/*              主函数                                                      */5 }: t4 G# f/ C
/*                                                                          */
  y: W' f9 p, ]3 \. j8 [5 n3 q/****************************************************************************/
8 I0 G# ]& u) G7 s& K: C$ Q. pint main(void)
2 y# u9 \4 X9 J{" s- }6 t* v% Y+ S% g4 Y
        // 外设使能配置
3 x. j& _! ?. A6 ?        PSCInit();) ~0 l4 T! Z/ _5 |

" G0 v; {& l3 o4 A4 k; g! U; V2 t        // 初始化串口终端 使用串口2% U; E, _6 u) l) x) V4 S. ^
        UARTStdioInit();
. y( L4 Q* {1 a0 Z6 P/ E, V3 [        4 z& u% s8 O9 w2 g' X
        // GPIO 管脚复用配置
  |4 z% S. `) ~- y6 j' g- O        GPIOBankPinMuxSet();
2 j( g( z' J4 D0 g( f9 Y6 I' f/ Q# O" r' e: s1 ]  |
        // ARM 中断初始化
# u, ]( {' z) t. s8 D1 J0 X: `        InterruptInit();
" l* q% O8 v$ t' W# m+ a1 u  i3 C; K
        // PWM 中断初始化
; i3 m2 s& J$ t& P4 l1 r        PWMInterruptInit();1 _2 l, m4 j% ?/ M; }
( c0 H7 l5 O$ r
        unsigned char i;3 v5 m" ?1 y% \& W# y
        unsigned int j;
' }) z( k: ?6 }: K
, j/ B, T! N; u0 \2 o. L% q        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
9 ^/ v6 f) x) z5 ~        UARTPuts("------------------------------------------------------------\r\n", -1);
$ h; Z: G0 }- @# i        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
8 ]9 Q: Y+ o6 H9 ?  e6 Q9 |        // 产生波形  l& Z$ R# B9 p8 Y/ R* {% C
        PWM1ABasic(25000,50);
, C# v( F) n2 k8 F
9 z- B/ z+ |# N5 ]  h) e- @        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);5 z, t8 N( ^! f( i
        UARTPuts("------------------------------------------------------------\r\n", -1);+ r* F" {! W9 f' |- C  b- D
% I) ~1 o3 f5 r

" D: D4 V" c' }  S( B; I. D' b" J! ]+ u& q9 ~4 l  K% J: {4 m+ P
        UARTPuts("------------------------------------------------------------\r\n", -1);
! R; H0 S/ ^* C" _' h        UARTPuts("                    C6748 ECAP Test\r\n", -1);
' H3 H/ ^9 `8 a9 K8 K0 g        // ECAP 捕获初始化
/ z' f! _! U) c& q6 A8 Z        ECAPInit();
7 X7 |1 Z# \" y) o        UARTPuts("Initialize ECAP.......\r\n",-1);/ P$ f6 M5 a" p/ }4 a+ Y5 ?6 h
        for(i=0;i<5;i++)$ x4 @* u) g# z
        {
1 \+ |7 W0 q! c' L& K+ a0 p                    for(j=0x00FFFFFF;j>0;j--);            // 延时
  o- l4 v, e0 x! p                    ECAPRead();
$ c  K( I8 j+ ^( s3 G! K1 j0 B0 }" I        }( P( D2 u$ S9 q. r- ]
        UARTPuts("\r\n",-1);1 E+ w5 |) h; C+ M9 h. j6 m, \
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
' Y% U" u) E3 ?  n        UARTPuts("------------------------------------------------------------\r\n", -1);
! U5 z! V. L- S+ E  o. `# r* L$ \% U- C+ a& j- l! w
        // 主循环% F: _; M4 b+ l
        for(;;)
; u2 v& M* Q5 w- S' [6 p' ^        {
6 V" j" n% n: [0 M+ }( l" c( p9 L6 p, V: l9 W% Q
        }
! U! o/ T' {% }1 {, s& E" j& j  w4 t- m}
3 L9 e4 Z/ w( V. Q- ^6 j6 N4 e
7 P0 P0 z+ w/ j" f/****************************************************************************/1 ^9 s' M# A9 }' U+ u0 X
/*                                                                          */
7 n5 B2 D8 B% j$ W& G  ^( D/*              PSC 初始化                                                  */
+ Q0 M& F1 N: l/*                                                                          */
1 T2 |; x  ~3 T  w/****************************************************************************/
  Y1 _: E$ H! `/ V( Q0 ]- Lvoid PSCInit(void)
% ]: U% [) h3 {  u{6 w$ i9 I  G$ Y. x6 v$ N: c: ]
        // 使能  EHRPWM 和 ECAP 模块
8 s4 `) q, h, ]' R& f8 k  z, }& B; `1 y8 g        // 对相应外设模块的使能也可以在 BootLoader 中完成  \: _8 Z; z/ y$ a6 `
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);* X* Q6 H+ [( R1 E7 p' c. Y. ~
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
; \/ P0 m6 a4 Q! n}1 C% i; H9 m/ z# {; o2 ~' M

9 |) V: ]; u8 [/****************************************************************************/7 W( w1 i0 C/ l* @7 K5 o
/*                                                                          */! O. j7 c# L, `6 a- d5 ?, Z
/*              GPIO 管脚复用配置                                           */- H' \  u0 I2 v( \2 I" I' l
/*                                                                          */
" q" V8 S3 q; v9 ~' J; x/****************************************************************************/
4 I. ~+ O7 I9 w% _void GPIOBankPinMuxSet(void)
' e- e+ U5 e& @* [3 W* W{
6 p) \: ^  E+ K; g        EHRPWM1PinMuxSetup();" x6 V3 A! r. s/ X

, V& k4 k# z, M1 s, U- {/ s        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
, A; y3 L% O# Z4 q        // 作为捕获功能时管脚方向为输入
6 Y1 I2 }! Z$ Z7 V4 Y; q5 w        // 作为辅助脉宽调制时管脚方向为输出7 r4 k4 A5 O+ R! S: ~
    // ECAP2 / APWM29 k" Y/ y+ w+ p. N8 P7 _
        ECAPPinMuxSetup(2);3 @) x& W4 n. `0 f0 O$ C$ R( X
: A( ]- j% h9 i& v
        // ECAP2 / APWM2方向设置为输入
6 d4 ~3 s( t2 ?( c4 e        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]3 z9 J6 c9 m# p  a4 S$ M0 F, d, g
}
) J: k! Q( g/ A. T& k
" Q9 E. J8 f' i/****************************************************************************/! @& _& L* P: T: c% v1 {  {5 c: C9 g
/*                                                                          */
: ?0 f' c3 `) D+ z$ d. {& R/*              PWM 输出波形                                                */
$ x# d" ^  q: O: f8 ~; ~9 a% v/*                                                                          */
# a) w4 e! M: n. I- `/****************************************************************************/
( M& O% u7 d% w. m7 G  Y% L4 avoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio). Z  T1 o7 S7 S& [, M
{* ^. }$ ]8 z. T0 {/ Y/ t9 K9 N2 e5 B
    // 时间基准配置& R! F% G% p" H! P7 Q9 J
    // 时钟配置
+ E" ?/ {, X3 U. v    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
0 L9 j9 Q8 d( A0 S/ M  {
" p1 t" ?3 I. j3 E    // 配置周期
* A& m& k( r, x: z    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
% v) R% m% F2 Z  `; L9 U                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
% s" I: V1 }. a6 A1 P' l% V- i# o. Q
    // 禁用输入同步信号
/ q, w  `0 {; @    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
$ i) v* h5 c' p# X) Y
" e+ |: g  Q$ I$ _    // 禁用输出同步信号3 N" P$ w) y* @  X4 V( s
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);9 V; J4 M, M4 u$ _
% p# [/ R2 z5 l7 H
    // 仿真(DEBUG)模式行为配置% J9 s: n' u9 L# n0 q4 ^( W+ `/ S
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);  O% S( j) [. v- I
7 f" O% Z' p- Z8 t7 r. J
    // 配置计数比较器子模块
- w2 \: t  A- P* d2 @" `    // 加载比较器 A 值
2 G& N. C+ n$ u    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
* ^6 ]4 B5 e( g                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);; J4 [2 m0 n/ l$ a% y- j
( h$ s1 l1 x4 M5 H% r8 a
    // 加载比较器 B 值: ^4 ?* i; x) H0 H" `, Z2 z+ h
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
" k5 }" P# O$ ~                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
- s* Q4 ]7 {; j
. u3 |2 M7 K7 l7 V    // 功能限定配置(输出引脚触发方式设定)
* N8 x. b; C9 [2 X( r& S1 c    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
  W9 ?! ~0 J* @1 M* X: R/ O! S    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,, O" s* n4 l5 r
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,  _) E) T6 S. A- e
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
2 k* }8 f+ O3 F9 e! g1 R" Z- o( V) T8 d3 y
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
$ B' |+ ~% a  y9 B/ Y, u: }    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);, a6 R3 a8 G" j" F

3 m* R" k" x8 v* C    // 禁用斩波子模块9 H! V1 E1 Z+ x+ E# A
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
9 k+ x1 W% c/ S, v7 K- ]: O
6 \3 @0 w- t3 I2 |& s    // 禁用错误控制事件6 z, I. e' J1 r% s
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
; v; _0 d1 c( k    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
& R' L* t' n* G% t& T5 ~+ [# v9 n. ~0 Z. t+ N
    // 事件触发配置
- o/ H+ e% `# N/ f: H# Z    // 每三次事件发生产生中断
/ B% @5 K& d6 m, _: v! J9 v    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
: x8 }1 z7 a4 V: d4 q) h# `    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
0 g& O  J9 E3 T8 K/ a    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);5 N3 ?. q$ g2 k/ \( E7 x1 i
    // 使能中断
" x5 O& K* K2 y4 x    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);$ z, A8 f0 X9 A8 [

' B3 _: @' B: a* ~% e    // 禁用高精度子模块. @- X- a9 M( g0 X0 T7 w$ D
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);( _. b7 m* U, R5 k$ h$ |
9 y& W5 h) b1 x1 Y3 w
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
7 X7 i) a- k3 Y# \# s; S2 c* r}
0 B9 X  F6 I0 P) y) g$ ~1 p( g( U* s. h# f9 f6 O. @: E+ O7 o
void ChopperWaveform(void)  M( p5 q# k: \+ V
{" i% k1 V4 {2 |
    // 50% 占空比
% O# A  y8 q/ x! k0 w8 n9 ]$ z: _    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
+ {2 L' j! @3 z. m, u) T; C    // 4 分频- h# T- c6 ?% F7 ^# N( ^
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);2 w0 T: \' @' T% h
    // 单个脉冲宽度
. r  T) ^* s! F0 X; i* Z    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);6 w: T" [5 j: H
    // 使能斩波子模块% J/ E5 h7 |( e% Y
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);! Q, C1 H% a, Z: o0 s
}7 G+ Y& s4 ]( [! J* T( ?) n6 ^

' e4 o  V9 l/ ]1 x" v8 _( u# |/****************************************************************************/& O; p1 i- ^  _) r
/*                                                                          */
* d. j$ ?- h  x$ Y2 i! Z# f& C/*              PWM 中断初始化                                              */
! h; O9 v; S& p" Z/*                                                                          */
1 \: q1 ?( ^2 F5 n/****************************************************************************/
' j( W+ R" z# \( J* evoid PWMInterruptInit(void)+ ^) w* ^, o$ B& ?5 X
{
3 y9 l8 s, I" ?) p7 j        // 注册中断服务函数
* Q' d0 Z! m: C9 _3 p% c        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);6 q8 Y- }* |/ E8 V
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);/ ^0 T+ S/ c, M

) c! l( G2 c( B! d( x; E' d        // 映射中断2 m8 E- |1 A% K5 f
        IntChannelSet(SYS_INT_EHRPWM1, 2);; k# R3 R, b: B% d
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);/ M# f/ r( l  t7 l, U3 t5 w$ y
) B: `, c) T6 @
        // 使能中断
4 e% s# D/ Q5 a( X9 @  [        IntSystemEnable(SYS_INT_EHRPWM1);
5 g0 g& ?* j% {* |        IntSystemEnable(SYS_INT_EHRPWM1TZ);
- b+ B5 {! O3 a7 a" t$ Q' h: D}
8 }% P% L1 F; }- \( J: v# J* E. `& E0 R, }
/****************************************************************************/
" b/ G  I7 U& Z/*                                                                          */
5 ]$ e' R# t" ~, q5 \/*              ARM 中断初始化                                              */
3 a! F: x% ^- M: g: b  X: @- m7 x/*                                                                          */
- F. m3 |, T  N( u  Y4 d6 A/****************************************************************************/
! U* {1 o( U+ y3 \( Avoid InterruptInit(void)
- F9 U/ s( k3 r. r  q9 g  _) d: f$ n{& u0 b/ x; S0 i: u/ u( W
        // 初始化 ARM 中断控制器
) M0 K+ m; M$ u- ?9 ?4 x- r: h5 U/ d        IntAINTCInit();
, R3 Z4 v3 h# C+ U* Z3 L/ b! B6 w/ C" p
        // 使能 IRQ(CPSR)" A' w" n* ^8 ?0 w, y# X
        IntMasterIRQEnable();
7 h. Z; @7 m# T6 m( t
! V& D9 o9 h& U        // 使能中断(AINTC GER)! P7 M3 F2 _3 T2 i4 \" h6 z8 V9 u+ J
        IntGlobalEnable();
  g5 z4 C9 e+ ^0 g5 ~5 Z( i+ B. P% S; }+ r' q) ]& U) J5 o6 Z
        // 使能中断(AINTC HIER); a3 h+ s2 L" m( C( _& c% c, a
        IntIRQEnable();
7 a6 D4 j( c6 M  J}
* \7 }0 m7 s$ s0 t) L
" z' z/ {$ V, M  `$ B5 v7 H: n( K
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/* I8 @9 B! q% R, h
/*                                                                          */
" N8 Q$ r, q0 X- @, t8 E& Z+ \# z, ?+ e/*              中断服务函数                                                */
4 o' y( W5 n" S* h  V5 `2 S/*                                                                          */
4 B( J4 Z6 R% a. L- M/****************************************************************************/; W3 M5 O4 F, T( X
void PWMEventIsr(void)2 R# ?4 \: i, ^! c  G8 z
{
, T. c4 B4 m" l; p% }% Y) ^* e5 b( g! z1 j        IntSystemStatusClear(SYS_INT_EHRPWM1);
! b8 s9 T0 Q# d
# r: V0 H5 Y; Z; s# H    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);+ }' b' v# e* O# I
}
) p7 d1 R9 P: r# |- Q. L3 C  `- B# x5 N/ f: t3 X
void PWMTZIsr(void)
2 ~# G) |/ ?) {{5 ^. g0 z1 D1 M8 u
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);7 i# a$ k7 y4 w6 u1 L

' S& a8 }  B- }    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);6 ?/ a( K& L4 G$ k$ x5 z# y, w4 |% ~
}
1 i" E7 L- X" m) m: V0 X* T
% N, B1 D! D8 y9 J/****************************************************************************/  U2 Y& c- A, C. {3 ?! [$ T
/*                                                                          */
7 Z$ K4 k- V0 u/*              初始化捕获模块                                              */
9 D  d6 G( @" U5 H/*                                                                          */
* _( @1 B9 e2 O% V, p/****************************************************************************/
5 K* j7 x2 Y* |& k% xvoid ECAPInit(void)
3 Z+ l! ]# a  e+ i2 P{
0 I2 i4 |7 s: b. M& H- @        /*-----设置 ECCTL1-----*/% V1 m" X: I4 Z9 T3 o+ F8 R
        // 使能CAP寄存器装载
2 C3 q5 u1 t0 C( R( P7 }; N        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);; ^$ r, V. j7 t" S
        // 设置预分频值.
0 ~. ]' Q. m$ D- F" P  Z( h        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);( K, k* D5 h: ?4 J1 R
        // 上升沿触发捕获事件3 s4 K$ ^( p5 I7 K: t3 @
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);+ w; n2 ~0 A8 o1 [
        // 输入捕获后重新装载计数器值.2 r2 \4 v  @1 h8 j0 U
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
1 |2 t6 a# E/ N. R8 O
* i6 r" `- u7 u! b        /*-----设置 ECCTL2-----*/! l8 X3 ^7 G1 ^7 w  @7 e
        // 连续模式/ n4 k* p% i- @
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);( {5 \. e) i" k5 C3 s& I
        // ECAP计数器TSCTR持续计数" E  g) v8 E  O8 F
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);' \; h) S, b, I6 ^( z
        // 禁用同步输出和同步输入  h# w8 `# T. j& r( y% f' m) ]. L
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
5 e  s; Q* |) }6 V        // 配置 ECAP 2 为 CAPTURE 模式* E+ Y7 D$ [& ]2 ?0 Z  e
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);6 G: Y3 X! I$ A% S# V  [

! v/ w3 p! ~1 s- [- J% r        // 使能中断/ p5 h, [. p9 [1 X' Q0 V# x
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
6 ?2 ~5 e3 W6 _/ a$ j+ C; Q}3 Z7 o  ~3 G) Q+ @, s/ w' Z) n0 }
. A% t* A1 J( n0 e& g
/****************************************************************************/: h6 @. G/ F& h9 L5 O& ^- P
/*                                                                          */
; h0 H" g, k% A) T/ Y% \* q/*              取得捕获结果                                                */3 ~- _7 B8 X# P2 b5 r* e) A4 {! I, B
/*                                                                          */
3 Y9 X& s/ Y  [- _# @/****************************************************************************/
+ X$ i( A% k- k$ L' ounsigned int ECAPRead(void)
3 E, `5 K9 o  u4 n  N1 c! N( x8 D{) G8 t) ]' \3 [8 N
        unsigned int capvalue;0 }( ]% g1 \+ Z
        unsigned long frequency;+ n2 l4 J% o% R& b5 x; [. L5 T

# y" C1 y9 d$ P7 \6 T6 c        // Event1 中断标志# u: u5 B3 G3 x( E$ ]! ^
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))) E2 Q: u6 m2 P+ c* y7 ^: O  m
        {
+ `% B" P$ K" [( U& ]                // 取得捕获计数1 K3 _$ O- u! o# r3 G
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
% w4 h' q: B1 }) Q4 R/ r/ }- W" ^                capvalue = ECAPResult.cap1;& n  u9 l! s  H! |/ T" H

5 ?- ?. r& Q$ Q                // CAPTRUE 模块 228M 时钟主频' E$ n, G5 k; o
                frequency  =  228000000/capvalue;, L  G4 ]: d9 x
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);9 }, \3 L: v+ L4 @9 N
5 Z: y0 E* e3 Q  W8 R9 ~
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);% d$ J# D* A1 y9 p; q( X9 _
//                IntEventClear(SYS_INT_ECAP2);2 _  f3 \* w" b; |/ V) T! e
        }# u5 T8 X2 X% @( I7 v$ k: Q& T) V
        return frequency;- ~' m$ _, t6 x& {! C: a
}
6 g9 ^* f2 Z- l* G/ n5 ^5 [. L
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
, ^; h) U$ T0 O0 J4 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