嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
& {/ H% n8 V  f! ]4 _
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
+ F3 b" L: G8 t* F* h/*                                                                          */! z# `/ y0 a& d4 J. e
/*              宏定义                                                      */" P! ^2 ?5 y& D7 K
/*                                                                          */- }+ [6 ^; p  r7 o, i8 Z
/****************************************************************************/
" M7 ?3 P  L$ f// 软件断点
' w) P& _/ `9 |( _0 g5 m1 P2 `4 b#define SW_BREAKPOINT     asm(" SWBP 0 ");. g. T% w* l6 N) L  L8 o! N

. w/ T: S2 }  A// 时钟分频
( s( {& k/ ?: B#define CLOCK_DIV_VAL     228/ v" w4 U6 p2 Y; B: k" i
1 O( e# ^8 i$ Q) S: i0 l4 @
/****************************************************************************/
# D$ ~  a# }- o3 P! P! R/*                                                                          */
) v8 r3 q8 H( i. g& r4 L5 Z/*              全局变量                                                    */) @$ m( o7 k0 n- t0 D+ q& m1 l; r7 v
/*                                                                          */8 o# c5 d# y  Z/ o' \
/****************************************************************************/+ ]. D( v) Y# Z3 g/ b
ECAPCONTEXT ECAPResult;
1 Z' t" ]( j4 r- S
8 @; B5 K' k$ o4 f! C# R: v/****************************************************************************/4 k, \- _' Q/ y7 A: s* l
/*                                                                          */
$ J3 P! p9 L0 q! }/*              函数声明                                                    */
! _# N  T7 Z3 V, V: q7 p/*                                                                          */6 A3 d- q: g% C3 \" o
/****************************************************************************/
2 T% t% v$ d9 e+ u* F2 R// 外设使能配置
  Y; |+ l# r% e  J' Z' t& fvoid PSCInit(void);4 d4 {  T+ b1 b  q8 m; d. C# f

& W% T# K1 L' [! L& c# R// GPIO 管脚复用配置+ p3 F4 X+ }7 e8 ]) }' X, X3 d; t
void GPIOBankPinMuxSet();$ a0 \: r" F; _4 [2 m' D; m

0 A5 B! _( I- E1 L' U// 产生波形
9 g) P* N; q" F0 {! \  Mvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
4 s% g1 C/ ]4 X' P  O' ^void ChopperWaveform(void);
. w8 S  }& g2 N  u% j1 z) F* a4 m$ A+ c# Y6 F
// ECAP初始化和读函数
( d' B; n& w! p) Y+ _void ECAPInit(void);! \  }& }3 ]! Q* p  J  k7 [
unsigned int ECAPRead(void);  E2 x0 E& s' ?
( A$ `2 e3 x: L) ]
//ARM 中断初始化
% X# {5 M; t8 R& p/ `void InterruptInit(void);
; r6 L% b7 p6 _
0 X) B+ V, I3 _// PWM 中断初始化4 {2 ?1 u2 K: d6 x
void PWMInterruptInit(void);  ~# x  i4 H7 z8 S! `$ ~
// 中断服务函数1 O9 L4 p1 V5 X; S9 ]
// PWM 事件% r( Q8 [& _$ }4 T/ c% y! z) F
void PWMEventIsr(void);
) O! y: _( X$ [3 S// PWM 错误控制事件
) f( C0 @4 s) U: S1 [void PWMTZIsr(void);
9 W7 r: V, k" d! y* ?* z! \. S& F4 N  {3 r% t% N
/****************************************************************************/
) k. @# Z* l! V% V! l2 A1 e( P/*                                                                          */; X. b7 Q/ j# C% l/ t
/*              主函数                                                      */
+ P( q' Y9 K  a0 M6 o# N0 [2 i/*                                                                          */
, r" r( a3 \4 v, W/****************************************************************************/
# z: G4 P: f4 \. S  f" y" z# v" qint main(void)
, s. D+ r6 A. B{
, F2 ?; Q6 ?8 t        // 外设使能配置
9 O3 Z1 G- n/ T        PSCInit();
0 M6 U, y# s1 d% |
9 Q0 ~4 H7 F, Y: ~        // 初始化串口终端 使用串口2
9 T7 [! w8 b2 |& C9 H4 P6 U) W        UARTStdioInit();
2 o  s5 g# [$ F' P. `" z, ^       
. |$ |  |  j  ]+ M5 K        // GPIO 管脚复用配置5 L# {+ m( n, `& G
        GPIOBankPinMuxSet();
, q  ]4 J6 L$ y' Y
' ~1 g8 P5 ?" K/ X3 u        // ARM 中断初始化1 ]9 t. P% H, a) V4 Q* Z+ N8 L
        InterruptInit();
6 W( P, q$ U3 d+ B' E. }8 R( e0 v1 S8 o2 M! M
        // PWM 中断初始化
/ I% s& D4 ]) K, J        PWMInterruptInit();
% c% Y+ A/ V$ u0 {. Q$ L7 m
# a7 [; P$ j$ Q4 o        unsigned char i;6 F1 `. X" I$ M5 z, u0 E
        unsigned int j;
* z$ s) G/ N, V0 _" F
# H9 W* y# O% @9 `* F8 ^& D2 _        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
' A6 D/ A8 a7 l6 ]        UARTPuts("------------------------------------------------------------\r\n", -1);
# m* C4 f& q- `7 {        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);% q+ m8 Z& p3 p5 G" t
        // 产生波形
/ v  `* ?" s" `; T/ P        PWM1ABasic(25000,50);
4 k: Y) t4 q9 s/ u9 Q
* o. C8 ~1 s: }. z4 W& R- k        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);3 q( Z  Q" S5 D/ O% F: x( Y9 }" x
        UARTPuts("------------------------------------------------------------\r\n", -1);
' S& z  u1 G; u1 A% D  {" W' l, [( {# O, J( ?: S( z8 E
. o3 a5 P( n1 j

5 f, b, }# K" g# `        UARTPuts("------------------------------------------------------------\r\n", -1);
$ B& z! _" j" i" v% u* o        UARTPuts("                    C6748 ECAP Test\r\n", -1);
- ^6 w" t4 X( t3 G1 c6 u        // ECAP 捕获初始化, X0 E- {8 W+ K3 T3 |6 H; N
        ECAPInit();
8 |$ A: e, q. b4 }0 P8 }; n) A        UARTPuts("Initialize ECAP.......\r\n",-1);: A- D/ K  l" H0 g+ i( ?) C: O
        for(i=0;i<5;i++)
$ z$ i( |7 I# f2 a; ]- o; T* ?$ ?        {) j: R9 N2 z! j/ Z- x& l" X
                    for(j=0x00FFFFFF;j>0;j--);            // 延时* C5 N6 J/ @  `& x, k
                    ECAPRead();
) @$ ^0 X% I+ k; E        }
$ w! ]1 D# g. C0 c& K        UARTPuts("\r\n",-1);
/ }+ ~- H6 }$ t        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);2 P1 O" ?* N& n
        UARTPuts("------------------------------------------------------------\r\n", -1);; a7 n) C- f0 Y4 y3 f# B
% b( c1 U/ J9 [4 u7 T5 p; c
        // 主循环
$ @% K+ |5 b6 F; `4 S+ ]        for(;;)
- X7 C% K4 x" a2 D1 u+ M: ~        {
( H' c" y6 _7 @1 f, ~
: \) C& \- ~" t( P$ @  P2 t        }
6 [7 S; v1 T+ d) I1 ?/ S, x" g1 I0 A}
" j& D5 d4 k1 c+ e6 o+ n# S
- r  b% Q9 X* L* |( o/****************************************************************************/0 C  \& Y+ ]4 Z1 D  Q
/*                                                                          */: z' S- A! x9 a. S, F9 x$ m
/*              PSC 初始化                                                  */7 v! ], k5 h* \& m, L
/*                                                                          */: S2 p9 y5 N* J& r0 M& ]* n
/****************************************************************************/
" \1 S+ P, C* Lvoid PSCInit(void)( Z  U) o& j5 x. \; Y( t
{
& s! I+ h2 s: H8 m* @, k& u        // 使能  EHRPWM 和 ECAP 模块) O7 {6 V, x+ o: S2 X
        // 对相应外设模块的使能也可以在 BootLoader 中完成
+ R2 j6 ]1 Z( }) R3 F  b    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);3 d/ ^$ \# L$ S: |/ F1 {
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);- h6 E+ A8 I) k
}
! Z3 h% A9 T( x8 I( D+ O6 Z& r' k: H1 H& v/ U# j( }, A
/****************************************************************************/# b' f0 y4 W% Z$ |8 U2 O- [4 h
/*                                                                          */6 Z+ H! C- {8 f2 f$ L4 \* W
/*              GPIO 管脚复用配置                                           */( b8 @- z2 f; l, f
/*                                                                          */1 F; |) |. z/ k4 Z7 C# N( d
/****************************************************************************/
, d) t7 K% B* N: O. j  zvoid GPIOBankPinMuxSet(void)1 v8 [. \: O$ `+ \5 }
{
6 C% n" s. [! B5 C$ y        EHRPWM1PinMuxSetup();3 U# i/ F4 R* u% J: B
( G4 A% H# ?  G- C0 L4 Z
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
* F! a: {9 @% W' ]7 l* [$ S        // 作为捕获功能时管脚方向为输入4 t" ]6 h- x* f) U: V  {+ Z- K
        // 作为辅助脉宽调制时管脚方向为输出  G0 d( b  R* I# }" i( j
    // ECAP2 / APWM2
, q! ?* |9 D3 Y" l) r0 i6 S* t1 v        ECAPPinMuxSetup(2);- t" ^& u# l- _  a
6 Y/ l- V) b9 h) ~3 U4 H1 a7 j
        // ECAP2 / APWM2方向设置为输入$ h: g! q# h3 C: T( i" p' u: f
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
2 |0 u# m% H* a% }; s, X; w}9 f* P# G/ e9 D$ H6 _
/ Q( i  P, i' T, x# u7 x
/****************************************************************************/
# j/ i. b4 p8 b' r8 [/*                                                                          */
9 G5 L* h! A1 u. O5 g/*              PWM 输出波形                                                */
5 d" M- g1 M0 I+ A  ^6 f/ _" S: m7 g6 g8 M/*                                                                          */
: E. p% [( V% ]0 \6 q+ k6 I/****************************************************************************/
9 o; J% |+ u7 w3 `) lvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)( @% w8 T" V6 L) g; a
{
" V8 N: b8 `! X6 h    // 时间基准配置
  x  Z8 r+ i+ h- `- r9 H; |    // 时钟配置# w. M. {/ K! ?& ?& G
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);3 E2 O0 d5 W8 Q/ T) W

! P# S6 G$ o2 g+ |1 G    // 配置周期1 ~7 b: M- G+ S; _
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,' z5 h; l! Q0 r, r- ~) D
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);- z& X: r( e( Y6 P

' ?4 e8 {' I8 U+ i    // 禁用输入同步信号
% i8 ?( u; ]8 g3 p: A$ }" e    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);* o- m: G. Q& H6 Q" X3 z

( U5 E) \. J9 u: j" ^    // 禁用输出同步信号7 s$ e; G9 \2 l8 o) ]9 x
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);( _- t# r; M, y4 ~6 \% o

& K. Y# x  V) w8 h9 y6 ~: j    // 仿真(DEBUG)模式行为配置
0 J. K: \: ^) b9 n' ^    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
2 j  }; x: u/ K& h; x9 k. V( r+ V# \" _8 W- D: a
    // 配置计数比较器子模块
  }: m% {4 V) S( a0 n" S( G    // 加载比较器 A 值
1 E+ w2 `! O: I5 i; h% H3 R  J    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
9 M7 ?9 M: G- Z, @, {1 v* q                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
/ o) k4 J; }( o  E& c0 `+ j2 g
3 }6 Y4 @# M- _$ |8 H    // 加载比较器 B 值
- N* K* b9 N; {# F    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
; t) b' B9 N) N0 E% v. ^1 b+ B& _                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);3 q0 h  a' k$ S4 y9 }* q( N
4 n3 u2 G% G4 U9 `' g& N6 ?  L6 S
    // 功能限定配置(输出引脚触发方式设定)$ h9 Y4 x) r) [, B; Z+ }
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出$ ~- N$ L5 [3 }3 X6 M
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,% a4 r  q+ t1 E3 L- \+ b$ z( R5 q1 L1 t
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,. O$ _. L4 D7 X4 A! {; c
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
- E' T6 ^( M1 t3 f" @% b1 v, p5 L
0 h+ c) Y0 K  x( ?5 L/ @    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
1 g5 k+ `- F  t    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
$ x, K! C  n  }: `
9 p) R) {5 Y& P' D" O    // 禁用斩波子模块) l0 O2 v. L9 D7 E0 _
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);; b6 B6 |" d7 n/ k, i
# C5 {4 p: L/ K$ h$ G0 {
    // 禁用错误控制事件" Z& b3 s. j# P7 e
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
1 z( p0 t0 M' T) T4 H6 I9 e: a    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);! u. c% Q0 X  \! P2 [) ^/ ~

/ ~2 K0 R5 K2 T    // 事件触发配置
9 L- Y$ P# t7 f7 N2 n5 i    // 每三次事件发生产生中断1 Y) I* R3 ^( j" b1 q3 _
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);. X/ ~$ w& B7 [# A
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件. V! [- z3 U8 I
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);4 S! d' {% w4 B( t" V% t* Z
    // 使能中断
7 s; V' n4 y3 }8 T0 ~! ~    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
) C7 K5 Z* h) I) I
: Z! \" A0 e; Z9 P" f5 ?8 M7 X    // 禁用高精度子模块* d: m) Q) c- O
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
& y: Z/ b" U0 f/ b
# ~5 k  v2 C* T  k* j    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
/ `7 f5 A" r  d}
$ u  e1 @# q# [" I
4 M: T4 Q/ d8 w& o# Fvoid ChopperWaveform(void)
: m5 |: W4 Q( L& R/ _7 X{: i) F) t  X, s& w& L+ F
    // 50% 占空比% f+ N1 R1 j6 [# T6 x; Q: r) R
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
" b5 V- b: N* q$ o    // 4 分频
- n% @  X! j5 L: x- T' W/ U9 J    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
: q) {% K$ C5 p/ `    // 单个脉冲宽度+ o( O- n; k- s- N" }. n) B% o
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);4 d& M8 i+ D4 {0 L2 _: b
    // 使能斩波子模块
0 F4 U  @1 T( @% D" E! z    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);/ p! ]! X( W: f" S; q4 b9 q) ?
}
6 p: Y: b- W( X8 \, ]
" u# `$ r  C4 y8 [5 D1 F/****************************************************************************/2 ~6 p' u* {5 Y/ u# X' U
/*                                                                          */; T# \* D+ o3 \8 ?( b
/*              PWM 中断初始化                                              */7 F4 ]/ G" |4 P, s: a1 }
/*                                                                          *// f; J' A" m1 E  I6 W* d
/****************************************************************************/: P: `- {9 r: J& U+ N
void PWMInterruptInit(void)/ C; n+ G4 a( ]+ S4 u3 X
{
" E6 Q* Q' _  q- B: a. N4 ?5 f        // 注册中断服务函数
' t7 s1 v/ k: D2 @        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);' L& q0 N" H$ k) B$ J, ]
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
0 q# l0 x6 v/ f: G  `4 C
: `2 X/ u8 W9 H, n1 j        // 映射中断
# c' r/ W/ N" R( G: N5 }& N" x        IntChannelSet(SYS_INT_EHRPWM1, 2);
7 a  j0 ?2 |) W) v, L        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
& E/ G/ a/ U5 u, v( N/ T* S9 [& J8 R  m6 y1 M; u% T
        // 使能中断
" D& X5 i7 K4 k$ m. x) C1 l) Q        IntSystemEnable(SYS_INT_EHRPWM1);1 |8 m' A: ~+ ?' f, z  o
        IntSystemEnable(SYS_INT_EHRPWM1TZ);
( I% g1 K9 b$ p5 U}
4 V9 _0 o: O+ m5 P' Q4 b7 A) o4 D/ B* p# ], J3 W
/****************************************************************************/
5 N3 D( d: _; d  `7 ~" Z& h" K5 s2 x/ F( t/*                                                                          */1 ~4 H# d$ V% P; H" P# n% ?. g
/*              ARM 中断初始化                                              */
8 g& k2 \& y' I9 p, C3 n  \; N/ |/*                                                                          */
8 `, U! u9 S' A. s* N9 `: `" a/****************************************************************************/  \' R8 D9 z* _' H1 z5 ~, d) G
void InterruptInit(void)6 I- B7 M' P! W( |
{
  Z" S7 j. `1 T1 m" E3 q0 b+ \        // 初始化 ARM 中断控制器
& r( [8 n/ v0 X* }3 h- }        IntAINTCInit();, |! P. ?/ r/ }" \. y

+ W/ p! B$ R/ Z5 H        // 使能 IRQ(CPSR)) x+ w4 G' X3 O) B. M3 B
        IntMasterIRQEnable();+ ]* k6 X- W5 g4 _1 M$ }4 L
& Z9 ?/ ^7 b  X% x1 V# c. B6 q
        // 使能中断(AINTC GER)
+ _+ y! E) x9 }2 O  o; S        IntGlobalEnable();) u9 e% T8 Q5 y, R. U( o
6 \6 @) e. P8 t# e
        // 使能中断(AINTC HIER)
& |6 [  z: P3 c4 Q2 M% F6 Z        IntIRQEnable();) C& W! ~- s# m7 B5 ^/ V: l0 ?  G+ \
}
) F. ^* U+ G1 o5 d3 O9 k# _" Q. ?- n6 [

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/
" @- ]/ \" F- K8 r" |/*                                                                          */
* G- \8 ?5 @8 \. U& M/*              中断服务函数                                                */
7 v- p' _2 v  O5 \/*                                                                          */
' A: H; O; }( z5 }! r3 Q# t: W+ N2 u% r/****************************************************************************/$ d4 N3 g1 i5 E' e4 l. G) ?/ X1 Q
void PWMEventIsr(void)
/ r6 o3 D& o2 e  ?0 v1 [; b{2 F! c9 c2 j/ ^' ?! q) X
        IntSystemStatusClear(SYS_INT_EHRPWM1);% b; \  v* S1 G9 c" r$ x6 N, w
3 F6 M$ X" [5 w9 V2 H) |
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);" _+ h4 i) n! F3 H, X# }
}
% l7 x. f6 K8 ~6 F: ?
' N* X& d8 O% L9 k; ^$ M5 zvoid PWMTZIsr(void)
; i8 ]6 Y9 q; q- G2 m{
1 {% S) [# N& K) J+ c2 I0 I3 X( W0 i        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
0 f- E% m* B' X. R3 v% l2 p' E8 f, [
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);' k* h" ?& y' b5 P1 K. V" ?& J
}! u2 y2 W0 c4 k% ^( Y8 _+ n
" R! {: n, e. {  e' `
/****************************************************************************/
7 f* I, E5 M3 G& g/*                                                                          */
$ E; ^: d3 J, Z' U7 ]( i2 z/*              初始化捕获模块                                              */) J" [5 N* f0 }4 E4 K
/*                                                                          */* K7 ]5 _% v# Q1 m- I6 r6 y  k
/****************************************************************************/: t' w5 D/ O0 }) }4 n' R+ s" G
void ECAPInit(void)  ?6 C2 _! A4 N2 u
{% s( a& _- ?9 m1 H8 @  \( S
        /*-----设置 ECCTL1-----*/! J% n! O. ^/ ?/ g1 A3 z
        // 使能CAP寄存器装载8 D$ K' Q8 a  A2 O! g! r' K! \/ i
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
/ d( z$ o0 \' i/ t        // 设置预分频值.
- S3 g" u5 S. p5 }        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);; ?. n9 B- T# V4 ~* Z+ V
        // 上升沿触发捕获事件2 f$ ~* w: B' {* k0 p& h" ~% e5 T  i
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);9 Z) Z: a9 c% k3 f
        // 输入捕获后重新装载计数器值., b8 X% E) Q9 y1 e! w. O/ h( {' I
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);3 k$ ^5 U$ d4 m) C0 _

. q. v! E; h8 z0 F        /*-----设置 ECCTL2-----*/
0 D1 V: D, F1 ~  b        // 连续模式. G  J( U* ^6 F- U, [1 T( k% T
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
& e( F; c6 n; ^# p+ c, a/ `        // ECAP计数器TSCTR持续计数0 X; G* _6 U" j9 K: T6 V8 w
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);" G/ f0 q. B/ G) o0 s' k( R8 T
        // 禁用同步输出和同步输入1 T% v" P+ n! k4 K) l" ^
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
8 n, T" Q; r& v0 B! G- c        // 配置 ECAP 2 为 CAPTURE 模式% `4 f, @, J, a, h  w! ]" |
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);" B& w! l7 h6 A# C- e

# E1 l8 s4 R9 d/ q; ~! I        // 使能中断
  j* J: w* Y; B" {. r# k( y//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
- e% B: u" V  _/ H( N}
% v7 g, ^7 w' L. F0 ]
: Y7 e0 y2 r# ]! l8 j' E( ~, Y9 \2 b/ b/****************************************************************************/
& ^5 T7 m5 \* p: T; G; K/*                                                                          *// T8 r$ S# ?. D/ D) a
/*              取得捕获结果                                                */1 V: Q8 }% v6 b+ H2 w$ }3 L
/*                                                                          */
  P3 o% l1 R$ x3 T" D/****************************************************************************/3 E- G$ H& P% M# i; R5 a
unsigned int ECAPRead(void)
* f2 @7 V( G  V' B' L  G  h; z{
; r1 L3 I2 y6 A        unsigned int capvalue;
1 M# `. _* l0 Z' e- w) h        unsigned long frequency;
' U* B  }) ^& r3 Y' n) U0 j& l8 f6 i1 i: j8 M  U7 a' a
        // Event1 中断标志
" ]* c  b% [- M$ G! s; [6 n- \        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
: k: T* F% t% b2 Q2 z6 S  {        {3 v& [7 J8 [  c
                // 取得捕获计数5 _/ d* D9 J- I
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
! p7 s* a# b" J/ E& P: {                capvalue = ECAPResult.cap1;5 f1 K3 e) ~# n4 w! z7 Q$ M/ L
- @' m, g0 K( l, N6 u. q
                // CAPTRUE 模块 228M 时钟主频
. a& i# @$ l* g9 [: y* }                frequency  =  228000000/capvalue;4 ?( ?1 E7 d9 ?) S5 l8 ]: b3 o
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
/ ?0 F3 g0 J. t" T
, N- D1 J3 {! p$ @- }                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);0 t2 A$ r: W5 i3 l8 m+ w; T% R2 g
//                IntEventClear(SYS_INT_ECAP2);
' ]9 ~) D7 t* v* C2 p- Z        }
4 ~" n: y9 N# d/ Q1 O        return frequency;9 g4 K* t1 t. Q; y) M
}
- n# |0 g& a6 L' {' f
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。0 n' V2 Z+ f$ n2 [$ r8 U$ t
[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