嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家5 ^  C8 s" J, G5 p% _. _

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/' |8 [9 L0 U+ C( b- F$ v" |. R" \
/*                                                                          */* j6 {  @# E* v
/*              宏定义                                                      */
, ?- g/ t9 e: t/*                                                                          */9 v" L+ O+ a; I
/****************************************************************************/
9 r- y- F! `8 K* C" y// 软件断点  ]7 Q, L2 U9 `& G. N
#define SW_BREAKPOINT     asm(" SWBP 0 ");6 R5 F) C/ p# Y2 Y
: ^, E/ ]& ^6 p9 d4 K# R
// 时钟分频
( h) E2 W! [: |! k  B#define CLOCK_DIV_VAL     228. b2 }# Z7 _; U
; t( }$ p7 y  ^4 w3 H$ y  G& {
/****************************************************************************/
3 y; q, v, Q8 F" O, Z0 w1 F/*                                                                          */' L8 k; Z2 U$ R, q; B  `$ F
/*              全局变量                                                    */
& U/ ^. k- W1 [/*                                                                          */+ O0 c* N" D' i2 T+ |! n0 h% p
/****************************************************************************/
' s5 U! x. g( ]( m3 hECAPCONTEXT ECAPResult;
- @$ W$ x/ H( K6 i5 T" @& ~# n" q5 b) J% S. {
/****************************************************************************/  \7 L0 c; n# h4 F4 N% H
/*                                                                          */
; l7 w8 g# e9 ~/*              函数声明                                                    */
0 K4 u: [. w: G; x& ]9 K5 K% b* {  i' t/*                                                                          */
: X& U- D9 g7 p+ M! Y/****************************************************************************/% k7 Z5 T6 ^6 A" B+ T7 l
// 外设使能配置
. M" T0 D3 z# ?' X/ ~5 p0 p" ivoid PSCInit(void);
  n. Z" x/ G) ?% J4 b# f1 p& C4 N) r+ {9 P  f1 z- t  c
// GPIO 管脚复用配置
2 _! F2 m. b3 F, C' R1 pvoid GPIOBankPinMuxSet();
$ s7 m) G5 y6 S
, k7 F" W% N& A2 b7 s6 n// 产生波形
% ^9 r4 v' u5 U9 l6 D$ z) M1 m- E5 tvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
5 U1 j0 N# s4 p& m# c* ]void ChopperWaveform(void);
- Z9 G. `' n% q: I2 L* [" J; ]; L5 \5 [: q. j# h
// ECAP初始化和读函数
; d& u$ l9 t# {6 X5 V/ O; ivoid ECAPInit(void);
% M9 ^) W. a( L, o! ?unsigned int ECAPRead(void);
  Z* U9 m8 k+ ?2 h; S9 X+ h
& n4 A+ N( K7 w3 F9 m/ u& ~//ARM 中断初始化
0 Z9 O$ L5 O0 d9 T* Z1 L' T5 F' f7 zvoid InterruptInit(void);
0 X0 Z* l9 R; X8 I+ I- k* w
: @2 W5 D2 O3 b// PWM 中断初始化% g  a- u/ N$ n% h/ d' N  S
void PWMInterruptInit(void);
6 Z4 k% x8 v4 M% H// 中断服务函数* F  C! w0 E% F( q5 B
// PWM 事件* t4 V- C* I& ~
void PWMEventIsr(void);' V6 ]; }5 ]/ U/ h4 {
// PWM 错误控制事件3 ^' \* x: x. K4 }- I) I5 Y
void PWMTZIsr(void);
. n2 K8 o; s8 y, Z
$ _/ q0 v2 c& I& V/****************************************************************************/" \* k) V; E6 A) {
/*                                                                          */
2 ~. Z  o) k/ D! Q5 s; n/*              主函数                                                      */
+ U" d3 n: I8 z" X$ L; V% J/*                                                                          */2 }6 P* R; s7 ?9 ^) l* R$ |4 x
/****************************************************************************/- T0 i- o! `, {0 }2 X; H
int main(void)
) D3 [0 K, X! K; a{
2 |2 ~9 W9 X- c8 k1 f( D" s. O2 M        // 外设使能配置
3 l& h  d! c( g# y. R0 }) U/ V        PSCInit();
& l, k1 L+ d2 z6 M: y- `$ [  N7 q9 Y+ A7 @! \  Z% Z; U2 v* ^
        // 初始化串口终端 使用串口20 F& F! R6 ~0 J
        UARTStdioInit();
3 w' X+ Q) h) g  E. [        ! x7 A9 i. e2 ~; ^
        // GPIO 管脚复用配置
. B4 f- p9 `. u. d# e/ L* k) Z        GPIOBankPinMuxSet();# R( u- h2 R  c% Z% v+ t$ S
- o  i/ Y' F$ L
        // ARM 中断初始化1 y8 G* X. R5 u8 X
        InterruptInit();1 u$ ]8 _: D- Q
3 c' T% q+ ?* u3 [5 [" p
        // PWM 中断初始化
2 w& u+ C% G& U7 E- u! Y# L        PWMInterruptInit();& y4 \8 H8 k3 ~- T' r. ?. g
; Z* }9 j( z5 f8 O" `! W1 v& P
        unsigned char i;
8 g6 R. O8 {& z. g; y4 s& U        unsigned int j;4 V. V5 k. L0 Z/ z6 z" C
* f' b/ s2 G5 z2 O  ]3 r* E
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
& @+ S: T9 g1 D2 Q. m' m- L        UARTPuts("------------------------------------------------------------\r\n", -1);7 C0 b( E) H$ a: w2 D3 r1 D' e7 U
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);6 l! \9 C; I/ Y% Z/ T0 [5 o
        // 产生波形
5 I* C9 \1 K) p. u9 x9 }' y        PWM1ABasic(25000,50);  U6 s1 ~& E! O8 ~- J5 H

4 l+ [" X6 J; c  K# L9 f2 e. Y- Z: ~        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);- g) K+ {' ?8 [4 ]  h1 X2 j
        UARTPuts("------------------------------------------------------------\r\n", -1);. C1 Y/ g4 l: k, o% v  U
8 j) m+ w  ]/ j" n+ h/ S
1 A3 B  c$ L0 \% i1 N
! i3 }$ a  u7 G# N4 @8 f& }
        UARTPuts("------------------------------------------------------------\r\n", -1);
5 T2 T) }) a1 }) c/ G        UARTPuts("                    C6748 ECAP Test\r\n", -1);" ]  W. W# R; l: ~9 j8 d+ `( Z
        // ECAP 捕获初始化0 O, |  {; Q( J  F3 C% m! D
        ECAPInit();
' J7 R: h3 c0 U& W) y9 @7 b$ W        UARTPuts("Initialize ECAP.......\r\n",-1);. N$ M$ I  J$ W1 q9 f8 g
        for(i=0;i<5;i++)2 H& B; n4 ~% X$ r! u& U
        {8 U6 [- E* F1 O6 y8 E% i
                    for(j=0x00FFFFFF;j>0;j--);            // 延时) q& s' z0 \! B2 U' D
                    ECAPRead();
4 O5 y7 r1 h2 x6 C        }
' z) S8 A2 n6 O6 b1 e# r        UARTPuts("\r\n",-1);- F; ^; j) V% g6 i
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
. }# W, v, [, x/ m% v3 E' Y, ^        UARTPuts("------------------------------------------------------------\r\n", -1);; R8 T8 A9 u; N: Q; H) g1 t

" V, M- L+ t- s5 T1 U3 y2 q        // 主循环
' S7 M& c  u. i1 ^, y; q( C        for(;;)
! ?% @/ ]3 C* ^3 y, E& F$ Q        {( {, z! Q4 `5 k  q1 |" W

# K: s7 M& v* c6 G        }
# m) S8 a5 D/ [" U- v! ^}
* v7 `8 z8 x5 p6 W/ k  g
+ K' f2 Z2 J. `; R4 x/****************************************************************************/
7 @6 t. `# O4 J2 F7 `4 |/ C/*                                                                          */
! o" T" d: C, p3 l/*              PSC 初始化                                                  */
; v: f' ], `2 b! z. E. ~/*                                                                          */9 K8 R& Y4 x- X9 U: V
/****************************************************************************/# q3 k9 Q& M  Q8 f; E. B
void PSCInit(void)
2 R  s9 o( c2 B5 i2 j{
& k( R) O+ q2 R* l4 ~        // 使能  EHRPWM 和 ECAP 模块5 S1 q# g( E8 }- d& W7 F
        // 对相应外设模块的使能也可以在 BootLoader 中完成
7 E# @3 Y% q- {    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
5 p- u& r! A, \, L9 b9 [    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);9 X5 p1 Z. U3 o& B' v& D
}
& u- q% h" w$ w0 ?" `: a+ I9 O! `& v6 @+ q) e0 }. [$ T0 W
/****************************************************************************/* F4 t8 C* z- D& s5 t
/*                                                                          */
" K. B7 G1 @+ h# ~/*              GPIO 管脚复用配置                                           */
$ {/ F5 j/ b1 ?/*                                                                          */% W" z7 M4 c$ u* ^% i6 ^
/****************************************************************************/
8 e- a: }9 z+ B( cvoid GPIOBankPinMuxSet(void)
2 O* P! _" I% x. F: p$ I) r& }{
7 k) J$ R3 b. z+ N        EHRPWM1PinMuxSetup();/ u7 U' F, J6 k' f

; `. m! ]+ {2 O- R% T        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)# E) C; @$ t- R, F' @% z* p
        // 作为捕获功能时管脚方向为输入# ^  Z1 M6 @3 C1 K5 a" Y5 }, f
        // 作为辅助脉宽调制时管脚方向为输出
6 H2 N2 a$ F* z4 x" r# u# S3 T    // ECAP2 / APWM29 B7 y( n! P$ C( H! q6 p
        ECAPPinMuxSetup(2);
  Q3 _$ F1 k# d; s+ `$ D& o! M# R2 ]0 p" w$ z3 G- B; F
        // ECAP2 / APWM2方向设置为输入
( H/ s) J5 C3 y7 I8 h' W        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
" r4 U  s& p( s) H& f" j}) r8 H3 c# Q' i$ y% p9 N

3 O3 U. ?0 I1 X/****************************************************************************/6 b6 Q  m0 M. I& R
/*                                                                          */
' L7 S: b8 J4 P) B0 w/*              PWM 输出波形                                                */
# j& }/ f6 _* G" }' z; s- _" v/*                                                                          */
% r6 m! N! ^% @% \- [; I. }& k$ G/****************************************************************************/3 s6 g) q3 ?3 h) h% g
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)9 v$ j8 R$ x( P7 ~6 {3 }& {$ E0 `
{
. B5 p! U! f2 k0 p1 B) B" e    // 时间基准配置
/ ?3 L2 x7 Y9 j    // 时钟配置
2 `  y2 l1 M8 G3 }3 f    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);& {! K1 D$ |2 Y) w

+ T$ ~# X& c; N( x& s, p    // 配置周期* V) z) F( S; d5 j6 u, I- b
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
( m" G4 q' ^: t. V! r! U3 r4 C1 U" Q                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
5 P/ |4 q! \; u7 @
& q. X/ q2 c5 C& k* d% O    // 禁用输入同步信号  J5 x5 M) e2 }9 I, w
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
" f' I% _9 F! t% s4 h
  z0 ^) T$ `, i& f    // 禁用输出同步信号
6 m& z) @' x6 z; c! o. Z    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);$ z6 A: n  L6 z! f

# F  S$ Y' h1 A7 K6 p# p    // 仿真(DEBUG)模式行为配置
6 j! |$ ~6 N6 F- ]# C    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
- Z% B; h" B8 t5 x9 Y; _' R
7 K2 V3 K7 J6 r% Y1 E; e- K. c0 p& a    // 配置计数比较器子模块
$ d: V; E  q5 t* F: E; Y- G    // 加载比较器 A 值+ ~0 V) l' I/ @5 _1 c
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
, n( b% V2 ]) x" T; t                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);5 [3 i1 \5 I' F: {, z
( B" I. E! |& H
    // 加载比较器 B 值
% u/ @, S4 `0 t0 X6 h: x    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
& v9 b: E; ]: N5 }4 h                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);% M( }( p- L+ p' |& x
- x4 E3 {# E8 d- o
    // 功能限定配置(输出引脚触发方式设定): [1 G4 i% W2 y7 R/ ~# A4 ]
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出: g) ?" c* }0 W
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
* X) K: t( S0 b                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,* x$ x% p: N" w! r& D7 G& E0 m
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);& S3 ~; J5 D/ Y$ I0 K; ?
. l3 \: A/ N- t& B: w, ~
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
$ k5 t8 p: `" W: r    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);) _' i) ]. e; t% b3 j, Z9 U7 O

% @6 i7 w& Q5 Q    // 禁用斩波子模块' Q! r! a' a# M0 T4 v5 I
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);8 n' u5 W0 C. Y, ^3 [) W/ y
% G: {4 e1 t/ r' J- x; g
    // 禁用错误控制事件
) r4 h4 }9 \' q9 z$ ~    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);& X0 f0 R5 B$ X! P, Y% Z1 @1 x
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);" u7 n1 c  v' s1 n' l* j2 {' B; {) o
# I1 P& f" a% Q1 _1 p+ X9 w
    // 事件触发配置
* V2 [6 F/ ?9 u    // 每三次事件发生产生中断( A1 j& `5 s: \8 [
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);  Z$ K( X- l" ]9 M, t
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
3 Z5 ~0 I/ _" }    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);! h! z# q1 c* i; p3 b) Q
    // 使能中断
2 Q- V. {, f) Y# r" `$ b    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
& `+ [2 H5 W: W4 R# J% k3 Y9 f: g+ P4 q$ A8 h
    // 禁用高精度子模块
9 E4 P. d2 l1 @+ F    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);' i2 G5 x6 j+ m3 U/ ^: d% x

$ ~/ M' _, T. G1 ?/ h    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
4 h+ k3 E- s# Y' d}4 L& i2 b! R' O
; A, u* k+ m1 f% m% l% g. {
void ChopperWaveform(void)
0 x, p3 W1 O" ?9 g% h( B{* n0 _, }6 L6 q! T* v5 g
    // 50% 占空比, c4 \4 R' t* g- c3 |6 b
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
! _- K3 |) D5 D    // 4 分频
+ j. y/ n: M0 C3 X    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
3 `# I: b, P' B! ]    // 单个脉冲宽度2 g. Z* u, f; ]) M7 Q' o7 @
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);. ?) c6 @1 X' y, J# g. R: i
    // 使能斩波子模块
2 V3 q2 K8 n" Y    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
! ]* s) O/ `  X6 ^}
( Q$ D% h# m% J$ l4 D" h4 I3 V( |4 H: N2 A* ~9 o) y
/****************************************************************************/
$ t* m9 V* F* Z0 t- x" g. m* Y/*                                                                          */& r% ]1 r# F5 F1 Z: c. q3 N* g3 [
/*              PWM 中断初始化                                              */& L5 k" a# f3 h8 c+ B1 d+ ]2 J
/*                                                                          */
+ u) r% o5 ~3 H* ~" b- N2 C8 r/****************************************************************************/
8 }& ^4 _% [# nvoid PWMInterruptInit(void)
0 e) e) M  w. n& J' v+ R) j6 i0 S9 K{1 \- @( \5 l* F% S% s* y, M
        // 注册中断服务函数" @  _# H2 |' T9 d: U3 |- n0 ^
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);( P2 V) f5 H7 K' z
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
5 Q) q. Q  v" l2 [( }  C3 `  t. x4 V' z* N9 m
        // 映射中断
& K+ k, v: j# @/ H        IntChannelSet(SYS_INT_EHRPWM1, 2);& j6 |6 ?. x3 M$ C
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
" Q8 K& r+ u% m
. f$ m- ?9 a1 L; V: d        // 使能中断
1 v+ l: w% H% L' i% Q& y* x7 f0 ^" E        IntSystemEnable(SYS_INT_EHRPWM1);# o) `; D  q, V$ ~- `
        IntSystemEnable(SYS_INT_EHRPWM1TZ);. z" m; e& S9 Y
}7 `. k' A9 W0 B) }" i5 z4 i

! b0 o8 P' m0 N( \  w; s$ [! G/****************************************************************************/6 _- x7 B9 f" x# S! k! k" I9 X& x9 a
/*                                                                          */9 ?8 \) ~+ ]' ]* I( S
/*              ARM 中断初始化                                              *// @4 A) l( Y$ o) [
/*                                                                          */0 a4 Z- I' @7 m; @+ J, g+ g: E
/****************************************************************************/
' ^5 u, O; A' ?& h/ Lvoid InterruptInit(void)0 m, J; w" _; P7 X; w/ L/ c
{. z4 T' Z+ l6 q3 e$ S
        // 初始化 ARM 中断控制器
: ^) M% U" M" E; ^        IntAINTCInit();( J& k4 y2 b+ X/ Z) q4 h4 i

" M4 |) D  ?( S4 X. |  Y$ p        // 使能 IRQ(CPSR): [+ L) n( q, w: @, S. P$ I. Y, r
        IntMasterIRQEnable();
) o' I* w+ H. s0 x) Y
3 f( r! l& A# F        // 使能中断(AINTC GER)
% ?7 q& ^. a6 G7 ^! R( F: x& X        IntGlobalEnable();
# V/ c# k) a6 _; ?8 f+ w! b' [: u: A/ j1 U
        // 使能中断(AINTC HIER)2 J5 y  R! ?+ F% W% X& H
        IntIRQEnable();5 C! j% R0 W( r+ p6 `/ a6 r' N
}. @9 P0 E3 ?: p. u" ^/ a* i( I

5 i0 A' Q# s+ f& ~0 b( R/ k
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/% F* p8 ?& J) O4 Q. C
/*                                                                          */- l, T8 M1 n% B4 Q5 I! R3 U
/*              中断服务函数                                                */
/ d# |8 L) ?% g0 C% g  Y. m& G/*                                                                          */
, S9 A" x6 n+ i: j4 i7 h+ {/****************************************************************************/4 ~8 b0 P1 q" T6 [, _/ ~6 B" @
void PWMEventIsr(void)
+ ^4 ]* A! E7 }; m) @{' K" V: M8 i3 c1 l& f% w# W
        IntSystemStatusClear(SYS_INT_EHRPWM1);
# @! v) }" ^: b" z* j2 u- Y2 F& [3 _/ v) W6 W$ \; ?, Z
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);  A' l, q1 x0 ^/ {" P. t* P# P
}
" v* e1 y1 J; M( T& p' j
! ?( {" a6 q2 q1 ]9 Y- `. S  kvoid PWMTZIsr(void)
. A( r* U' {4 M4 d- k{
/ E4 p& Q0 x% Q. T) K        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);) l0 s% _' a; F4 X

' p1 \. q  j3 `* b* B    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);) c8 J) m8 \$ a5 U
}) \% M9 H; E: v) G8 P1 U; I

! \6 r9 Y& T5 @! X. |/****************************************************************************/
6 Z* m8 A9 @+ ?6 I3 d/*                                                                          */5 T4 G; [8 E8 p5 i9 r7 |, J  b
/*              初始化捕获模块                                              */! m0 P, D6 p& A' a) U7 ?5 W
/*                                                                          */
: t2 w, |2 e# g6 z8 i/****************************************************************************/- e) g4 l- ]& _4 f7 Z% Y
void ECAPInit(void)
2 f0 r+ N$ n$ F5 W9 w3 T; S. @{1 z) p) r* @" _
        /*-----设置 ECCTL1-----*/
& }+ i' j) I( \$ s' |: J# R0 @4 E        // 使能CAP寄存器装载: j; W- R& m9 c% }, y+ z) B
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
  C) {0 p( ~" ]) Q. U        // 设置预分频值.$ X6 H; p; u1 s$ h& e+ d
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
& C3 x# B# d+ C8 H. K9 U        // 上升沿触发捕获事件
0 s7 `: G+ U) k+ i0 t        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
9 n2 w3 D7 B8 g$ m, R        // 输入捕获后重新装载计数器值.
! @3 }$ d0 M$ }# N7 V        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);% B( L& i4 |# Z. @  ~2 d
4 W4 @8 d3 D1 _% |0 m0 a9 C, k& {5 p
        /*-----设置 ECCTL2-----*/. ?$ m" ^% ~  h: z9 [: H/ S# L
        // 连续模式
: U! d$ m/ G! b! N/ a7 k        ECAPContinousModeConfig(SOC_ECAP_2_REGS);$ f% _: f" w; [- ^: q
        // ECAP计数器TSCTR持续计数- ^3 L( M- g  g  y; d
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
; y: Z! a4 z9 a. ?0 D        // 禁用同步输出和同步输入' T4 k( p5 X6 L+ i. Q6 ]
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);7 |2 b* ^, w3 _& ~+ n
        // 配置 ECAP 2 为 CAPTURE 模式
& Q0 r  c: Y' \  o: {4 y        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
' g. M; [1 i" @! o0 r# W7 r, J, l3 ^) V/ b( D
        // 使能中断3 n* b6 R; k4 Y2 W' d
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);* V& z4 D/ p+ U9 ^' V
}
6 G' i- h# @1 ?! v
0 h3 F" J" p/ s' D! j/****************************************************************************/
1 O% z2 K3 Y% P' E) \. K( D, J/*                                                                          */
- T5 M  I2 L( S) m# u2 @) b/*              取得捕获结果                                                */
. ^: i1 W! ^9 c4 f7 u( s/*                                                                          */
4 Q  t* ]4 G* _& e/****************************************************************************/
7 G- a" L# J) c; zunsigned int ECAPRead(void)
/ K" C; u4 K. I1 e{& T9 B4 ~! _& G+ `6 q: V
        unsigned int capvalue;
+ A4 d& {/ K) [) z  c        unsigned long frequency;
; h/ ^. C5 [% F$ v: Z. j/ k$ n+ s; @, ^. X( `% B" u, \% Q
        // Event1 中断标志3 G& z6 c; P& K- t9 E, X
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT)); T+ P; D* S, x7 n
        {
5 o" A. D7 n/ z0 F" }) \! u- J1 U                // 取得捕获计数
; {2 W( X2 U* [                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);3 T* W7 P' Q! w! g  z
                capvalue = ECAPResult.cap1;
% W+ @5 M6 q: Y$ p) l' O5 b' Q. y) d) |+ _/ |1 F* c4 E4 f
                // CAPTRUE 模块 228M 时钟主频
4 Z- T9 b" b7 t3 ~! b+ h                frequency  =  228000000/capvalue;4 V/ I) u! |  S6 z& j
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
7 h7 ~' D1 e. i! H, `7 ^
& P% `+ ]5 L3 q& w& L                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
1 e- t2 b* l  J5 k//                IntEventClear(SYS_INT_ECAP2);
& U' u8 u6 s( k2 ^        }
) B. ~2 W# g" ]) _: N        return frequency;7 B/ u5 W( D6 Z9 d% h6 }
}
8 l1 g0 E- {  g$ F5 `; e+ e8 a
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。% D" b$ k5 p; J1 G, @
[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