嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家+ \0 w6 ?. `! C6 L* M: S

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/" s) i0 J. H4 a# l
/*                                                                          */
# G9 Z/ ^. E! T6 K4 ~* ^% J/*              宏定义                                                      */$ Y* t' R. Y& A2 t6 D
/*                                                                          */# q9 \. p% o+ n$ f7 a% V
/****************************************************************************/0 ]( }% Y2 c2 I
// 软件断点" F5 U9 D( a! J% m
#define SW_BREAKPOINT     asm(" SWBP 0 ");9 P/ J6 L3 J; `' ^; A. `; U

9 Y% A/ G  G* `( D. i+ U// 时钟分频
4 ~% h  @8 b3 b5 _& U3 e#define CLOCK_DIV_VAL     2287 t4 }6 S8 V, u4 M
- N! B4 U$ H8 w% U8 ^
/****************************************************************************/
/ y2 ]# a  \, J8 _/*                                                                          */
& I: t- I) w1 h$ O/ n/*              全局变量                                                    */
1 v( g; u9 J# o/*                                                                          */
6 H7 a6 A' @- J9 j% j' B/****************************************************************************/& @. C- _( }' e% X7 k
ECAPCONTEXT ECAPResult;
% l8 F8 o& Y) d
. C! c( y$ J1 K* s) g/****************************************************************************// W1 u8 G7 y1 F. h9 Q7 W* b: J' Y+ O
/*                                                                          */. r: C. ~  M  g  i) `# B
/*              函数声明                                                    */
: t& o! p7 z, N! u4 U  G/*                                                                          */# ^1 f9 g3 Y! A9 U& O
/****************************************************************************/
9 C6 ?: v7 ^5 O& s4 `// 外设使能配置
3 z, j; j/ G- C  ?  `' W5 Nvoid PSCInit(void);
# Z# ~7 G# Z; M% n% }9 v: Q! d
/ ~6 U* f/ ^& F9 `/ K9 w. G5 K/ L// GPIO 管脚复用配置
3 k* a6 `7 \; Rvoid GPIOBankPinMuxSet();
; Z% h2 k3 ]4 e0 ?5 T: e
+ N5 |2 X. r6 w  r# ~8 D// 产生波形
! e" ~( B8 Z) Tvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
! M& M4 G8 ^* ~2 b. R$ M& jvoid ChopperWaveform(void);0 k3 B. \( Q( {# H

. T! Q8 s5 {+ Z" V5 m0 A" M// ECAP初始化和读函数
1 ?( X7 x! n+ b9 `; wvoid ECAPInit(void);
* M  a1 ], l+ r+ ?unsigned int ECAPRead(void);
* |1 h; s7 s, @% N: d3 t& S2 X$ [4 f
//ARM 中断初始化
1 `' y6 d+ u. z  {void InterruptInit(void);$ U8 a9 x' L4 _+ Q' Y) _
+ T- F  e# F: b7 H" B# t
// PWM 中断初始化9 [' [/ n; M$ Q9 r
void PWMInterruptInit(void);
( p1 h  u$ k0 a" C3 n// 中断服务函数7 g% c7 Z( u. A6 B
// PWM 事件1 ^* |3 i' f) J! N, D* `5 S
void PWMEventIsr(void);
! C% t) N6 `3 R! U& `1 j8 n6 K9 H// PWM 错误控制事件3 N$ U. `4 x1 c
void PWMTZIsr(void);
  w8 D" ~6 p" e3 p9 ^, A3 N$ w4 S  ?
/****************************************************************************/
0 y6 B2 D& t% P# D8 `7 H4 w/*                                                                          */
5 V. J/ w$ X5 O) t( ^/*              主函数                                                      */
0 e/ ^  L* |; E/*                                                                          */0 f# i; Z0 |5 j. f& c/ Y7 B4 p  o# q
/****************************************************************************// C9 a8 [" i% }! `# F8 g
int main(void)( a7 t& |5 f2 b
{
0 n& B3 g! M' P/ @( w6 T. @        // 外设使能配置
7 ]; [( N+ _) S+ F0 [        PSCInit();# ]) N1 O9 W) g- c7 A
: U; h. p" Y4 `8 b& M9 B0 Y
        // 初始化串口终端 使用串口2, h  b1 y. L3 c8 v
        UARTStdioInit();, T' T; U: U! M# K
       
2 @/ N# C) x5 a* u; z        // GPIO 管脚复用配置
- k: o$ j8 k' @* G1 `        GPIOBankPinMuxSet();# L7 ~, i+ Z" i; R! R5 U

& H! L/ x0 d/ N4 a5 {, ^        // ARM 中断初始化, h8 `) K. ], z  @3 t, N
        InterruptInit();
2 g/ |2 G# g: o1 k' q: z! {& Z5 W0 O) k) Y, h5 h) p) ^3 O
        // PWM 中断初始化# h, |0 A7 }) \: x
        PWMInterruptInit();
, c# x3 S6 ^% R- t. J  j9 ]& r8 ^% g+ e0 e( l7 k" U
        unsigned char i;
5 Y  y' n; R) w) F        unsigned int j;" `: _4 O# T3 r9 A
9 f/ g2 L7 L: f. X
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
* ]) \$ ]5 v6 v% o. \" n! G  O& w        UARTPuts("------------------------------------------------------------\r\n", -1);
* ~- [  S3 C2 ]/ P4 K        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);7 v, [2 F# x' c
        // 产生波形7 C* u; O$ u+ S# F
        PWM1ABasic(25000,50);7 Y% u3 K  D/ W& ]- M

. H. T1 w) w- N* L8 ^5 d        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);& m8 x0 d: Z9 ]/ m6 k+ @7 W
        UARTPuts("------------------------------------------------------------\r\n", -1);
1 b) [2 a, \5 o8 F) L0 r; p; b1 S" W4 s& B! X. W' y

$ B" u6 E- s2 Z3 _, x" M' O6 A. u2 Z4 V8 ?
        UARTPuts("------------------------------------------------------------\r\n", -1);' U" ^! P! Z0 R
        UARTPuts("                    C6748 ECAP Test\r\n", -1);: X* t' S6 W! r6 |) Q
        // ECAP 捕获初始化
( Z' I7 r' L4 h        ECAPInit();
' I; @: ?0 c" ^/ z' w        UARTPuts("Initialize ECAP.......\r\n",-1);
3 B. @+ j$ f$ k" x  e        for(i=0;i<5;i++)/ f" l0 c, E' y9 F* B+ J4 P+ B
        {5 N( i! ~% ~1 B$ C# X
                    for(j=0x00FFFFFF;j>0;j--);            // 延时) L. ^! l. {  E: ^3 \
                    ECAPRead();
: `- ]. Y8 V( O* v$ g. n2 b2 U        }
1 e  H  P) p6 g# f* H        UARTPuts("\r\n",-1);5 y3 F& h0 W1 e# P% L
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);' I- D$ v# d+ Z3 l2 ?
        UARTPuts("------------------------------------------------------------\r\n", -1);. r0 F. p# C/ C
2 f8 ^. }* @# O& X) g1 v
        // 主循环. I# \( u/ T: H& d
        for(;;)  M" W3 \6 ]- {
        {
8 O: I- D( \$ l# ^
2 H: t2 u! E& T$ V* D        }
; m) _- M+ A- E}
8 c# M) H. t# c& C, @5 O* |9 t9 D- }
/****************************************************************************/4 K1 z; S/ ~9 a# L
/*                                                                          */
/ o% k5 f4 C" X- }$ L/*              PSC 初始化                                                  */
- Q$ D' \) i5 q8 ~9 d/*                                                                          */% A# u: A6 ^! ]3 x
/****************************************************************************/
/ ^+ t7 Z" \! G! zvoid PSCInit(void): i+ v) ~2 Z( B2 ?( }
{
! Z$ k: |% G% o2 r! B* h        // 使能  EHRPWM 和 ECAP 模块7 d9 w) b! E* q/ t+ c4 `1 v2 ?2 i
        // 对相应外设模块的使能也可以在 BootLoader 中完成
( w5 T: W4 w/ E" N    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);! C2 @7 v4 s9 n' [" O/ ?' y9 Q+ J3 K
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
5 \  E4 D% m. Y) R6 w}, H) j6 u6 M) [! F

. H0 q( }9 `6 ?3 Q- B+ x1 P0 z/****************************************************************************/' W& b) ?7 J2 ]6 R
/*                                                                          */
/ X+ B: q: i% U" |$ n( Q- U/*              GPIO 管脚复用配置                                           */# l$ n: J1 a2 E2 B1 D1 r& v, D
/*                                                                          */
8 z( d4 F) T! r2 L. g. Z/****************************************************************************/& X5 B/ h* g* n* b8 t
void GPIOBankPinMuxSet(void)
) e% S$ H. }7 O' F" I{* |- o" _5 U0 K' q! N. Y9 [- }' n
        EHRPWM1PinMuxSetup();( x8 v# t( p$ Z

7 N3 \% D, `* t0 e+ E        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
% F4 X! z) S% E/ ]  z9 K% k% v        // 作为捕获功能时管脚方向为输入" G- P, O6 g, `
        // 作为辅助脉宽调制时管脚方向为输出% k9 @. o8 e+ r& L# c1 ]; I3 g
    // ECAP2 / APWM2
( [! V+ I6 g  i# q$ \$ C        ECAPPinMuxSetup(2);
4 z; P+ c2 [9 |$ a5 k
1 z# e; q4 X1 y6 N+ w        // ECAP2 / APWM2方向设置为输入) r& ?0 s/ Y8 x( W% x: i
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]( ]) P/ _! b: ~
}
% X" C$ T0 I- `) D* t& i+ i+ E5 c1 h# X. i* m
/****************************************************************************/
8 b/ r* J7 G1 t& C/*                                                                          */1 T& @  ~. i8 r, G- N
/*              PWM 输出波形                                                */1 ^' }3 L$ b4 L+ q, n+ }8 P6 O7 E
/*                                                                          */1 O2 W1 ]# S  Z4 [  |9 o, z3 @4 p) ^1 P
/****************************************************************************/" u/ s% w1 D' d& b
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio): b  R6 Y5 c1 W$ _$ {- u! ^
{2 |; a5 p4 j  o2 I  I; a. O$ f
    // 时间基准配置8 |3 m1 g, w5 |. b
    // 时钟配置
. `/ K8 l8 ~- W6 b    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);# X" v1 c0 C2 n1 ^
- L6 K; O2 r! Z  b: y7 a
    // 配置周期: O6 `, m' F- {. J. k1 [' k. ^( `
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL," T1 S# Y" Q+ V$ P4 t1 H7 i3 E
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);: b9 M4 e% o  q3 T4 C) }
0 u" ~1 K! O2 N: u# x6 S' A- e8 }
    // 禁用输入同步信号
" V5 b& J# C# m( @8 E" M7 g  N    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);; S# M. c% Z/ T

, l. |( w5 a* N6 L: z/ ]2 K6 m    // 禁用输出同步信号
' s6 z3 t! F( |/ X    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);" {7 `) ]8 b0 |8 L3 }) I
6 O% I/ Z1 r; n+ i9 A, j4 K
    // 仿真(DEBUG)模式行为配置
% U1 F* I) X/ y% S+ c% p* t# E% u5 E9 K    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);$ g/ ]  `* O8 O* U! ^

, M3 A) ?# _7 Q' G5 I    // 配置计数比较器子模块
" H# Y) G" q# l$ A8 b0 b  Y& K( G    // 加载比较器 A 值
9 g' L5 C/ f: }5 J    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
) n: {: F7 Z* K7 S                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);' Z! H4 U; [/ W, ~1 g2 M

3 x5 R: b7 {7 z5 \/ Q: R; e: X' O    // 加载比较器 B 值
5 E8 f- O: [) x2 z    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,. k* I- C, V9 h+ w
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
. ~1 h" |7 O$ j( l3 t. |; ?
! `7 s1 m8 G/ u9 A    // 功能限定配置(输出引脚触发方式设定)5 S0 _* _+ j' n9 U) r
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
: `6 Q# v6 W& ]  I, R    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
/ x2 W. P$ y' O3 `% h                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,+ Z. M+ J. h7 g5 V, t
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
$ x* @8 a3 f& H8 S$ }1 o
6 ~  v3 N4 |$ Y7 x2 @/ ~    // 禁用(旁路,信号直接输出到斩波子模块)死区模块4 X9 \2 ]  D2 T% V4 n: V
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
2 I" Z$ N" U& t. x' ]5 U8 q
6 T# e$ l+ @6 \9 D    // 禁用斩波子模块
2 F; {) Q6 Q; q  g$ ?) G    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);. I- y) \; H0 V$ v9 V  k
' K; c, I" s% P3 I
    // 禁用错误控制事件
0 e; t7 t7 K( f& M: p, n! ?2 U8 F    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
7 i' s8 }" w/ F$ u* F+ N) P    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
) A2 }! V: x' o# z  u: h! F* a, v$ g# }2 ~% t
    // 事件触发配置
8 Z% A$ J  n4 y    // 每三次事件发生产生中断
; v5 U. D  S' K" n    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);. Z7 R2 W/ g, T; T; A
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
  g$ c5 R- {+ i( Q* d( T    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);4 f7 m# }5 K& L
    // 使能中断
4 J! w" O# c& |    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);# Z5 W7 y2 y! u7 S, V$ H

4 u$ `3 X3 T3 j0 s4 s- R    // 禁用高精度子模块) B$ ?, O: I* I7 q) a8 c
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
- Y( \8 }- s7 H8 k5 g( O" S" t; E& M
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);+ |, l8 w1 x  W) w2 W  X! W' }5 `
}
4 X$ f3 X0 k1 R2 d
% _) I' F. ?0 xvoid ChopperWaveform(void)
5 a0 [4 Z6 ~2 L, e) v+ R+ e$ ~{
! r3 d) @5 ]. A! C    // 50% 占空比4 {3 f7 `9 Z; L/ K" c2 X
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
1 f$ j" g. \6 S9 M8 J    // 4 分频
- U1 H+ T* K! e4 q& K3 J0 _+ P+ p    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);% d3 X* v( M$ i0 @# o
    // 单个脉冲宽度
  f  S( i& S* d6 d    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);5 a! j7 p! a1 [& r: C) R$ P
    // 使能斩波子模块
7 O; A; N2 y+ q, p# o# }    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);2 M6 M" Q/ ^( D, E+ L
}
7 Q: ~+ @) P5 K% z8 Q7 ]" P- D0 d! x4 s$ I, P8 j
/****************************************************************************/& T9 l) e5 g; U# m" F' I: e) [
/*                                                                          */
( L# {' o' b" Q* y# s) C5 f  Z/*              PWM 中断初始化                                              */1 ?0 [" K" S5 d7 T4 R+ H
/*                                                                          */' t! J- V, U: T8 h6 S
/****************************************************************************/3 y9 q0 `3 ]3 |0 k
void PWMInterruptInit(void)7 R" s- t: y+ a4 f
{
$ s8 r- G+ s: x        // 注册中断服务函数# Z3 v/ N0 F- a
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);% p+ G3 Z$ t, h9 k/ _6 R& e
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
  S, w. J0 f3 x' J! W
6 ~" ~0 v; f+ t: B) ^        // 映射中断
" ~( |+ K4 B2 y6 n! a+ j8 G" x        IntChannelSet(SYS_INT_EHRPWM1, 2);
3 }2 d. H5 f5 ]' Z6 T3 Q; }) ]7 J* R* o        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);2 b" `6 i+ c6 X
& @- E2 n  f1 J" |& y: |
        // 使能中断" B# I5 n0 K1 j6 Q. A' t
        IntSystemEnable(SYS_INT_EHRPWM1);. [1 @0 s8 g9 f4 S4 e1 P3 w8 s
        IntSystemEnable(SYS_INT_EHRPWM1TZ);
" D8 V% o, C3 q) x6 G" v}# A4 u. o9 y% `

3 n8 v6 f9 W( P  n0 O. G/****************************************************************************/
" l3 U) j, @! Z/*                                                                          */" }* ?: F1 U! L+ l5 K
/*              ARM 中断初始化                                              */
# m! s1 W1 p6 s: [' b' i. `' U3 o* \" t  y/*                                                                          */
- D+ y2 D( z' a. k1 L; ^* z/****************************************************************************/
( h6 t! B$ A2 Hvoid InterruptInit(void)
- U3 |  u" K, r' B0 d4 C0 z{9 U/ d  H7 d' o) x5 K
        // 初始化 ARM 中断控制器
5 K9 D9 B" t2 e$ ]9 y/ i9 b# R        IntAINTCInit();! P- h- o8 h+ P/ l: @! |7 e. p

  Z' i' X3 K5 _  x6 G- g) \        // 使能 IRQ(CPSR)/ w1 }2 v( B# o+ a! l" ~
        IntMasterIRQEnable();1 P5 y: |! W4 N$ K: M. X; c
2 A) s* J3 e% V9 L+ U
        // 使能中断(AINTC GER)
' }, o3 z/ \% Z& \4 F        IntGlobalEnable();
8 U; {* O' G6 k- \
3 ]5 s& d8 p* ?' x2 q, W        // 使能中断(AINTC HIER)( F8 K  i. W$ V  r
        IntIRQEnable();* q& ?$ Y2 g8 @1 M, w6 y
}! Q' r" R; `- e+ V" @/ O
4 d" N/ g. W7 ^2 N1 q# I1 A

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/0 Z; V. Z: D9 H4 m
/*                                                                          */( D/ C" h9 _/ d: [: m8 _6 y
/*              中断服务函数                                                */
. T, F; ~; }+ u  u( b2 t/*                                                                          */3 q, f2 J, T2 W$ h  D
/****************************************************************************/+ `+ _4 G" l4 @0 V% o2 B  z
void PWMEventIsr(void)& V" G" }* i* ~- t, H+ g5 {
{5 H! Q2 |, r: z) M7 g6 b+ G" ^
        IntSystemStatusClear(SYS_INT_EHRPWM1);
* X6 z4 g# q! {7 L
) ], D; z1 g) M+ {/ |    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
- I. s! `8 M; D}
9 q/ G# O$ X! h' f  a/ n
5 v- Q9 Q! a" }# J. w  D0 Ivoid PWMTZIsr(void)7 ]0 \. h: y! L" M% x- s6 J9 V# E2 l& R
{3 H$ }4 w, _4 \6 S& |
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
% T; Y8 [8 e: ^9 Y* ^2 c. u: V; y; H# o; s
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);* \. D2 s% y! b- k, _& z( B1 Y- {
}
4 n+ @6 u- Q+ ?  t$ G: Q5 S
) s) C1 ~4 w- K; B- U/****************************************************************************/
5 O+ j( P0 z0 N* ^9 `9 X/*                                                                          */
: d7 v/ v& R4 a4 p9 B* x' i  M8 e8 e/*              初始化捕获模块                                              */; z! F1 X. t. Y' M8 M
/*                                                                          */
- b; k& F8 G7 W' D8 g  e2 K/****************************************************************************/
7 S" Z7 h8 f& t2 `- E, h2 bvoid ECAPInit(void)
. s& X3 F/ @& X{
* U3 \" k5 u" s        /*-----设置 ECCTL1-----*/
0 R+ k  k! U1 z0 I( r        // 使能CAP寄存器装载+ _5 [3 r8 Q. t3 B/ n
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);) j  K, M/ B% D) W( U
        // 设置预分频值.
3 w; P& s2 l9 s0 J, R" h9 W        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);7 e: U7 u: d* c% \( c" D7 K1 a
        // 上升沿触发捕获事件/ I3 C: a- n, ^4 G% f
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
: m4 T  Y. y: [% X* {        // 输入捕获后重新装载计数器值.6 t8 G) s( w$ a! Y; T
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
4 b8 H0 T* k; L. r7 A6 @
4 N* t- X  z4 M; m        /*-----设置 ECCTL2-----*/- C0 y! I0 l7 A
        // 连续模式3 d' [8 M. U5 E
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
7 h  q/ y, m! Z        // ECAP计数器TSCTR持续计数" `! d* N" B. s( m' y3 j1 m% R
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
- ^! X: S$ J+ ?0 n! f/ _& n% v        // 禁用同步输出和同步输入: i1 ^$ n& t% t/ p. t7 s2 s
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);$ ^8 w5 u) y: a
        // 配置 ECAP 2 为 CAPTURE 模式  ]) b2 c  G$ O, ?. m% N. |
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);/ h$ }- m% D+ O5 A
, c  C# e9 u; _4 O$ D
        // 使能中断
- ?: J( {) ^: P! c" V% B//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);9 i1 ^* s3 b/ Y
}
, d! R* k2 T0 s
. e, R( j8 f  A& L. H% |* h/****************************************************************************/; I9 }' p, [5 ~& L, N3 b( t( S6 f
/*                                                                          */, D6 I! |' T) y1 u1 U
/*              取得捕获结果                                                */
  P4 c& b. W1 ]# M' n" U' X/*                                                                          */
1 R/ B2 ?% b. x. f8 h* G- z0 |. k/****************************************************************************/
; ^. P  M! Z! }: g3 E6 G) |* Qunsigned int ECAPRead(void)% N2 K  F9 e! t8 ?
{( C" v6 h3 w4 N+ K3 f( [  O
        unsigned int capvalue;8 |1 ]- {! q  @" t! G
        unsigned long frequency;& R, |2 F# R1 a$ X

: G: W/ f3 ^, s9 G8 Z        // Event1 中断标志, u# z9 Z2 X" Z
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
# Q  M8 r5 I* V- {9 l        {
% l, h; |9 a5 R' D! Y' J                // 取得捕获计数  Y: B  K! [' _3 M3 r- w( Z$ S
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);$ D8 \3 M  ~$ n8 H. X
                capvalue = ECAPResult.cap1;! d$ f; n$ q, v

2 V# [8 Q- O! C9 k! K4 \& ]/ M                // CAPTRUE 模块 228M 时钟主频
, F; K; |# T: P                frequency  =  228000000/capvalue;
* H9 M+ G2 ]7 C- X  ~                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);! K9 d8 x+ t0 W9 M( i- q

$ s. W" Q. D5 T$ g6 A                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);$ j! }- Y; \( [$ s1 p3 I% {
//                IntEventClear(SYS_INT_ECAP2);
/ _1 B1 E( F/ V4 A        }
5 r( R  V# ?. ?' r$ V& n; w; s        return frequency;
- r" I8 S1 ], D; P}0 F& @$ m  z% q" Z% C0 L3 e1 [

作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。& j4 Y% c- M! Q3 d' L. m, f
[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