嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家! O8 K* f6 t0 n" x. d2 V

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
( U" V8 \+ A2 H1 h: J* e/*                                                                          */1 a7 t2 p! q0 d( @* t
/*              宏定义                                                      */
! G/ J1 O1 Y: h( _9 i) M, W! x/*                                                                          */( I. Z3 _8 C) b  r( C
/****************************************************************************/' p" \1 c, l6 D; Y' z3 v
// 软件断点4 I& t/ D# o4 v4 X% @
#define SW_BREAKPOINT     asm(" SWBP 0 ");& X  |, f- [1 \8 F. o- G" L
$ X  P8 L' u% n! n; E! G! d* X6 @
// 时钟分频
  P0 [# p) b( h8 b: x0 y#define CLOCK_DIV_VAL     228
3 o! x1 h9 N" ~  A5 h9 u4 D5 b2 y: S9 o3 p# l* K7 s& j, C' w  \8 @* }
/****************************************************************************/
; h9 {1 W+ L5 z# H2 p/*                                                                          */
( D; y2 s! h/ {4 i; M0 Z& T0 M/*              全局变量                                                    */
5 B' W# @! x* a6 ?7 k4 z( M/*                                                                          */% E) v9 V' b: Q+ q4 _
/****************************************************************************/1 i3 r' R+ y. }; B: ?- p, ?
ECAPCONTEXT ECAPResult;5 c1 e1 Z$ S" J
7 \4 Y+ o' e% @6 w' t# r- r0 Q
/****************************************************************************/- a: [7 Q( x% J# K4 j/ P* P+ w
/*                                                                          */7 O& `& h3 b7 s- ?  W- B/ }$ E: C
/*              函数声明                                                    */$ o9 n: A$ ~$ e
/*                                                                          */
# V+ p$ }4 N  G5 O; u/****************************************************************************/
, ?( o# S; p- R// 外设使能配置1 P& [, Q8 Z- {9 s4 ^! a  e9 c3 [
void PSCInit(void);
# b0 ?& b1 o, p# r/ P$ d; F$ |
, l; L% M5 Z  d3 U// GPIO 管脚复用配置
& p6 Z8 Z- b1 w7 ^void GPIOBankPinMuxSet();4 s4 H$ H! F& ^. _. I4 s
; S! S: e/ W- S$ ^! T# Z
// 产生波形
. H) z6 b$ |2 L  T5 jvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
; A1 y4 q& Q, d: n0 |8 J, e/ g, Jvoid ChopperWaveform(void);, @8 `# H8 R9 B! E* U1 x
8 p' ]9 Q' j! k1 {3 E1 n( @, B
// ECAP初始化和读函数3 o4 w# {" L& c, f: @7 G
void ECAPInit(void);
/ l& A, `% N  t4 p) ^( Dunsigned int ECAPRead(void);
- c8 E4 L! g. `# v. S
- E/ p5 t& V0 e; q: W( v: B//ARM 中断初始化1 w" l& u8 L/ J! j% I5 u% j
void InterruptInit(void);
# Q; ~* s( i% j* t. i
- w7 h7 P' v1 g: \// PWM 中断初始化
# A8 ^" ?) C- _) U! L! C+ m- A+ pvoid PWMInterruptInit(void);
) }& ]3 _: g4 e" v) u4 W) j. w) Z// 中断服务函数8 R! E. C9 m7 }/ ]- Y( P4 N' d
// PWM 事件
9 r) }; p8 f5 k+ gvoid PWMEventIsr(void);  @5 X3 F  y; C; O. W1 R$ O
// PWM 错误控制事件; f) a1 ~5 ~6 n8 e1 s- a. [& @
void PWMTZIsr(void);
( p6 T4 d( ]+ e; s
% f4 [( }0 a4 K1 h/****************************************************************************/
( X( U2 o2 U$ G/*                                                                          */
& z' e0 g4 P( p! A2 x+ [4 J5 @' R/*              主函数                                                      */0 v6 I  Y5 I, g5 _5 y4 _
/*                                                                          */
6 y) e& E; ~4 E7 w/****************************************************************************/, ^' L$ V* ~1 Q, p9 p
int main(void)9 e$ g1 Q& Z" }5 _  W# x
{
. J3 W4 X9 y0 e: K# L5 }0 N: L        // 外设使能配置$ |; N* T! N* q8 T5 b: e1 M
        PSCInit();
# d* B1 |, k0 }" A( M% v* L4 U" P
        // 初始化串口终端 使用串口2
3 C7 `/ |0 Z+ j6 T) s        UARTStdioInit();
) a, G/ V; q' F. o7 |6 o$ g! x        * R5 G/ O; v$ i3 }. n# _/ |/ i. C
        // GPIO 管脚复用配置
& o1 c# r6 x5 g. n7 u7 b. i1 n; k        GPIOBankPinMuxSet();
) d  ~+ a9 f1 B6 b% q& f3 r
" y; o0 Z: Y1 j! o( ?& {$ n7 K        // ARM 中断初始化, ~; ~! x+ e: P+ E$ ^3 }; u2 i6 g
        InterruptInit();* E) A3 o. L) w) Y% _' I5 F

5 @# D8 R4 c0 Y/ G2 E; g3 q" d        // PWM 中断初始化6 G! \. L9 ]- B- b, \5 E
        PWMInterruptInit();
3 @; K+ ~7 t# f9 @; |/ i" s
; C3 ^6 V9 n; E% ~2 H        unsigned char i;
8 ?  |5 V. Y. S( G; J' f( l        unsigned int j;2 j" p; s+ l- k2 B' w

( R& r& j" K6 J! U1 ?3 w4 u1 P        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);5 t  B4 h  l8 N4 ]' z# |. \
        UARTPuts("------------------------------------------------------------\r\n", -1);
4 P! f  g; E. u: N$ |9 i: }, I        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
6 j& q1 d/ ]* f7 ?        // 产生波形7 ]9 w/ D5 X) S6 a$ L
        PWM1ABasic(25000,50);
3 r% V% k1 v7 K) `! {" v5 d# `
# i# h" E0 {5 A' Y$ ^        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
* C3 Q3 P1 h* E: q  k# g$ R% v        UARTPuts("------------------------------------------------------------\r\n", -1);7 [2 Y2 D, s* i# X3 ^

" i9 F  d3 ~. g2 I( v" B* I1 r( O
# ^2 o5 a+ i4 @& i% T  t5 _+ Y, R2 g
        UARTPuts("------------------------------------------------------------\r\n", -1);
! _) r3 L3 g! B/ _: D* }0 r        UARTPuts("                    C6748 ECAP Test\r\n", -1);
& ^5 y0 s& e1 }6 ]8 w        // ECAP 捕获初始化  G8 m8 f: h8 e0 R0 W
        ECAPInit();2 g5 V1 `1 C+ ~3 E0 b! x  v
        UARTPuts("Initialize ECAP.......\r\n",-1);( W; I& ]2 D2 N* ]
        for(i=0;i<5;i++)
6 M0 W: o3 X# g4 l7 M! ^% r        {
6 s2 v+ m/ a8 O" {0 `                    for(j=0x00FFFFFF;j>0;j--);            // 延时
! p& Z2 g2 @# q1 F% A3 h                    ECAPRead();; H3 g1 g- u  J0 t
        }
' i( G( Q' c% t/ p1 D4 L. ^# t        UARTPuts("\r\n",-1);
# {' v. ^( w+ L) M* S  E2 @& _+ x  g        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);/ m- m* c: P& C
        UARTPuts("------------------------------------------------------------\r\n", -1);
* P; T! f0 S  D
# |. h4 J, B8 ?- `        // 主循环
2 l5 |% g6 c3 n/ J* V, N        for(;;)9 T+ W8 i$ j* @. n) ^4 O
        {
) W% Z5 B% A, D9 W' M+ R) x6 d4 D- ]# |9 X2 o  p
        }# o; r; a8 b3 R% t: W2 b
}
9 J% e. ?8 Y. s5 R! D3 K
# Y5 Y4 p$ t6 F/****************************************************************************/8 D# n& m3 R2 @8 ^, ~. t% c0 ^
/*                                                                          */" f# W/ N- {0 J6 e. ]& \# W
/*              PSC 初始化                                                  */
7 A, M' T( K" Y* b' G& j/*                                                                          */2 A% V+ L4 [6 x4 m
/****************************************************************************/: j% S3 a7 B" r( D" B3 g
void PSCInit(void)
8 w, t1 ]% A6 h8 p1 h6 r{) k' U+ U9 a$ O& Y! v; O) }) e
        // 使能  EHRPWM 和 ECAP 模块8 b# J7 x% [5 ^8 O3 }
        // 对相应外设模块的使能也可以在 BootLoader 中完成4 b% w" R: B: a) H" q- B% c
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
2 U: ]' ]: K! {$ c$ ?    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
+ m2 q' ^) u2 \( ^}
9 U/ ?* m& |; k1 ~( n8 C/ e4 I/ i$ [2 D
8 F/ @+ B" P2 L+ K! i$ z/ J/****************************************************************************/
& T# q& G8 p( d7 U1 [/*                                                                          */
* S  d/ H* A( t2 m% E/*              GPIO 管脚复用配置                                           */+ l' ^6 ?4 s9 _' |6 V1 T
/*                                                                          */0 S% m- n; s1 K+ a- p# `
/****************************************************************************/0 O" x6 V" Z( U2 ]1 D4 S
void GPIOBankPinMuxSet(void)
# o+ X4 @6 f$ O7 Q& z{
1 i$ l  h$ a. D1 c5 `; ]; N8 `        EHRPWM1PinMuxSetup();
% C2 {6 B( H$ c5 m. Y2 q  o7 g
* Z6 P- ]7 V2 r) A8 x( X        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
- c: C. {; E( t, T  u- W. I        // 作为捕获功能时管脚方向为输入4 \% e6 W6 i: D0 }) |& x- X- n
        // 作为辅助脉宽调制时管脚方向为输出
; z- T& s6 @  B, ]: v( i5 E  h    // ECAP2 / APWM2" x+ S& G. g  F4 \: ?( E- f& v% y
        ECAPPinMuxSetup(2);
2 O( p+ f2 C* y2 b' N% v# V- T. y1 f- U
        // ECAP2 / APWM2方向设置为输入5 b% S, w/ K- m) A, r/ B" q3 ]
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]8 m6 L9 W) K3 d( M4 g7 M- h4 t9 {
}
" W2 W) `$ x! A% [/ a! S$ d8 t& U7 J/ k+ ?  N& u0 A# _( d
/****************************************************************************/' l: s; U+ r+ |0 p  K) H! {  v8 ]: P
/*                                                                          */
/ j$ @+ E# W9 Y) V/*              PWM 输出波形                                                */
, L# J$ m/ G" k6 @) B% `* K3 n/*                                                                          */  q1 A  N* h* p
/****************************************************************************/# W, ?+ @" s9 N& O4 K
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)9 k. Y! ^) F6 x2 F( n
{
  y$ |. f2 j8 m( Z2 ?    // 时间基准配置6 {/ m# m; J8 h5 \1 g) G
    // 时钟配置( U; b8 U' m( W5 S
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
# }- u% m  u' l3 a' p1 D/ {' `( _! D  ^6 n. a* i
    // 配置周期
; j  f& J1 F- `5 E4 R    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,8 M2 ^4 m! ?- p) |
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
+ V( h) ]7 x% E$ {$ C3 b- {, H7 q) b" a; e
    // 禁用输入同步信号( m' R# g1 Q2 F* U5 L% y
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
2 B0 R5 o' k/ I
' ?( _3 _( T! ?% k8 K# J" X- e    // 禁用输出同步信号
; X6 ~. u$ K7 K: N: w  A9 s    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
% p( s& Z& j" |6 }. |* W/ l* U7 ^- K9 |, q6 n& m8 B
    // 仿真(DEBUG)模式行为配置7 P/ C% q/ [$ L2 P$ S4 `$ J
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);5 Z: i/ k& A& u5 `+ ]! a1 G- _
2 ^/ \8 K& @! V# c
    // 配置计数比较器子模块
9 K. ?: E& H/ o8 E3 a    // 加载比较器 A 值
0 s# P. V6 T' r7 ]# k    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,0 J& x' L- B$ }. U. @
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
% u8 A3 \' G- S, S( Q3 n6 H; |7 N& Q. M6 k% r) {
    // 加载比较器 B 值
" v. n6 [7 \$ V: P9 x& @1 I8 X    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,8 m- K7 g/ v% q0 w
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
  o3 n# |( M6 v  W+ E$ q! i, g7 n: z$ R
    // 功能限定配置(输出引脚触发方式设定)
. B7 k* o! b, j. ]6 O1 V% N    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
- u( e0 n! T) A! f) `! ]  U$ T    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
4 ^3 d( w: C+ W- y  `" r. _                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,6 j- A1 j- E7 u4 d
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);  \" T$ i8 ^7 n; f3 D
1 P" ]+ ^3 U8 y! q; |2 t
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
) f, M, o, G( _' J( z    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);$ W6 _2 `8 @3 c- }# v/ a

7 ], }- c" w; W+ r    // 禁用斩波子模块
5 V* p9 B' y$ I, _* z3 L: R    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
3 ]# X0 c  z* j( |
) I4 \9 J! e7 F( D. m. f    // 禁用错误控制事件' [' M. @1 y/ [. c8 O8 l
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
- O! J1 N; _5 Q* t) ~0 c    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);% v" A1 j7 \8 {6 F9 [
, w. ^& R  ?. {5 W
    // 事件触发配置, O6 Y! T. G1 _1 x& X" c5 w
    // 每三次事件发生产生中断, F) _( Q4 V4 P( A7 N# o7 d
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);, F8 u6 R: u8 a
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件3 Y' c- n: w& }8 x
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
- ~* K) |) w, W; i0 n- Q1 d    // 使能中断7 O  J% w/ r% a6 p! G7 F* W
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);3 i: a& k0 H: ?6 @+ V- _
4 t; t$ G( w# i' B, C
    // 禁用高精度子模块9 l: m1 P4 a: w: E. }2 p
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
9 ^: _$ R9 Q* R/ H3 V
! \- N. Z  r( o5 b7 M8 w    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);; D) s: P; j0 S
}* D0 q5 h, u3 I1 k

/ E$ r4 h8 C3 x; J# Y2 S: R. yvoid ChopperWaveform(void)$ t& P0 r! ~+ h$ ]$ l" Z
{7 B. E% k5 V0 C! `7 y, I7 W
    // 50% 占空比
$ M* g0 K8 O6 n, E    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
6 u/ d: S2 y: @0 B8 g    // 4 分频9 c+ n4 Y$ M" ]
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);& Y% j$ V2 m/ W- O9 ~0 K+ e
    // 单个脉冲宽度: ]: _+ v3 U6 Y3 [8 G: c* N7 R3 f2 C
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);& i: B# p1 G/ }
    // 使能斩波子模块( U/ [0 Q7 L' r- a2 y% h
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
5 F+ B% r$ b% N; v+ D7 o! b  ?}
- S. p1 G! S& w4 ^; p+ S
+ k& @' n5 M) F3 o/ x/****************************************************************************/
+ x) V/ `, u( m9 |5 p: s5 N, z/*                                                                          */
3 e0 z! }4 @4 }' R3 \/*              PWM 中断初始化                                              */
6 E, a) }4 K. [0 {! X- C/*                                                                          */
' P4 w7 A1 D( S6 o  ?. {9 \/****************************************************************************/$ W( F8 f4 T$ w6 t
void PWMInterruptInit(void)
! R1 t# A7 j  P: N( _5 x4 n) J{& M' B5 k6 [2 u0 w, t  C, b
        // 注册中断服务函数  L9 R1 N4 y$ N3 C/ D
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
9 B+ z' C6 {) w" c! H" F+ B- W        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);, Y1 h  x3 }9 N& \, {' ^4 u9 T+ C$ l

. A2 V# N8 ^3 C' t% w: d        // 映射中断$ M/ u) @( r* b
        IntChannelSet(SYS_INT_EHRPWM1, 2);" l" F9 k0 Q* @* ?4 p' d3 T( A
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);$ n: `4 m. f5 N( @

( Q8 ~0 O- z5 s# V0 O1 H6 O        // 使能中断0 n  e9 ~& b) ^* l, {& s& }" r
        IntSystemEnable(SYS_INT_EHRPWM1);  P$ Q+ J" N/ J: p/ j6 f# z+ W
        IntSystemEnable(SYS_INT_EHRPWM1TZ);) a: \) `" s* v* H: w
}& i1 \$ ]! L9 V. D

* h" q# V5 h# P" }: ?+ A/****************************************************************************/0 e% C5 H7 Q0 K5 e: u# P! {& k
/*                                                                          */# A+ ?  L0 A5 k+ _
/*              ARM 中断初始化                                              */2 ^4 ?$ X  E8 q* P, }  D* y7 F
/*                                                                          */
, t: j* g9 n/ S& O- }9 j/****************************************************************************/
4 Z8 ~8 ^. x8 `: Z) `# g8 a3 vvoid InterruptInit(void)
: L1 O4 v  C4 t$ I2 i{  b1 B% H5 w5 n4 s6 T; O% S/ g+ i
        // 初始化 ARM 中断控制器, q& |! ~4 u2 i2 N( i9 A
        IntAINTCInit();, b9 J" `$ Y1 [0 ]6 a) J$ u

0 @' T; F8 _) A/ ]+ m$ d        // 使能 IRQ(CPSR): I# ?5 n; G- T0 T9 `
        IntMasterIRQEnable();
8 G2 o. @) A; {$ n0 c. a' A4 k1 f* U7 X5 ?5 c* w
        // 使能中断(AINTC GER)
: w0 M5 n7 @( K, c$ S( U6 [        IntGlobalEnable();$ o7 h, f* s! d5 t
# u; W9 Z6 T6 e" q1 G" b" j
        // 使能中断(AINTC HIER)& y7 r; g+ \! w; d3 R4 U1 f
        IntIRQEnable();( z% s7 T1 e, i3 ^
}
3 ^" Y' D0 P' [' r/ W! K6 k( C  a. S; v

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/2 Y, ]0 _3 Z9 E
/*                                                                          */2 w3 ^: j& y0 c7 I
/*              中断服务函数                                                */' D; A* g$ i$ A, J4 e9 X/ n) K( n) |
/*                                                                          */
: ]  w, j# N$ `# m) C/****************************************************************************/
/ g. a* L6 D. K5 qvoid PWMEventIsr(void)9 N& b* {5 Y: n8 @1 E
{$ W0 e% K+ D: P0 D5 u; Z2 v4 d
        IntSystemStatusClear(SYS_INT_EHRPWM1);
7 m5 p* |1 k' ^1 F5 v! N
/ X( G8 e" u7 c' z    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);, \# j3 d5 v" {8 B$ ~' B$ n' O4 Y
}
: u7 z: h5 X% ~
( Z0 V' o# V# M; }6 Dvoid PWMTZIsr(void)
+ k) t$ z6 D. {! x  `{
/ g4 t* ^5 _. d$ J3 T: [$ b        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);1 m4 F5 B3 ^) J4 w3 h+ \
2 D' C6 k. Q% S$ ~
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
; |$ E% X- k. Y7 U7 N- T$ j- _0 Z}. P' h1 x! b' ]5 G
5 Z" P5 G2 ^, M' ~. m% V6 @( j
/****************************************************************************/
; j- Q) g4 Q0 A' r9 g$ q, _* o/*                                                                          */
3 _/ {4 E/ l8 F/*              初始化捕获模块                                              */
( C6 o& U9 k, N- W; \/*                                                                          */4 e9 t* l8 O" T: _2 J# z* f
/****************************************************************************/- E. U+ K! E, q) g) y6 h
void ECAPInit(void)
# M. M9 C, d. Y+ q+ G& D{9 S" I$ |8 o  U
        /*-----设置 ECCTL1-----*/
. E7 O& R$ E- y! e9 L- K5 A        // 使能CAP寄存器装载
8 ?% [7 J) p; ~$ K6 U. J        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
3 S- a, Y7 \7 J2 e7 l5 R$ Y        // 设置预分频值.6 K8 L1 U! {) e0 M& o; B# `& P
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);" p/ @- U3 B+ p) B9 e0 D
        // 上升沿触发捕获事件: j0 o+ e# }: U( O
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);5 T4 n5 Y9 p3 ^' T# s) B  o" a4 T! s
        // 输入捕获后重新装载计数器值.; o# y0 S- R+ y4 J
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);5 J+ J! P" f' h+ J  V8 i- Q5 {3 |
/ ]* ^; Q+ g- C) v+ [: z
        /*-----设置 ECCTL2-----*/
1 t( K  p% O$ v( V! F7 n  a* _        // 连续模式" l( t$ a% y% V$ P' z9 s
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);4 r( V3 K( ~: f0 e8 w7 R9 u9 B0 {
        // ECAP计数器TSCTR持续计数$ d1 J1 \4 \* e3 }( ]; W
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);0 t  H4 \2 J( I7 k- w* c$ a, t
        // 禁用同步输出和同步输入3 o1 s" I( n/ E! \6 v
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
3 {3 W# e2 B/ F: f        // 配置 ECAP 2 为 CAPTURE 模式2 u) l* G* |" h" l
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);+ q; _) W) F' f, F
; Q+ o6 {6 w4 q% s- b# I
        // 使能中断
0 G& ^% z& E+ f7 r, h, J" \//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
" j/ a* o" N* B}
. ?4 M, C, f! x9 K3 F' j0 `, ]3 c6 x% j* v$ B
/****************************************************************************/) n3 W6 M" J  k$ n& \5 C9 X7 y
/*                                                                          */4 A. z* ?; w' m4 c
/*              取得捕获结果                                                */: ?4 ?- @7 S5 `! \  s- `
/*                                                                          */
% l3 Y" t! ^  \# N/****************************************************************************// Q* b$ V4 H5 K" x7 C1 Q
unsigned int ECAPRead(void)
/ E; r# P) ?* d- ]0 [$ i2 q' x- T{
1 [. k$ K5 d* E! V( J2 c4 z        unsigned int capvalue;
9 r8 b& [- |' d1 S8 O        unsigned long frequency;
' d4 y/ O* `/ E; h- l4 h
) g8 k. F- j* |+ _        // Event1 中断标志
- U% `- [$ x) g  u% x1 w$ J        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
8 a, x7 y2 D; w- Y4 f        {3 O) [( P8 |$ S6 e
                // 取得捕获计数
# Y) L+ {, R0 p/ Q; E. X                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
$ f# v. ]4 D: b6 z8 D( \+ j4 o                capvalue = ECAPResult.cap1;; e2 z" c  _/ r

( `1 q$ F+ V" v( M& u                // CAPTRUE 模块 228M 时钟主频: `8 y- H& t2 p: h
                frequency  =  228000000/capvalue;
0 ^3 H  C" ^- Y9 M3 S2 b5 p                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
  v, H* t4 n. J' {0 u$ R5 ^. ~- q) C7 B# e4 j  i$ l6 I
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);% G9 _9 y9 x8 X
//                IntEventClear(SYS_INT_ECAP2);
: {9 p: ]& X/ u0 M8 \3 ?& q, [        }8 r/ ]' h8 W0 O6 |' P
        return frequency;/ c' m1 u, V6 q1 [4 w
}
# l1 [1 l0 [* j  V- n- u
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。$ z; h' [, X. m% X
[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