嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家  q% I" I: N' d: }0 v

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
* t( s" p4 I* c, f/*                                                                          */
4 G( o8 ~$ @0 C5 W/*              宏定义                                                      */! H& N$ A! v: L4 f
/*                                                                          */8 N7 l) h3 K* D% E+ m8 p: I
/****************************************************************************/
" K) ^- a3 [6 p, T" M- [$ F' B( d" R// 软件断点2 Y) _7 @6 h- C
#define SW_BREAKPOINT     asm(" SWBP 0 ");9 N5 y, R7 \$ |; p( s7 @! ?

! y1 F2 N  D& D6 ~// 时钟分频
$ i. |6 S  {! j  p8 m- P3 i6 M. q& c#define CLOCK_DIV_VAL     228: ]7 y, f, X5 p7 F  [

# ]4 ^. o! \( m% p/****************************************************************************/
. I2 G  h' ?! I% m# q/*                                                                          */
) B; e! [% Z$ ~- s! e! l3 A/*              全局变量                                                    */2 P& a' E: k6 \% E+ |
/*                                                                          */
2 b" m& q7 b/ e3 `/****************************************************************************/
1 l! z- e! H1 f4 Z% w( i; F4 h) F- jECAPCONTEXT ECAPResult;. y, L2 d  }# ^: ^. X/ |$ i

% r3 V1 D8 d$ o0 y1 y" P4 `& T9 A/****************************************************************************/# j9 d) Z/ J5 W' W6 K: n
/*                                                                          *// X; i- x1 S/ W, `4 q
/*              函数声明                                                    */* N4 `' e+ w2 G
/*                                                                          */6 T3 }4 V  g' k" G  Q4 [
/****************************************************************************// r* _) E4 z! A
// 外设使能配置
* ]0 T4 A4 @' [: |9 r7 lvoid PSCInit(void);! \7 E. a, P% N, T6 h
0 M- p" t# ]2 g3 x; u/ I; }- w: Z
// GPIO 管脚复用配置
5 b' U; C$ j3 k  Jvoid GPIOBankPinMuxSet();* B% v; s. }$ g9 Y
2 H( ~/ q1 V( `. k
// 产生波形1 M* [: W# l# R' @" k
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
0 o. b% t7 N& K, j: X1 ]void ChopperWaveform(void);" g9 H) p1 j6 S$ j) L

( s# l; M2 S5 j// ECAP初始化和读函数- B3 D: t' L2 S& B# s/ u, q
void ECAPInit(void);
9 J- }8 O# D# sunsigned int ECAPRead(void);- U3 Q% n% H- ]+ `; T

0 z# Z1 R% i2 h! h9 w- E. |; I//ARM 中断初始化; Z2 R, |) K! \
void InterruptInit(void);1 P$ l8 F! f* K' D; Z# q6 i( G
9 O8 [1 G, y. S: V
// PWM 中断初始化, \$ X; W4 t/ y; t
void PWMInterruptInit(void);5 n' i' C1 Y( d/ t, A
// 中断服务函数
! w' r" `; c+ v3 i& ~// PWM 事件
* q- s- A- w) y" T6 \void PWMEventIsr(void);! Y& h% X: G: e
// PWM 错误控制事件
! z: J  d- M; e& Q  U6 I% l3 |# Wvoid PWMTZIsr(void);
! @9 h- @0 ^& v1 d& ]* d* g6 y! G. e" s7 }' d5 I. X& H9 U
/****************************************************************************/: N* T  h! q) {
/*                                                                          */7 b& z( J8 m) }) }
/*              主函数                                                      */
' i' o3 k% X, ~! ?& q  s2 k5 W/*                                                                          */& [2 s  B8 `5 g& t. K1 R) l
/****************************************************************************/3 B* p# V7 A: N" i2 N: Q! j1 I
int main(void)
2 p3 a2 {/ g3 m8 X' ]! Y$ I{
" v2 f. J4 K0 T' \4 A1 J: _        // 外设使能配置
; |2 Z0 Q3 x% e3 |1 w5 P        PSCInit();
- c+ n- V( ]" m3 T4 i$ f9 B3 e: n9 o- J
        // 初始化串口终端 使用串口2! t2 B$ L; M6 w2 C3 p2 A$ T
        UARTStdioInit();5 D6 S) C1 H8 r- @5 H: C' z/ C
       
4 [+ s; s7 N+ X        // GPIO 管脚复用配置, ~1 r+ Q) h9 K5 }, n, y) E
        GPIOBankPinMuxSet();
9 l* e5 e# i! x) @
( k: t8 [5 a5 X% c; U4 ^8 X+ v        // ARM 中断初始化
6 C6 Q. [! H9 h; c; c6 L        InterruptInit();
; O' [9 d; A; D  ^) X& d. v" p' A2 Q" @
        // PWM 中断初始化
9 I$ d' q% D4 }1 W1 s        PWMInterruptInit();
$ E! ^% m+ ?- D! @( w( q  a& l% a/ s* K/ v
        unsigned char i;4 F9 n7 z! I  C6 p
        unsigned int j;% u  H* J7 o4 |( S6 G: D+ c) t
$ B: l+ b. l0 J' d* n2 L8 v: W
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
: [$ m  o; M  b        UARTPuts("------------------------------------------------------------\r\n", -1);
1 ?% d  ?0 g- M0 y. X! k9 O3 Z: A$ z        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
2 s$ Y& Z6 E3 V; h( q1 u        // 产生波形: @% ^8 w6 o7 y4 x
        PWM1ABasic(25000,50);" N) q1 X+ `+ n, j

6 T* A" g3 f" g% X0 e2 H        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
4 p0 h* `9 ]8 n0 l# m        UARTPuts("------------------------------------------------------------\r\n", -1);
; K2 p( h2 y) P6 ~% p* j& @+ ^0 L; [" r% n6 Y8 I

6 y! n9 y. s  n3 a. Z8 S
6 t) G+ J4 I2 }8 Q  D& g        UARTPuts("------------------------------------------------------------\r\n", -1);- }  n2 v4 ~+ F  d1 R7 S
        UARTPuts("                    C6748 ECAP Test\r\n", -1);
# Q( H& F5 T$ w( N5 T        // ECAP 捕获初始化
9 q# L" ?& R1 r6 M        ECAPInit();
2 n! d7 C0 l2 F        UARTPuts("Initialize ECAP.......\r\n",-1);
3 k* V) S% E9 v9 ]# R/ \        for(i=0;i<5;i++)
7 G8 W$ q2 N, n        {
! Y4 l! P  p( z/ E3 {! E  c' A2 `                    for(j=0x00FFFFFF;j>0;j--);            // 延时" G$ B, I7 W% `9 }/ v3 D3 x" t+ w
                    ECAPRead();- Z# c% u% c; U* X
        }7 K8 q8 x  i8 ?1 @# [- Q
        UARTPuts("\r\n",-1);& t6 l0 ?8 g1 E, o/ z2 \
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
9 M! ]9 v3 e2 X/ V& j        UARTPuts("------------------------------------------------------------\r\n", -1);2 A9 P7 w; R- @& J: Q9 k" ^/ [

% z* ^' N" U  s7 j, _        // 主循环) u, s8 R$ `$ ~0 O
        for(;;); l. O% g. s! U
        {# Y5 e4 }2 T/ Z/ N, j4 i
" Z1 c* O" ^* d" w; E* i
        }8 p( m2 ]. o: C2 V& Y
}: J% ~& ^$ j" \" j8 o0 e
1 p# f. H8 t# E$ h9 I
/****************************************************************************/
+ F$ Q$ z5 _3 r" m/*                                                                          */
$ C+ w# H6 o! ]9 r' q- U/*              PSC 初始化                                                  */
+ A: M- R: b5 P' S9 g+ U  I0 o1 F' b/*                                                                          */
5 l0 ]* P1 x7 A/ ]$ z& \/****************************************************************************/
- N/ }3 p. @$ R1 B, r) pvoid PSCInit(void)2 _$ ^, S) G5 z4 s; s
{8 O5 q0 [& n+ [# S7 P3 H
        // 使能  EHRPWM 和 ECAP 模块
% I' \6 {& `. |0 `1 t        // 对相应外设模块的使能也可以在 BootLoader 中完成
. b' e9 Z5 M- d$ N    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
0 w: l1 _( }( Y2 y( k    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
* u9 e: `( y, e* T4 G}
6 J7 C" D% B" f0 P& g4 y, ^/ a6 j6 c, z. @
/****************************************************************************/3 A) i3 `9 i" A
/*                                                                          *// N  f0 R. ]$ `+ m0 P
/*              GPIO 管脚复用配置                                           */; k2 U" g4 ]. i+ v6 p
/*                                                                          */
) U, w6 I3 c7 x; U$ F/****************************************************************************/( b) u3 X6 p- ]1 u! I: T
void GPIOBankPinMuxSet(void)) Q1 w  s3 p- r* R
{( G8 O* \# H& }( ?3 ]
        EHRPWM1PinMuxSetup();) o' L3 r8 @( Q# Y$ g; K9 r0 d
# \4 N0 A0 S9 b3 a
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
+ }+ w3 U  H0 f        // 作为捕获功能时管脚方向为输入
/ a# Z* @% B# n8 a' g9 V- Z        // 作为辅助脉宽调制时管脚方向为输出
  q. a3 c( c4 j- R3 e    // ECAP2 / APWM2
) F; |6 g# r- `, j# B# _        ECAPPinMuxSetup(2);
/ m; m% p7 d* ~. g, u3 U. O7 o  p3 ]
        // ECAP2 / APWM2方向设置为输入
1 _2 O" F! z( T5 l8 r' L        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]5 B8 w$ G) F' ?) C. d" @
}
7 @+ R6 i1 A- h$ ?% x6 I$ w# T' S9 I2 F0 J6 P6 r7 Z4 f: A% b
/****************************************************************************/
# q/ B2 {7 d2 j. _( p9 a/*                                                                          */4 O* b! p, g- c; _. Y
/*              PWM 输出波形                                                */
' C% M/ W5 a( U1 Y) w' \/*                                                                          */
5 T; }. U& J& ^( i5 K2 U8 @/****************************************************************************/
" L  i' i0 t4 ^* d# L7 S9 E, V) ~void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)9 }! G8 x+ W" ~9 C3 k
{
# B. }. E7 B5 U    // 时间基准配置
& s6 z5 c2 r  k. }$ e    // 时钟配置
9 X, A1 c4 q7 E4 c    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
" Y: Z% i/ p9 g: J: O7 B/ C3 M% l2 v* Z! D; o4 u
    // 配置周期+ ~# v9 \" {/ G) t. X8 u
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
7 F% e$ _" Z) W% h; A; l2 S- h( c/ `                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
' p. y, T: s+ E9 }- ]+ J
, \9 G6 t7 J# J    // 禁用输入同步信号" \7 j; R9 O" ]& P5 E% E
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);$ Y, K% z$ w) K3 l% ^
% u$ a! u1 F4 }1 O" R
    // 禁用输出同步信号9 D8 i7 x/ K4 u) r% L
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
" N- \" Z* C4 v2 D0 x8 C- g  U+ U: k5 Z. z. L8 F& ?* Y+ |
    // 仿真(DEBUG)模式行为配置
! n$ |4 Y5 y/ v! d, h6 |1 {    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
% \# X" I# G2 ]5 r, ], X6 x) @: a* n
    // 配置计数比较器子模块
- b8 Z1 q" O' j1 d! y    // 加载比较器 A 值4 b, D: E. d8 `; K
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
# p0 f8 j! E  i! K" ]) J& O+ H; Q                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
5 S3 x/ M5 k' v& k' K1 I' f5 W0 P/ y& n6 \* g/ U. S( o5 h
    // 加载比较器 B 值
2 k: P  ~6 p5 Y& Q- B* C1 x    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
6 |$ p3 |: M7 G% o5 l/ n! ?                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);9 F) E/ T' w( f9 I4 U

( T) t) K. {8 z# b    // 功能限定配置(输出引脚触发方式设定)
+ G4 A+ d2 @% ]; N3 a    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
4 y% ?+ z) |+ f* q    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,+ J0 B2 _- |. C
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
3 \: |; {: e7 b- q                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
- N4 u( @( H5 N$ J# w9 a( ~4 r' A/ ]8 K3 v6 |) M' d
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块, r9 m9 m: V3 j
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
, A) ^+ `' w+ @# G) ?0 Y& V% i  x: Q
    // 禁用斩波子模块
1 T0 _* G7 C# V: K1 X) a    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
3 h* Z5 _. X" Q) s
7 h% F; O( u% _+ Z    // 禁用错误控制事件
2 R2 s1 `0 T2 r    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);7 G- m) e5 g9 a
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);- }, ~% [0 m8 U# s, q+ w( m
3 r0 V- [$ h- f  W2 }
    // 事件触发配置
7 L4 _; n8 ?$ B    // 每三次事件发生产生中断+ K, J# t3 E+ Q+ j) L; u
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);* {( r1 Y9 @, E' h; ]
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件: Z/ d' n3 `, D& y. P* T$ q
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
* H$ N% v( M8 R7 j7 q1 R+ M; F    // 使能中断
$ d; W: c* z+ E9 H5 T    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);5 R. y" t+ K- [- G" w% |
, `- P8 G9 L0 a: t( n# Q
    // 禁用高精度子模块
/ `- i  c2 {$ O$ L5 P5 l- w    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
7 A" t; X, B( z; F
( y7 A8 _. A( U    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);. B3 ^6 U' K- D( p* }% ?
}
2 ^  Q: E1 N7 A6 W' q/ C7 b* B4 m6 Y/ l3 d( U% ^
void ChopperWaveform(void)* s" L: |6 r/ ^: x6 I' e/ o
{: ~; S% [1 Y' O3 o1 ]1 S0 M0 `6 g! H
    // 50% 占空比9 f; B3 C6 L5 l5 D* j' x' i
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
: n; h& V3 c& z/ p+ I1 {    // 4 分频
- Q. O9 J% ^. X    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);( e) Z( a2 d) w4 a$ x2 F
    // 单个脉冲宽度" q" u+ c4 i- @9 ~3 {' j
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);2 O2 d; i) e$ h! X0 e8 K& U
    // 使能斩波子模块! {% {/ v" j/ o6 [
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
6 x0 G6 ~1 a0 p  {* Y( n}
+ ~& a. u  ?7 k: o7 H9 [1 j4 l
6 \& F) @& R& g' R" K  T6 d/****************************************************************************/
5 Q: }7 v6 W% O" m: m/*                                                                          */+ b, |- q* ]& W3 S
/*              PWM 中断初始化                                              */( n. B" z$ \2 }% @  E& a2 r& o# m/ T/ Z
/*                                                                          */
, S% w. x# e4 Z/****************************************************************************/
3 |) e& k& Y8 j# v3 B8 \; Zvoid PWMInterruptInit(void)/ x) f3 a7 W% E+ z
{
7 a1 k5 y7 h& @/ K0 E        // 注册中断服务函数3 C% x' c" i+ Q2 g5 P
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);$ X7 G' F- X( d  Q2 P- i
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
2 B2 F; |; _- f: D
1 z1 c6 `1 d6 o! R. M        // 映射中断; u; D0 Y  I5 g, Y
        IntChannelSet(SYS_INT_EHRPWM1, 2);
5 [9 Q, [8 r+ j! [, k; B        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
! }: U6 T1 o  w% h- A) `
4 o& m! a7 S/ S- p  x        // 使能中断
4 ?! x/ K' Z, Y4 O/ S- p        IntSystemEnable(SYS_INT_EHRPWM1);
. l5 {# R4 {' X: \        IntSystemEnable(SYS_INT_EHRPWM1TZ);$ n9 g/ \: |9 x2 D# {
}
0 c5 P9 s$ `' |4 Y1 T$ n9 G' H) [: z' I6 N) |/ [7 T4 T
/****************************************************************************/
6 a9 L( ]3 q9 j. b) p" ?- W/*                                                                          */
* W4 r1 I% a# \, E- W: f/*              ARM 中断初始化                                              */! b$ f) L! w9 X0 k
/*                                                                          */. {- u$ l5 p% U, ^4 P7 l7 d) e% C
/****************************************************************************/# z: K6 u4 x) ~) a# t) I1 W
void InterruptInit(void)
. B7 l. z, h. \- b; |# E{
, \6 ^# ]' i" D* d0 c; g1 W8 [        // 初始化 ARM 中断控制器. z. y. l8 P7 B
        IntAINTCInit();
$ ]# L2 z2 A3 g; |( y) l6 r# m/ Q% U5 b, @8 w  @4 ?( P
        // 使能 IRQ(CPSR)
/ ~* b+ S- ]# A! n- u, u        IntMasterIRQEnable();
! d5 z* [! G: u" `' n+ b! q6 Y
2 D+ p3 G# p6 T( j) S! V5 ?% b        // 使能中断(AINTC GER): w4 T2 T7 U- c' H8 y
        IntGlobalEnable();% c9 u% ]/ K0 a( ~

, L6 f( A! \) n2 o        // 使能中断(AINTC HIER)# O! A; P6 N1 _% W
        IntIRQEnable();
0 F! Y/ E* a9 P0 y( T9 _4 j' h8 E}
3 i- _8 r( W, s1 U, G) c5 ?* _  i/ O$ _0 t2 _3 ~

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/4 B" M6 R7 R1 ?6 \
/*                                                                          */
' L/ l3 R$ ^7 [/ D0 V/*              中断服务函数                                                */! p! C8 ]& p4 N  [
/*                                                                          */
' Q1 b8 [, _, l) S( c) r, a- ^6 L/****************************************************************************/7 P+ t  c) D) o. M4 N: L
void PWMEventIsr(void)
6 W0 C( C3 u- f2 B{
6 q& W) ]; E0 R2 B  \        IntSystemStatusClear(SYS_INT_EHRPWM1);$ R) s5 v9 s" _" R; V. e5 A/ r

+ @9 V% g* W( u. ?) o5 f' @5 A" m    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);' O7 Q' r: d  V: h9 Q( P. n( P
}
, L! O5 U3 R" I$ @0 K1 T" t) R$ k# }! N$ ?6 x2 m* Y6 D" `- Y
void PWMTZIsr(void)' W( Q& X" s! R3 P4 }$ ?, d& V: h1 i
{, |) K7 T! q$ j
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);# Q- S% M$ p6 N8 |( }
( V: u; |& E" F& ~
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
9 L( t$ r% s$ z3 w}
9 I- H# w/ B& {0 g
6 g4 a  m8 _) a0 t5 X* v. u' i/****************************************************************************/3 x+ e  O; Y* x& S. O
/*                                                                          */
" r* l7 z  k/ e9 g7 f' @. i! o/*              初始化捕获模块                                              */
* b  ~  F. w& n. L  |& q/*                                                                          */9 U5 e! p- ?! h& ~" S# i) ?5 k
/****************************************************************************/
  Y, [- o: s6 _void ECAPInit(void); i& M. f3 O9 C2 v
{
# `5 r$ G$ Y2 t7 l' n1 D        /*-----设置 ECCTL1-----*/
9 _( z" U- D# V* p- o& G        // 使能CAP寄存器装载
4 ~3 B9 }1 ~* x" V% G1 F: g, I        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
- V6 C5 D/ T6 q, U        // 设置预分频值.5 w5 B* {* b# S
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
- Y+ ~7 ?" Y: L# p        // 上升沿触发捕获事件
" z0 w7 x* {9 R; v. k2 D& m3 h        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
' O* ]: R8 E, `9 t* g        // 输入捕获后重新装载计数器值.- a- q/ K$ a# r6 {! N( j* i
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
$ ^, B0 Q  d1 r+ Y1 L! j3 ]% I; \6 {" Y4 x4 V; r$ F$ B
        /*-----设置 ECCTL2-----*/1 a  E9 F$ g7 c6 Z- e  F2 I+ m6 Z) ]
        // 连续模式
2 b! g6 X! i( c& F        ECAPContinousModeConfig(SOC_ECAP_2_REGS);, t( _/ |) E. J' X8 O! e
        // ECAP计数器TSCTR持续计数9 e0 y! [7 N$ z# @3 F
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);- q2 i3 h1 M' @7 E
        // 禁用同步输出和同步输入) p% N+ B3 Q! w6 A! a, t
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
- H. o1 O/ O% G6 b& Z6 K' ?        // 配置 ECAP 2 为 CAPTURE 模式& M0 _4 K/ N, K1 s$ u3 T
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);' `/ f: g0 U; ?% B: w+ d& h

' V8 U! w; ]. B6 R& {4 B) f        // 使能中断
) F& P% e* G5 }6 b, I//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
0 p! x- t7 z1 L& ], @9 [}
/ w3 k$ Q7 ]/ `! s9 A# f/ R$ f- `7 Y* a
/****************************************************************************/  `+ ~; ?$ Q. D2 r9 o/ [8 G$ q- ^
/*                                                                          */
8 L+ J7 s2 R& t  W* x/*              取得捕获结果                                                */
4 K* Z! B& M0 M" M) U0 ?& f/*                                                                          */' k7 p' f9 g0 M5 D% I
/****************************************************************************/; j9 M% [8 [1 }; r8 H8 |
unsigned int ECAPRead(void)
( b! J1 o' u, |2 U1 D{  ]  e9 K* t* x! p
        unsigned int capvalue;
4 v% `5 n7 e* g& b5 @; Z        unsigned long frequency;
0 Z4 E4 B6 x0 n& h
* c1 Y$ u; Y5 m+ X        // Event1 中断标志. ?5 ], p/ T+ A+ [6 h! `  V
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
5 o# _  Y& o. U1 ]+ z- r        {! d7 _  H! B" _2 Z& y- C9 x; w
                // 取得捕获计数( [1 c; A; w/ J6 _: ~& _
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);( I4 e% q7 L, F( E
                capvalue = ECAPResult.cap1;
& j" d  `7 G7 }1 Q1 `8 {9 z6 c0 N& S4 P8 d. b) m/ U
                // CAPTRUE 模块 228M 时钟主频
, G# [% J9 P, s" x                frequency  =  228000000/capvalue;2 g% b: b; `$ [2 H* N% w: G
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
( K& i( Z9 h- u/ u* y. L4 j6 P
$ @6 |% l3 F  v. t6 e. I) `                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);6 _4 S, l/ I( R5 s
//                IntEventClear(SYS_INT_ECAP2);
' M* j* G# g' d1 G        }
2 W) b  E0 ]+ h2 B- e        return frequency;4 j% |4 a( R% A8 h
}( G4 ^7 x& m8 K

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