嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
5 k/ F8 k" b, L. y3 {( i
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/+ D) N% t1 x) {' d, [8 l+ g
/*                                                                          */
& r6 z. S. c! m0 [/*              宏定义                                                      */
4 C# K! c* V3 j/*                                                                          */
( {  k% \6 K9 Y$ @5 ]; _/****************************************************************************/6 C- Y" N- c( y
// 软件断点3 A2 f2 C6 t7 t" |/ D
#define SW_BREAKPOINT     asm(" SWBP 0 ");0 F' M! d6 K) S# t. h" p4 j1 [  p# A

3 y( s9 G7 Q( _$ p8 W8 i// 时钟分频
4 S7 t4 Z; j9 d+ M#define CLOCK_DIV_VAL     228
' S4 M- k, C1 e  _! b
  P! k/ J2 t, D2 a; R3 s- N( m6 d/****************************************************************************/, N: Y" U. Y1 F! h; E7 {" g& u
/*                                                                          */1 C' c" ]/ X- S" \6 J
/*              全局变量                                                    */
+ p# ~; k+ ?& ~6 c! \$ j# L/*                                                                          */
, a% V- S4 b( X7 U# S+ ~9 C! l) ]' b/****************************************************************************/
2 `; {" F, G9 tECAPCONTEXT ECAPResult;; ~9 |# }$ ~9 _5 W, X

3 v5 F  {  S9 E7 X/****************************************************************************/
* r* l  ~; f, I, ~/*                                                                          */
  f: [1 ]6 u0 r, _4 S/*              函数声明                                                    */
& Q. t: p$ @; o3 K$ A/*                                                                          */. D! @8 ^6 g! F  _( [) k
/****************************************************************************/5 S. e& Q4 O. I9 H" ?
// 外设使能配置
! f, ^: f- @- j) uvoid PSCInit(void);9 _- Q- C0 A. Z0 L+ L
2 ^3 q$ |3 a/ o2 u+ x
// GPIO 管脚复用配置
' W3 E" Z7 |5 ovoid GPIOBankPinMuxSet();7 G4 B# n/ P( m: C$ W4 \

& ~# S- m* R/ J& c: W- E; B/ P+ d// 产生波形
  u  x2 j7 y. H2 k" }void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);* K" \. w  \1 [+ y! ?9 z
void ChopperWaveform(void);
! Q, @: N8 ?6 t* y. z1 B- s* m( ?0 h/ A+ q
8 J2 R: F9 u% e! D) z// ECAP初始化和读函数
# A' W: q* H. p9 y. Rvoid ECAPInit(void);$ d. g9 `6 H" C; ?6 }
unsigned int ECAPRead(void);
$ p# d9 C0 G8 W! I: T1 z* a% n; B3 ~+ L6 C+ t& u
//ARM 中断初始化
+ {/ n( I$ l+ e0 X. Cvoid InterruptInit(void);4 |) L( ?" g$ T' |/ z9 B" f
8 @9 p% ~0 p  _# K$ s
// PWM 中断初始化* i" n/ M  |: j& f
void PWMInterruptInit(void);3 v2 I( f& @$ F
// 中断服务函数
3 k5 e; \, a- x" H3 N7 s* g. K// PWM 事件
* b# T. e) ]# g+ }, x, X+ Wvoid PWMEventIsr(void);
& e8 F4 X) t* O// PWM 错误控制事件- _7 y0 k: x- S# ^2 M( _/ V* n. U  i
void PWMTZIsr(void);
7 W/ y' F' j3 d! T1 n: v! _$ D7 L* z* W) Y
/****************************************************************************/6 }1 X3 m) H( c$ x, a
/*                                                                          */1 @! j1 Z2 E2 t: ?2 }. W
/*              主函数                                                      */0 y' Y4 q( D* k; J1 b
/*                                                                          */4 b& u/ _6 `! }
/****************************************************************************/, d: g5 d7 r0 ^
int main(void)" q5 C! T  y+ u% o9 G. @$ L
{" }6 \& D0 n3 I. z/ U
        // 外设使能配置4 t0 G' Y) n9 I; D. _; M
        PSCInit();: r0 b5 b$ f6 Y5 r, ~! M2 j$ W

: }+ W, Q, q8 v5 l/ ^3 ]  j        // 初始化串口终端 使用串口2: N8 `0 S2 X+ o1 L
        UARTStdioInit();4 r, u; b- w3 @5 I- X
        , W& Y% H" ~) _* Y, ?9 j
        // GPIO 管脚复用配置
" O$ _& _: W$ ]* N; M        GPIOBankPinMuxSet();
  |3 l  v, I+ R  F2 i" m
6 ~/ D; x. W3 ^/ W/ t" B        // ARM 中断初始化
9 t& d4 d3 _1 ]: }        InterruptInit();
3 F5 J3 c' r- h" f9 p) P3 U' ~- x) }4 K- U& C
        // PWM 中断初始化* p7 A: X5 y7 W' g
        PWMInterruptInit();$ [+ i# f$ Q( J1 |- u5 _+ K# L' B4 N

' w$ j+ C+ w" Q* Q% x4 c8 M        unsigned char i;
  [: h" D" a7 x  n! o        unsigned int j;
/ {5 x' W( D9 m/ d
4 ^) X/ d5 g' i/ M        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);6 R# `2 {6 n0 D
        UARTPuts("------------------------------------------------------------\r\n", -1);4 U2 u9 }' h# J
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);0 d0 T! x$ O2 z- V
        // 产生波形) q+ v% G& o" @  b% G7 `
        PWM1ABasic(25000,50);
4 u$ ^% t3 J% C- v) ]! k" N: C; a! y" K$ V, N8 k# v; w
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);5 j0 ]% c( v  T  q: R! Z
        UARTPuts("------------------------------------------------------------\r\n", -1);) ]3 |; y' @4 I. Z  Y
) O- V1 v% c' R

7 z' w: u# }* D2 E1 _* u- T* m  i9 w% d, B
        UARTPuts("------------------------------------------------------------\r\n", -1);
  u, B. X2 ~7 B! L$ |        UARTPuts("                    C6748 ECAP Test\r\n", -1);
- O+ Z9 J# A- l% C+ x        // ECAP 捕获初始化& C6 F* D3 f% u5 K9 x) z
        ECAPInit();
, P0 {; {7 h& e* w        UARTPuts("Initialize ECAP.......\r\n",-1);
: p6 u4 @6 N4 x0 l$ e1 r        for(i=0;i<5;i++)- I# b1 x; F9 P! T
        {
' m( J1 h0 a' H0 L3 @% m5 J: I7 @                    for(j=0x00FFFFFF;j>0;j--);            // 延时
5 B" y& ^% W. m& }& G- W                    ECAPRead();+ T- a  h* k0 J( e: k& ^
        }
# r2 t) ]; `- c% {        UARTPuts("\r\n",-1);
+ I, F/ @: q4 s& T5 p# W        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);8 i' V4 K& [6 o" i- w2 ?
        UARTPuts("------------------------------------------------------------\r\n", -1);
8 E; j3 C- p+ X7 _1 k$ X7 e+ ?7 k# }4 ~/ C* u# ]6 b
        // 主循环* Q- x( M5 D' M. Q
        for(;;)" e- @- w- @: o8 |7 I7 Q
        {
9 y, z4 n' q' c: \+ X  ^3 e9 e" Y  P9 O7 r5 ^; O; N
        }( b& g" L; B  H7 ]4 E- _% [
}
' t) r0 I; Q: ^+ ?
, Z5 y" t+ ~5 k+ Y+ W' Y7 y3 d# o/****************************************************************************/
/ G0 p" f- R/ j9 `/*                                                                          */
& ^* n  }% l: f: W/*              PSC 初始化                                                  */
$ ]" K$ Z2 `: n' ?# u7 e0 P/*                                                                          */
  C# b! W2 C& r$ m" f/****************************************************************************/
' z; Z3 P6 Q" V3 @1 y1 cvoid PSCInit(void)
* i: n2 E! i& ~9 ]; [* w  Q; j& p{! y1 u8 t2 v: @% [2 {5 v1 s/ }
        // 使能  EHRPWM 和 ECAP 模块
, J9 h1 _/ u3 O% X0 x. `        // 对相应外设模块的使能也可以在 BootLoader 中完成% \2 Q/ I% ?9 Y$ Q7 w
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);" S9 }! ]8 S1 U# U
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);# @5 C0 Z# {. t# Y
}4 l" s/ M4 `% M& O# i% K2 h

6 o$ Q, A4 }8 y; z4 i7 G/****************************************************************************/! y6 I, b8 h! A1 J( F. x8 R7 G% n
/*                                                                          */
8 k( I' x- {/ J% d2 q+ y/*              GPIO 管脚复用配置                                           */
% b+ }* [; q+ H/ [# h8 G/*                                                                          *// K  X! n. T" T2 Q1 \5 |
/****************************************************************************/" o3 ]& s0 _4 A
void GPIOBankPinMuxSet(void)& I& n4 G( E; D) i* C8 i  V  I
{* l" G6 J$ Q( [6 r; w
        EHRPWM1PinMuxSetup();6 G% i; u  B- E7 |5 ^3 e" P

: \* C  N* L3 ]        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)  [' A4 ~5 I, B3 a( _' {
        // 作为捕获功能时管脚方向为输入  W- U3 J) y: L- u( H& m
        // 作为辅助脉宽调制时管脚方向为输出- P5 x, I% l3 w* N
    // ECAP2 / APWM2  ^& H/ o* p4 v* K" S
        ECAPPinMuxSetup(2);, f$ n3 y: a  C/ B- A- q. t! q
, ~2 l, l2 A* x7 r
        // ECAP2 / APWM2方向设置为输入
) r  [1 G, n- F2 C: s+ O        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]4 s! Y5 p6 J! q. |! e7 M
}$ b: {& \) a8 q

, T+ K4 b" k# A% y2 Q/ a/****************************************************************************/
3 r, Z8 N7 Y9 N' `/*                                                                          */$ z8 H3 a' j) L+ N8 K! e
/*              PWM 输出波形                                                */
  A* h4 T: y0 s5 V/*                                                                          */
6 k9 ~. [5 L- `: M/****************************************************************************/
2 c: C3 L4 G' w8 \; G8 ~void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
3 @7 P2 d; A+ T8 R2 E{* |% m4 z( k7 U3 P+ q
    // 时间基准配置
* c6 Q9 Z: S$ ^. |7 @' U    // 时钟配置
& u) c. n) \3 Q  X" i& ]6 D  r) B9 y: g    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
# O8 Z5 t% ]( B9 Q( F( Q- ~( |. E, ]
    // 配置周期. M* J+ j9 p. Z. V8 u
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
0 E8 J4 d% ?9 y$ W5 @# N                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
  D9 Q- e( T( g
" B8 P. W  X+ x! |4 [4 P$ y    // 禁用输入同步信号
5 O& j# \! `/ V    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);- T" H! v# O" T$ i

  \+ T( f7 G- [9 q    // 禁用输出同步信号
2 G3 ]! W3 O7 p( w- u) v+ Q    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);" `) D% ]( b3 D  p6 [

- t/ G  \5 m( I; J& C# g    // 仿真(DEBUG)模式行为配置
2 x+ D' j" E7 C9 B    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);# O( Z9 c8 V) V4 ~6 C# ]
0 d* A9 E7 J0 D3 R* y
    // 配置计数比较器子模块
+ M! F0 k) e9 j; W) C1 z    // 加载比较器 A 值
1 L) E% {% l* F7 d* u. [    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
* t& @4 m0 ]  A/ X& j                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);& ~$ D+ r) N# Q3 x
  h6 E; m; i* x2 m' l
    // 加载比较器 B 值
9 n( b. F" _6 h, A8 p7 u    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,; E" X- B0 v/ A% `. S5 b
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);6 G3 D( A( S; W6 W/ g' W

: L, R+ }4 X3 l4 H! S1 u' |    // 功能限定配置(输出引脚触发方式设定)
( k( W# L- A2 N3 }* ?    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
/ O+ H; ^0 d4 m0 U  `8 j7 G    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,# M) x: [) X" v3 |- q% I) l
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,  K/ [0 \- A1 s
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
$ W8 T: A# o! [: {* B: v  c8 L  k3 ^* S& S/ [* [& I$ u2 j" o1 V. B
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
0 N: J( b# ]' U$ Q7 F    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
, }; a: t) ?: ?' F7 j
: E# V" t. m* X- M  D1 k+ F8 o+ i    // 禁用斩波子模块* P* G& K5 Y4 s3 ?
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
3 x& t* v$ a. }- o$ }' Q8 p$ y$ b1 Z0 o6 P8 `
    // 禁用错误控制事件
/ }. o+ ~) w* D( l0 D8 c: w* o7 [    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
& \) g9 J1 Y& _& P# {6 F5 N    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);; w1 X  g, _1 M; u2 E
/ r& L- p4 d; W4 A2 L7 O
    // 事件触发配置
7 S3 u0 Y: }! P3 Y    // 每三次事件发生产生中断
7 |  G0 \7 j0 Y# _0 d& R    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
/ n" Z1 Z2 H! M% q! A7 {    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件$ e: `/ K1 n  N! y0 ~, f
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
' ~6 i" U9 j" Q, J    // 使能中断
9 f5 G; v9 w4 B6 w% X; F! C    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);2 y3 h# D* z1 a: O6 z" P

+ C$ j1 r2 C! D    // 禁用高精度子模块
( L0 f" p+ |1 J    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
' U2 e( _( P* F, ^
* z  F2 V4 T9 F. @) v7 I    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);4 N3 H4 d: Y* Z: ?  O0 y
}( J& w+ W1 b6 Z9 k, ^' ^

- B! N2 p% _( O6 R2 P6 |void ChopperWaveform(void)  w0 ?% A9 |4 a' v
{
8 H0 o! ?' I# Y% U/ W    // 50% 占空比8 x/ l% [: e5 F2 F: k
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
3 Z+ y, X9 J+ F* {8 u1 b    // 4 分频
( a0 ~) |- p! y! [    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);6 j# V5 u3 H6 n2 u" r  _5 Z' M1 z
    // 单个脉冲宽度& E+ ~: t6 j& e% H: C% Q  `
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
. F" N1 {* {, k6 e+ Q    // 使能斩波子模块
: a' Y' e8 T* L8 R# q  w+ o    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
3 P1 ?1 L1 ]; p: ?' c2 A( h}7 c% e3 y. V; n6 y5 g  W6 V

, @, _8 p& y1 t/****************************************************************************/
) S5 N9 `' m; u9 y. q  c/*                                                                          */
6 i4 H" V0 ]% q+ L/*              PWM 中断初始化                                              */' o0 y( |+ j$ u( ^
/*                                                                          */, p: S( M1 ]5 j3 h! z
/****************************************************************************/2 ~$ J$ X, Z  @& t$ N# f" @
void PWMInterruptInit(void); k5 b2 v+ y$ A, ]
{, H6 Z1 \! g2 G; N5 F, f7 p
        // 注册中断服务函数
/ n4 a3 E* Q" K5 q+ h) N+ P        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);. ]" F% K+ [9 q2 A" d! M
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
4 r( C7 Z/ [# h& `' l1 |& h6 i+ z8 r' r
        // 映射中断
& x! r* z; }: m7 W3 Y+ @2 O" {        IntChannelSet(SYS_INT_EHRPWM1, 2);
! }# h3 [. s" p, }3 B' }        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
  \$ Y1 g, a+ E( i( H7 k9 Y9 \' A
        // 使能中断' C3 m  ]3 V! j" b) W
        IntSystemEnable(SYS_INT_EHRPWM1);
: h0 z, E0 ~8 U  x" n. i+ `        IntSystemEnable(SYS_INT_EHRPWM1TZ);
5 A& ]1 S( T- |) C5 {}
: Q! F: |/ H* Z, n1 A
2 m; v1 O( ^. ~" {$ M! v. Z/****************************************************************************/6 x% X! F' Q- }6 c3 Y7 a# B/ H
/*                                                                          */3 c) q4 A2 ?3 c' g7 ~, M: I: }, v
/*              ARM 中断初始化                                              */! z9 _/ d( C1 F8 r- \
/*                                                                          */
; |4 m& V" ^: u; ~$ X/****************************************************************************/: x$ q2 V, M3 L
void InterruptInit(void)& j  m& l4 l* k- d, F
{6 ]; Y: h2 p6 b+ ~! s% i" e
        // 初始化 ARM 中断控制器
3 D8 I& F  c2 X5 u        IntAINTCInit();
7 x6 w: P) L' N0 Z8 x4 L$ X5 z0 X. F! A! g  U& K, C) a6 m
        // 使能 IRQ(CPSR)
( Z2 ^, w- k) J" M! y        IntMasterIRQEnable();
! y4 g  F) z$ o# a( E! M9 s7 r5 ?" m/ ^8 r
        // 使能中断(AINTC GER)
: Y$ Q+ l1 K8 q& ^) D" K        IntGlobalEnable();
, L: l4 ]5 D& J( ]9 {! l$ L9 }+ x$ Q1 E4 M
        // 使能中断(AINTC HIER)0 ?% E, N! r# j/ \% P  t. |! r
        IntIRQEnable();
* ^* G8 w0 @9 I0 [7 [}8 M% [* N$ ^, h9 g  P

& z; g6 K( |/ p0 l/ h
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/
" Y7 e. p; p  p. u5 E/*                                                                          */
, u; }, D6 @# q2 f/ x/*              中断服务函数                                                */
+ Z$ y0 N: Q0 V5 J" N. {) i+ G7 g/*                                                                          */
7 w1 x% A$ P$ n/****************************************************************************/- A* P7 Z, D* _" T* j0 c& a+ i
void PWMEventIsr(void)
& b* E% T7 `# x' p- `+ U7 F; d! v{# }) \8 \8 R0 @; _& j# @; {7 u) v
        IntSystemStatusClear(SYS_INT_EHRPWM1);* U7 a4 U9 _& n/ `8 \$ r8 O2 L

1 q+ M% \: |- I' e8 F7 _8 o    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);4 Z$ q2 a- A* s' X# T) |
}
0 @( ^' h, `& z4 S6 x2 l2 l# N
8 Z1 e0 y+ A% {8 Q% u0 c6 \+ jvoid PWMTZIsr(void)
4 g! d/ o) j, N/ n{; Z; K, n  f; W4 |
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);# m; A+ N; z4 {
3 f1 v4 }3 Q/ I! r
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);. |3 Y& T( [5 W2 ^% B! g
}
1 _1 R0 S: N/ ~. Z) s1 G
6 P" @9 H& j# \* S" P" G/****************************************************************************/
% \4 A3 Y0 \5 ?' l" V5 ^, W* [2 c" y/*                                                                          */" b. g- t$ z1 _- _
/*              初始化捕获模块                                              */
- X0 |: W! P3 U; |* [. O# q/*                                                                          */6 h% e' ]5 p/ o% G% C
/****************************************************************************/' p7 M) _* t: m3 \" `
void ECAPInit(void)4 X: f' F* i6 M7 m3 \1 x& D3 z: @
{
) d1 D& {1 [1 p: F" e8 ~        /*-----设置 ECCTL1-----*/  a5 R. }6 P" v6 s9 Q1 u7 y' ^. r; G
        // 使能CAP寄存器装载1 n3 ]; W3 m/ L( B, ]
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
+ q" H0 [5 q* R. P2 W# G, U) ?2 ]        // 设置预分频值.
( y' z& m5 ?! v8 T% M* b$ b        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
! |! @3 @7 p  `        // 上升沿触发捕获事件
* U: O; r; H$ G/ K4 z* z        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);8 E1 ?6 `/ {9 m
        // 输入捕获后重新装载计数器值.
+ O, M/ G7 f* p) @        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);. Y  I2 Q8 P- A6 s% p. Q7 a

' q/ y+ V7 N6 @0 `2 H/ ^5 d6 K        /*-----设置 ECCTL2-----*/# Q0 b/ @, V- [) M* k5 q
        // 连续模式- ?: e, U8 i5 {9 f+ u" y
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
% R' ~! Z) h: K        // ECAP计数器TSCTR持续计数) {, D' H+ V5 \
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);% X" J5 k$ ?: n: C$ q- g7 \# e
        // 禁用同步输出和同步输入
# K: z: \% ]/ h7 R        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
, X' o" V1 z9 v8 w# J$ T! r        // 配置 ECAP 2 为 CAPTURE 模式# [3 S. q" y0 n- s
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
* a5 x: O% ^9 g: S( Q8 V5 m* m1 E, n, u6 X2 E
        // 使能中断
3 h+ g9 r4 m% c% T5 |//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);; }8 }2 q5 n) I' u5 B
}9 q! D  ]1 ^/ h

) s1 r5 ^2 o$ I7 z/****************************************************************************/
. w1 A; @- Z) B+ m/*                                                                          */. a$ b7 F; ?5 c6 D# ^2 z/ Y: Q5 X
/*              取得捕获结果                                                */$ b" Z' k* k: O. W0 w
/*                                                                          */
& n2 O* p" [5 k/ I/****************************************************************************/
5 E4 d) B8 S3 |  l5 C  B# Tunsigned int ECAPRead(void)% U3 l1 s, v  `: @- T% I
{
. t2 i+ a5 M' w; c        unsigned int capvalue;
% p$ K# o0 [- A3 J* ]. i3 Y        unsigned long frequency;
6 k& N* K% v9 m  v, J
4 e; [% e5 O) p9 Y" @) h4 p        // Event1 中断标志
! K$ [' o! k/ r9 q0 S        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))- ?: q! Q3 X# n( W
        {. F* o) A6 U8 \7 c7 _9 T8 {( P3 @
                // 取得捕获计数# L1 Y9 e/ `5 j9 j
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
( `" M1 M% W% P- {6 B3 ~" C                capvalue = ECAPResult.cap1;/ A. C" X7 j8 U1 g

6 X2 U' W5 |8 _  w                // CAPTRUE 模块 228M 时钟主频& E; C- x9 X, U1 Q. a
                frequency  =  228000000/capvalue;
5 }6 ~  t# d% r1 o* b6 M' G1 y7 t+ u                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);0 }4 T( v! p2 ^: S1 M
$ A/ k* J6 ?1 a' q: I3 B  u; D. ~
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);& T$ E! `. K4 k% {4 U0 ]
//                IntEventClear(SYS_INT_ECAP2);1 q3 R8 J8 b5 k, J* S5 v
        }
, c# ]4 q( V: o0 i3 w        return frequency;
5 Q9 p4 P! T( G  \& ^9 x}$ I/ U& K1 }" p2 T

作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
* N) @' Q4 ]4 C- p+ Q$ T9 ~[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