嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家5 B; @0 T/ _$ ~

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
+ d& [, W$ P% u8 V# \% N! j/*                                                                          */
" B! A5 J; I6 Z8 [, h( d* @. B3 ^$ T/*              宏定义                                                      */
$ \4 Z! r! O7 u7 t7 q, _. l/*                                                                          */
8 [- ?6 C: o! N. N+ B( m( D/****************************************************************************/; B) S' m1 d5 q4 T0 @& B: c% |
// 软件断点
2 n2 s2 d! B7 V: f/ `: U1 D0 s#define SW_BREAKPOINT     asm(" SWBP 0 ");# V4 ^4 |: U# Y8 L! T: r( q# T1 @4 M

9 s. e: |3 f$ ?/ t+ p// 时钟分频+ p% H/ p+ z- L) r+ ~# V
#define CLOCK_DIV_VAL     2284 V7 R* ~6 e* s& r! g5 K

7 j4 A" q; F* N! k# k/****************************************************************************/; o8 w) _4 k5 ~: a" N( {: `+ P0 r
/*                                                                          */
% u0 @; _0 w, ?: F1 M4 T+ ?/*              全局变量                                                    */
4 Y/ F2 {9 o* v/ t, R" V" G+ I/*                                                                          */
$ Y3 k9 G% N; q/ z  S# R: @: p) k/****************************************************************************/
5 o+ w" V0 [3 r! MECAPCONTEXT ECAPResult;
# C) A* |" p0 F/ s! [5 z+ W7 K
" y+ @$ X6 {6 O& K2 b/****************************************************************************/, Y7 X. b( U3 _' E
/*                                                                          */) d" B  `& E0 C* G9 {3 Y3 I5 K
/*              函数声明                                                    */
. ?/ D% E; w% ^# U/*                                                                          */. J2 a, {! X! h0 B+ h7 ~
/****************************************************************************/
; ], Y/ e  e0 W6 V9 E) H7 ]// 外设使能配置
7 W3 l: {  Y% Q# V& T0 O- zvoid PSCInit(void);8 {: _# r5 F) c/ U  n% x
/ @: ]5 k7 ~8 `- n) B
// GPIO 管脚复用配置
! T8 |* [+ V& [: F# [void GPIOBankPinMuxSet();
: h4 R2 M' I( O  V' f
8 y0 R7 m' x0 [* u  i// 产生波形
. }, L% S1 r1 _/ r, Qvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);5 Y4 B% m1 x# B4 H6 ]3 K: L$ s
void ChopperWaveform(void);6 D7 g8 R, s! w0 R0 F
: t# J  l. O9 B; M. B
// ECAP初始化和读函数3 @7 P  f3 R& a" t! g2 k
void ECAPInit(void);: M  ?( B& }8 y% o2 E, K  w* S
unsigned int ECAPRead(void);3 n$ @: e+ p2 L' P' B

1 y" S6 e0 A- |7 T5 ^- t! }. @//ARM 中断初始化  z7 ~+ B) P9 e. i& {; W
void InterruptInit(void);
  {/ \1 g# r) X2 U
: g& [* h1 S3 @  q// PWM 中断初始化8 z% w6 B% o7 h9 B$ G  e  e- i
void PWMInterruptInit(void);
# \+ v- n0 n* ]// 中断服务函数
( }* ?) ?8 k% J3 _: x1 U// PWM 事件" E1 T% s* ~  z. J7 K
void PWMEventIsr(void);- v4 G: E& s1 }1 |
// PWM 错误控制事件
1 C! I6 h6 `4 `0 M5 Y: P' l4 s( Vvoid PWMTZIsr(void);+ x6 k5 {; F# S  C4 V) P; Q# ~
" L# k' J! o( M
/****************************************************************************/+ V) @9 u4 u1 O
/*                                                                          */3 G5 R7 f( s/ [$ {9 c; q& d7 n& K
/*              主函数                                                      */
1 g2 S' R7 D( y% `6 m/*                                                                          */
' p9 D: r2 Q( \: R/ j; e# y7 f/****************************************************************************/
+ n6 \5 L2 I) c7 Oint main(void)
+ D0 s5 i( t9 R+ {* C{, W% u5 d' W/ Z- U
        // 外设使能配置$ g6 c1 E. K% v4 |. L
        PSCInit();# s# T: L& K- g/ l

2 k/ D. u7 S8 ?/ d  M6 V        // 初始化串口终端 使用串口23 }7 U6 a" B+ N
        UARTStdioInit();; {. ]% @. B$ |. e: i; g
        ( W+ \0 P, t& }8 ~- w
        // GPIO 管脚复用配置; I5 Y: b0 F. m% W# N4 @3 w
        GPIOBankPinMuxSet();: g# k, r) C. J4 X1 A
% i/ i; i& S3 t9 m
        // ARM 中断初始化
+ V& ]: E" t* a: i' ~        InterruptInit();0 _, Z: }  @$ J2 U2 A4 M0 A$ c& a  J
0 v" {* C9 F0 V5 K/ K
        // PWM 中断初始化3 V8 U* R& W  d; u' e
        PWMInterruptInit();
9 e) ^' D* w# ~/ x& t: f( |( E' b! |$ w. v
        unsigned char i;$ y% b8 a* v$ `+ j8 Z) M) G
        unsigned int j;
* m& d9 {) `% c* q+ E" G% A- J% X1 K6 |0 i) H! l5 C0 ]# B0 m- x
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);. T' M! s5 H( ]
        UARTPuts("------------------------------------------------------------\r\n", -1);4 N$ X2 @* Q: y: E
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);6 J2 ?( r4 W5 `/ M
        // 产生波形
( E. `0 j1 U0 ?$ a# j        PWM1ABasic(25000,50);
8 x; g- k7 d2 G) s; r2 k' t2 D
* c; v4 f) j* J8 X* J5 \" g        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);0 |& S% W4 E1 @( g
        UARTPuts("------------------------------------------------------------\r\n", -1);9 Z# R! F) u$ Y( J1 B2 `+ t

0 P. r- ]# @, E. o% ^2 {* c4 ^/ a$ d' F3 E: U8 u

3 B2 a3 o6 }  O2 z3 `' S6 q        UARTPuts("------------------------------------------------------------\r\n", -1);9 g2 E4 w' L$ ^, H2 b
        UARTPuts("                    C6748 ECAP Test\r\n", -1);3 f* M* {5 @- _/ p' l5 M
        // ECAP 捕获初始化/ O  d* T- z) E* X* @* y4 \4 ?' O
        ECAPInit();
& ~, o* }, W# u! `" r3 U        UARTPuts("Initialize ECAP.......\r\n",-1);; H% I: g& U& `# G9 U; A" |
        for(i=0;i<5;i++)
  j, ?0 n: m: o7 D5 X7 _        {
3 n/ Y6 Q" t; Y1 M- }2 Y# C0 _                    for(j=0x00FFFFFF;j>0;j--);            // 延时
: F$ x0 p6 z* @$ v" q9 ^7 ~8 N                    ECAPRead();
- q/ }8 G% d5 K. ?9 T: ^        }' W0 ]* y, x5 g( Z, A
        UARTPuts("\r\n",-1);
( Z# P% j" U% G- C$ S: j* X% n; j        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);, h1 x9 s1 c8 ~# G
        UARTPuts("------------------------------------------------------------\r\n", -1);
, S( u$ G' U% M5 b0 P" p
2 x! Q2 i; x! ^( d7 N& d3 F# i        // 主循环4 [. @% I" O7 w
        for(;;)2 A* s# Z; H" _8 l
        {
" q6 L& n7 s4 t  C$ |$ Q0 i0 ^5 E
7 r$ {/ G- L% w8 T        }' j  d1 p/ t7 m0 J! T" L/ y1 P
}
9 m5 }  T5 P. ~. m, k) b, K5 ?% Z/ s# q* {
- U" [- w" `- |/****************************************************************************/
% T! K( P5 }7 X3 q2 C+ ~* n/*                                                                          */& H$ g. K: l+ e. x
/*              PSC 初始化                                                  *// a9 f& K; f% J5 w# C7 n9 `8 c
/*                                                                          */. m. H: m3 l& @0 l& p
/****************************************************************************/% g4 Z1 \! J1 L, D9 a, A& o+ V- K
void PSCInit(void)6 h9 w' e! M  l8 r
{
! D0 X  ?: U. [: h5 Y% M        // 使能  EHRPWM 和 ECAP 模块
  [' C0 e, ~# v1 c        // 对相应外设模块的使能也可以在 BootLoader 中完成! q. H! E. y- t$ a* L( V0 G% K
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
  J% y+ O+ C" _: S9 M    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
/ F6 W( L, a5 w- k+ G6 c}
+ m- p0 Q- p( X9 y* U  Y5 s0 n7 q* b- ]% Q1 @$ N
/****************************************************************************/0 @2 @) s, r; d% A# V0 ~
/*                                                                          */# r# ]7 n4 ~0 C: Z5 m
/*              GPIO 管脚复用配置                                           */. W# C0 h, s: d
/*                                                                          */
- w1 Y7 H$ T' T0 E8 X) c3 K: l/****************************************************************************/8 r7 R, T1 v$ X2 ?7 x& p6 Y
void GPIOBankPinMuxSet(void)$ ]8 \! x$ D8 a) f2 J, q! y0 L
{' o! P. M" c3 J  Z9 t* V4 z
        EHRPWM1PinMuxSetup();' E) ^7 H7 N! T% J% K

) N" I* o1 Q! {2 r' I        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
8 ?5 w2 Y" t# L2 i: p        // 作为捕获功能时管脚方向为输入/ }- ^# l: x- s6 b. m
        // 作为辅助脉宽调制时管脚方向为输出' S# `2 X( e1 o6 S9 i! B
    // ECAP2 / APWM2
1 _$ g# B1 c9 U, _$ z1 ]        ECAPPinMuxSetup(2);$ O, c5 A& D) q5 j- L) j3 e
7 H* B* O" `! u9 G, l; P
        // ECAP2 / APWM2方向设置为输入3 u) q. D( X5 W* m6 t
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
) K8 b5 b+ l* y7 O: S}
- q' P- ^+ W0 k* E, K! J4 G" g  u& q8 j' w' a8 d9 j
/****************************************************************************// l" A9 e- ~. ]9 S7 s- [
/*                                                                          */
* _/ `5 L( c; P. F3 ]* w/*              PWM 输出波形                                                */- R9 B' C7 A) r# e* R% x2 d3 f
/*                                                                          */
, h5 t, A. e) a- J0 G+ v/****************************************************************************/
& W0 t4 I' `1 o0 ovoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio); g! j: d$ ^3 S& _" k; ]
{
1 {7 }2 ^% x# R% h( M    // 时间基准配置& m& ^, r. _) u% W# P3 K. a7 @  @* @( b% B5 y
    // 时钟配置; B- J# {  \! U4 k+ H* Q7 ^
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
; v% T: ]/ R& {' c# }* @& T
2 R* @- j* @2 j2 i1 h    // 配置周期- h: B0 G+ o! @6 w' [+ b* }
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,( i/ N+ c& F5 n, \& C. x2 ]
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
% n* @4 Z; o$ w5 {" N& r; _9 q5 {3 y5 W$ q% A. K, v! \6 {
    // 禁用输入同步信号2 q8 C# [/ @, p, B6 t
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);; S6 T! y1 f) v) X. p3 @

$ U7 x: C& M+ G" h: b6 _    // 禁用输出同步信号
& b& A- C0 R4 |- A8 d    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);, z/ J  O  g" ^8 K' b8 T7 A, j

" Z+ p* |& V- D$ B    // 仿真(DEBUG)模式行为配置: O( ^- x: z* i( ~
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);9 t+ V7 x: l" {% H

- m/ W- B$ `$ ?) `    // 配置计数比较器子模块
2 ~; p* @# _- K- r; S2 K    // 加载比较器 A 值
$ ]" |( m1 S# P2 w! I8 [5 N5 r    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
3 ?  C8 t" t3 Z/ [4 ^. R                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);3 E1 A. E1 M- W* A9 M

& k* h9 l! n( u! `1 B    // 加载比较器 B 值
% o* B! c+ R# f5 h1 _    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
; u: c( h0 S$ ?0 V2 y                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);( z& F- F. p0 K8 j- Y

  d. C8 Z2 H6 y% J# ^& J    // 功能限定配置(输出引脚触发方式设定)9 J4 o3 g; r/ v( I
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出. p1 D9 Q* `" ^$ r
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
# i6 {+ H6 v9 Y: \                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
. `4 b$ y9 [1 ]3 s6 Q* N2 @                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);! a" z0 z, p& x1 [

% \0 x( Y* y& l* r+ {    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
$ a* _' v: l! ?# ?5 g+ M+ x5 a3 k    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
$ [' G. c: G2 R+ z# r" J% J1 N  O/ V* D. ]5 V8 o
    // 禁用斩波子模块1 B) N8 X9 u- W8 [! y& f* k6 [' E- T
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);- y6 l6 B5 l2 e9 F
5 Y# r  O' M* [) `
    // 禁用错误控制事件7 u# L5 ?/ g. ?! n9 s
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);5 @0 V6 S& \# h" _3 ~
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);) _$ d7 i5 R4 W
- D; O2 V( X# ^9 B& ]0 V3 t
    // 事件触发配置2 \2 v4 C, l9 ]$ r4 [
    // 每三次事件发生产生中断
# S5 w/ N1 T1 f    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);* n6 L' K0 G0 r
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
  W3 c& u) G+ I% H9 T1 e  G1 J    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
$ v+ ?/ M) P5 O& m$ x    // 使能中断
+ r2 O! p# h+ y, q    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);6 Q# a& @: T% Q8 s6 a& [

! y0 o# l7 \% d5 i0 s& n8 L    // 禁用高精度子模块
* O% `8 i5 Q& h* h: M    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
8 E$ a, o  s4 O8 k4 W, ^' X6 ^4 h) r* h$ c2 I+ R- ^
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);/ e% }( Z. _, h  V# \1 a- d% f" o
}. y4 @2 r8 r" P+ H% w- J

3 M! w3 N  M- V" p0 ?9 vvoid ChopperWaveform(void)
/ M; B0 F5 C8 \% s' `, m( b, U{
# G: a; ?0 x$ l6 \" d# I# m    // 50% 占空比
) I, I4 N7 V2 l0 J    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
9 c4 y) }. C5 S6 s6 z+ b- Z5 q  v) A$ ^    // 4 分频
& H# y3 }5 N+ d9 T    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);$ e3 g4 }( @' Z2 d2 @/ \9 h& V7 ?
    // 单个脉冲宽度- {: s* b! w( H, ^& V3 r* E- V
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);# E9 n* n6 \2 i' K7 X  ]; p
    // 使能斩波子模块
8 R; `& f4 G. D7 G* W: J! y    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
. ~5 W; Q; S7 H& \3 i3 M! K}! q3 ^& l6 k% R( k0 k

; ~* r9 x3 Q9 _! c$ b' k/****************************************************************************/
( O! ?1 |* z( a2 h9 U9 J5 f; r/*                                                                          */
* B9 v6 D: |1 H! J+ H3 G2 H/*              PWM 中断初始化                                              */
; T6 i% j( m/ T2 Y1 @2 B/*                                                                          */: O8 V5 @& Z& B* M' f( ^' S
/****************************************************************************/
7 K  I7 }% J/ K  lvoid PWMInterruptInit(void)
! i. P* G) E6 f" r{* T$ ^- e& p& ~0 S
        // 注册中断服务函数
, c" T' Q% S& ~! Q( V4 ~        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);8 c" K$ v3 E0 O, q$ H
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);3 d0 j$ y  M# \3 ~/ i5 y: f

) ^* J3 \) ]1 d. l        // 映射中断2 `9 n3 e* A1 d4 |/ p
        IntChannelSet(SYS_INT_EHRPWM1, 2);+ ]1 b5 u2 f+ D  C3 l3 Z' X4 S
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);4 C* q8 t; i& ]' E9 G. \0 }

% R* B& G2 W# Q) `8 O0 s        // 使能中断
) S1 E9 c2 v# ]& M/ J# q+ T/ H( X( x        IntSystemEnable(SYS_INT_EHRPWM1);
2 i+ R1 H; t) B" M& h5 }* T  G        IntSystemEnable(SYS_INT_EHRPWM1TZ);; d3 R- k, ^9 S2 V( w' z5 w! w$ X
}  Z, t1 T$ r8 O

9 t1 j1 E8 ]  M. F. k; O6 F6 {; V1 u/****************************************************************************/* H( _" P( s! ?5 a% T3 N/ @7 u
/*                                                                          */
; B$ z1 v* R" D" ~. E" @/ |" z/*              ARM 中断初始化                                              */
8 E9 O8 ]9 g; Z" E/*                                                                          */+ S. {) w4 W' L" b
/****************************************************************************/
/ J& h* n- i2 [) Y5 f  wvoid InterruptInit(void)- l: A. q/ e& e( k
{
* j: f- g, b6 Y+ U. n4 [        // 初始化 ARM 中断控制器
* _* I: n6 z0 T6 x1 Q6 P) P5 N        IntAINTCInit();
1 \# B  J, R2 @4 c. z# E( y! W& P/ p8 A) c) t+ r
        // 使能 IRQ(CPSR)  p( L, B, \0 l3 |4 A) d" L- {  S
        IntMasterIRQEnable();" u, o/ v- D+ h0 D% E0 n

1 j* P% O/ j% V% Z1 }2 }        // 使能中断(AINTC GER)- A% x8 S1 j9 d: Z# A
        IntGlobalEnable();7 j* e* n( Y# V$ a/ y
' \: E; }0 g6 N9 d% @2 ~
        // 使能中断(AINTC HIER)
) J" K  B0 F( Z% L        IntIRQEnable();
8 D8 \; @# ]4 ~2 U9 g9 k}
! w/ \/ d3 m! j' d6 w$ n6 h2 L' d9 e

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/
+ n; i1 g+ ^9 k4 U( K. [/*                                                                          */
( {. w: P4 S( {& `5 W/*              中断服务函数                                                */
  q; k9 I( S6 @/*                                                                          */
, i$ D$ r8 ^" a% B0 I/****************************************************************************/: J+ z: ^. J4 R( o( t; X
void PWMEventIsr(void)
, F' m; e" h2 Q' u{
5 |# V& p! T( N! ^% b7 ?        IntSystemStatusClear(SYS_INT_EHRPWM1);; W' e1 b. K- D3 Y. ]  N& v7 E
# O: v! h: @( g' s
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);3 W0 j; O3 L  o
}8 h1 h) I* ^) f% l" H6 h% D, j

& i3 o" l+ s- S6 e& I/ k7 T8 rvoid PWMTZIsr(void)% z  L" c# T+ `9 \) G0 }5 I
{
- h1 B+ S% R4 }4 v2 \. c        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);9 Q( R" c4 k* B3 |' Q! M
1 D9 |) K0 j( h7 ~* [) ?, [
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
* R/ d. ?& b# K+ P4 g3 h}) z( {6 Z% ?& K  A3 N
* h. Z" q6 ]4 u) y
/****************************************************************************/
1 m' n. [4 I* ?8 B8 L! \/*                                                                          *// J; W* s$ r9 }/ a5 C
/*              初始化捕获模块                                              */
$ V( f+ @( G4 C& Z5 [3 z* _/*                                                                          *// ?/ ~5 K2 p* O1 m0 U
/****************************************************************************/
- W0 c8 w3 U/ z' N) U4 |void ECAPInit(void)$ G. l3 `. e( E, ?2 V, c
{
6 y5 ^. t8 F' ~8 }        /*-----设置 ECCTL1-----*/* Q9 F* S! r" Q5 X; d8 m
        // 使能CAP寄存器装载
6 ?8 l- w$ t% x% l1 y' y7 U  v- @        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);( [/ K" x% s8 F2 E
        // 设置预分频值." k; q* n, t! M0 X! T
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
+ T9 E- ]( m7 |* S. z, i: s- A        // 上升沿触发捕获事件0 F- f9 Q3 U, H! v0 m1 w6 q  [
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);" f3 h" K* G$ D- b6 E$ Z
        // 输入捕获后重新装载计数器值.
2 S. `9 @. a) p# ]  D) x        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
8 J: R4 A8 O( [' D% q
( Z! u. g+ v/ ?- N2 Q        /*-----设置 ECCTL2-----*/: I" M5 F) h- C: k9 b% V
        // 连续模式
2 ]7 z- l! D8 n/ U2 i        ECAPContinousModeConfig(SOC_ECAP_2_REGS);. a- b/ F9 c$ S: _& i" f
        // ECAP计数器TSCTR持续计数
6 J, C  p! b/ g7 w, |" n        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);- Z0 A3 h% h  ?) N( `
        // 禁用同步输出和同步输入" g4 q8 g/ Y9 E, {0 D
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);; W; r8 h1 ]0 b/ T0 q& k6 M9 `( D/ f# r) K
        // 配置 ECAP 2 为 CAPTURE 模式
7 E# Y+ y& s) Q# ]& a        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
7 {7 N; J; C0 Q8 P# {& X; f' Z- K" F* @; K- Z% Q" Z& d
        // 使能中断) e4 k) Z6 \$ X7 R# C( p# A  X
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
* Z6 t9 P1 Y( N2 M+ |' N}
. M" T* o* L* t( S  ^
# Y% `0 J1 V8 ~, @1 E2 C: C* j/****************************************************************************/
& l6 `& I7 o. A; `) t( @/*                                                                          */
  g& j( `6 T) f/*              取得捕获结果                                                */3 g$ _2 f) B0 L7 H: F* v
/*                                                                          */
2 M0 S  ^7 @4 A  _* a+ Q0 j" a; Y/****************************************************************************/- l4 c) s; l+ a' {
unsigned int ECAPRead(void)6 m& |' B8 l7 J6 I
{
' ]8 S" `2 h! P# L7 j" J        unsigned int capvalue;# ]5 P) C( i# G- `) L
        unsigned long frequency;4 N5 n$ h; b5 ^, |

7 U- U# l$ x! {- F        // Event1 中断标志" |2 X) ^3 i8 l, u; ?4 H
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))" J9 Y2 Q  l& s$ |& s& d9 o+ h
        {
6 r2 \  o  U8 c  l8 J                // 取得捕获计数% e, \$ D$ A2 _% Z
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
1 a% Y4 W% g  i" g& U3 {                capvalue = ECAPResult.cap1;" z1 d4 `! Z  x' z1 ]9 M/ J

; z2 Y0 }: A+ L3 Q" V3 e                // CAPTRUE 模块 228M 时钟主频, @  g4 e3 u' g1 x9 O& T" ]$ i% v
                frequency  =  228000000/capvalue;# Y% W0 j( r- h: m, J
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);; {8 }/ i) j0 U# K8 k
" B! ?! f4 K& h1 N# E7 Z7 k- k
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);0 G' P7 J  X' l% i) l$ X
//                IntEventClear(SYS_INT_ECAP2);' K- H, [. t* w7 Q: r, K, D
        }
) h3 c# |+ J2 ?1 p) ^, q        return frequency;5 Q2 U% o6 t7 T1 D& q  f( Q
}$ f0 g1 M6 W1 N, s

作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
* `- P) t* O% `6 q  M[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