嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
: X6 `$ t3 H. Z2 o+ }- m" l
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
" }9 ]3 R5 Q1 i8 c! G3 q' f/*                                                                          */- G7 Z3 k) P- C0 v5 R2 v
/*              宏定义                                                      */
. F0 V% e# B! |; b/*                                                                          */
9 d0 ^* M  l9 i4 \, I/****************************************************************************/; s  J  |9 s# m0 c  m
// 软件断点& N5 a7 q+ L* w' T
#define SW_BREAKPOINT     asm(" SWBP 0 ");
. a1 n' W/ W! h# N% {' a: e! h* z, _9 E) ?6 |3 D! N$ u( a
// 时钟分频
$ M7 @* @9 A' e4 M; y' T5 [* v#define CLOCK_DIV_VAL     2280 t! S# S- o4 M- L$ U
  }& c+ i5 l: U! {
/****************************************************************************/
* I% d: ]* A, h$ h0 Z/*                                                                          */$ k$ ?, e9 W4 W3 g5 \3 J' |
/*              全局变量                                                    */
* J" d4 e1 d* B' d/*                                                                          */! S' q8 I: w# y. s7 f- B
/****************************************************************************/$ B  b+ ]( k. R3 M& ~  k% G
ECAPCONTEXT ECAPResult;( u8 l: J6 M9 v9 @6 k, O3 m* b3 W
5 R8 ]6 c! C1 `: K  A8 P! P$ P3 _
/****************************************************************************/' ?- ~; @% P6 M1 ^
/*                                                                          */3 b, A$ ?( Y; ^( R% l
/*              函数声明                                                    */
. P3 j8 l) B+ L. d2 F5 E: e8 ~/*                                                                          *// c( T$ B5 ~. Z+ I2 S
/****************************************************************************/
8 L4 b. o; w" o// 外设使能配置
1 ~9 ?5 c: l. `' f! Avoid PSCInit(void);' P  t" U- _" X. L

0 n4 G0 \* w, ~. u// GPIO 管脚复用配置7 x4 @9 R; h# K8 Z/ w
void GPIOBankPinMuxSet();- M- F6 ~* Z( p3 H- r9 U

. U0 b9 Q% I0 b$ F" e/ D// 产生波形& ]; V  ?4 D, h, ^
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
. C- D3 Y( L* T& A1 k6 tvoid ChopperWaveform(void);! z) [9 ?( M+ z, O( i) V

7 h, t0 m8 Z) |6 u. `$ I4 x! m/ [8 P// ECAP初始化和读函数" i2 y. A  A0 F& f9 J. u
void ECAPInit(void);
7 B. w- p: x( E7 O  y' l( n6 Zunsigned int ECAPRead(void);
/ X  a; r2 l! ?3 [& Y$ B. V* j- y* g5 S# p6 u  }
//ARM 中断初始化' t0 R0 M2 r5 Q. A8 n2 r" u9 f
void InterruptInit(void);4 j% [. V$ U& A/ B# m, j" j' T

' [1 \% }' I  I; L! B3 A0 B// PWM 中断初始化" ^1 D- n% V9 K0 G5 `
void PWMInterruptInit(void);6 C! M$ _2 e( Q% N* z5 F2 f( z
// 中断服务函数
) N0 a/ W+ X! Z6 K9 I0 s% P// PWM 事件' {' i& [! M! c6 C4 [" C& V
void PWMEventIsr(void);% x% k# K3 r4 x; a
// PWM 错误控制事件
. J! I! _* [5 ^+ k) O* Yvoid PWMTZIsr(void);  c  z& w( c7 i& ?' n6 Y
1 i- x" _9 a  H8 e" R
/****************************************************************************// z2 e1 O1 `) N  c
/*                                                                          */
; B/ V( e4 S1 A) U/*              主函数                                                      */4 w- r) |% Z; v" c2 {+ i
/*                                                                          */# Y7 E3 u4 [! T: h
/****************************************************************************/" `- q6 \" K5 Q0 R3 h- u: z
int main(void)- K2 G2 V$ a4 Q$ H% \5 C: K; x* {
{; t9 ?: g, s( Q6 P( [4 Q, ^
        // 外设使能配置
( T  k  T! i' f% I1 d* s        PSCInit();
* G5 f2 t# l) h. R5 w' Q5 d% L& T9 `( ?3 _1 |! R& q
        // 初始化串口终端 使用串口20 i$ `) S; b) H; K& }
        UARTStdioInit();
( x2 W6 Q2 l$ j. _9 S# o       
4 l" p/ I) u; h+ l        // GPIO 管脚复用配置) n" V  H6 I6 X; w
        GPIOBankPinMuxSet();
5 s5 v. ^8 e1 {( {. B  z
( h1 a# q2 l$ d9 |5 P  [        // ARM 中断初始化* W) T1 l, D% g5 L& I8 P- S
        InterruptInit();& v( K- X; u% P) J
- C! y* r: \+ p4 C; k
        // PWM 中断初始化0 h1 `6 q  g2 v1 _' K1 ^
        PWMInterruptInit();
: K  j* W9 W5 h9 i4 A" ]- W6 J) [
# q7 Q' T1 X+ M. S, Y* S/ q* \        unsigned char i;7 r7 k0 F& g% d3 K" _* l
        unsigned int j;7 A% u2 b* B9 G. ]0 P: \7 `- e

0 F+ B6 ]+ ]9 |/ K1 v        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);" c9 u: x$ t, h6 Z3 }/ n8 V. R
        UARTPuts("------------------------------------------------------------\r\n", -1);5 i  D) |6 v7 j/ q
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);7 J, N. K2 J- b+ n
        // 产生波形
9 |: _3 L6 _, U# M        PWM1ABasic(25000,50);3 D+ D2 k9 w9 x. S0 C0 q0 A" [4 W
% r+ _+ z. I% C0 f8 `
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);3 a$ b. c0 z- r. }
        UARTPuts("------------------------------------------------------------\r\n", -1);& t0 y. k$ p. {6 H+ O7 N
1 u3 C* ^; P. I3 E; B# i
6 u' k: H" x6 J/ w6 Z
0 q! U% i) ^: N: f0 ?& J. J- Y
        UARTPuts("------------------------------------------------------------\r\n", -1);2 [9 Y6 W2 @: {
        UARTPuts("                    C6748 ECAP Test\r\n", -1);
- F% Q! s, u: |, k$ U+ q) Z3 L        // ECAP 捕获初始化& c( C2 j$ i3 M( x
        ECAPInit();: y; O  A8 X" n5 p, u
        UARTPuts("Initialize ECAP.......\r\n",-1);! ]* G8 d; u6 @2 M) ~
        for(i=0;i<5;i++); U. f. [5 j7 i# o* t% N
        {; x; g0 L) {  k  c  V$ Q7 X
                    for(j=0x00FFFFFF;j>0;j--);            // 延时
5 Q% @' G# H' e8 m) K                    ECAPRead();/ k0 f9 n$ {1 [7 k* p' h
        }
4 u. v8 {* S, W, V2 Y        UARTPuts("\r\n",-1);+ D$ A5 @, u, J
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);' {1 e( L% G8 k& y0 F, G
        UARTPuts("------------------------------------------------------------\r\n", -1);9 D8 w4 E+ \' E' l6 U

! E/ ]4 ~/ l: R0 n# X- ~* A  X9 Y6 q        // 主循环( k+ K7 O9 P5 x/ Q6 V
        for(;;)* |$ N- [5 N1 R/ m3 {) h$ V7 \
        {4 N1 R) S+ ^# p- Q+ T
5 c$ U, `; S" }" T
        }0 W. T1 g% ]$ ^5 Y( I8 X
}9 N' O$ y7 {5 r3 A
8 g, U, B3 P, T) V: I  a9 ^
/****************************************************************************/
, f  h' l& q7 I- D4 t/*                                                                          */
- j5 Y! |, Z" J4 @7 G/*              PSC 初始化                                                  */
5 c: Y# l) j3 |/*                                                                          */
6 `$ t. Q7 |0 `$ W& i0 p% m3 z/****************************************************************************/4 U# J1 W0 e9 q5 f, D& V
void PSCInit(void)
2 C3 ~5 j+ W7 y; H2 w2 Q{# d- Y2 [$ t: H2 g
        // 使能  EHRPWM 和 ECAP 模块* b; S( ^- i- y" @  i& _
        // 对相应外设模块的使能也可以在 BootLoader 中完成1 V6 }- ?/ ~, T( }0 K
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
! r+ W; d1 A7 T  I) j" q4 V/ W    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);6 w- z' z& f" R. u
}
) {6 J: s) Q& b/ N: I7 J0 w* I( E& g% Z  `- u. r" d3 V* s% Q
/****************************************************************************/
/ L/ w+ ^& i6 A$ ^1 i( v( j/*                                                                          */
9 ?) w# d. g0 X# M& t& q/*              GPIO 管脚复用配置                                           */6 K- ^5 @% z5 @* {) h
/*                                                                          */
0 k7 x- h2 Z) A  |9 `0 z/****************************************************************************/
, o2 P$ |: J2 H. |0 J( Lvoid GPIOBankPinMuxSet(void)
1 V8 [8 p1 \5 D: K{
) S6 q% `1 z. v, s6 b        EHRPWM1PinMuxSetup();" A6 L0 t4 A3 v8 m

( _* V& ~! }, _+ K, \1 }        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)9 j+ c9 e! V8 ?7 f( N8 o9 {
        // 作为捕获功能时管脚方向为输入
/ Q) r) g& x. G7 @        // 作为辅助脉宽调制时管脚方向为输出+ E/ j0 h+ ~4 Q+ t
    // ECAP2 / APWM2+ v) W6 w7 E$ n3 x& C
        ECAPPinMuxSetup(2);/ v  o/ o6 ~+ H5 s+ d& [2 T# M

4 }6 @1 i! _9 U' K( r( q        // ECAP2 / APWM2方向设置为输入5 w" H& H4 X0 T0 t
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
( R, a7 y" s3 J! H1 O6 L5 }" l}/ T/ A! ^$ n1 _# t1 c+ {

6 n2 v" r" @8 V$ i/****************************************************************************/
& g7 F0 B- Y. ]* p4 Y' z1 t/*                                                                          */  H  P2 ?/ ~) |' A: d" f8 X& L9 J/ I
/*              PWM 输出波形                                                */; b8 u, K/ @. a' D, t. S
/*                                                                          */' H$ l: k- x! O" d, e* l* U: }
/****************************************************************************/
9 r$ _1 u! Q( @2 z# y  Cvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
2 f5 k2 R* w0 D: E- r; y{
: d, \1 I# x% s: [" [    // 时间基准配置! O' n+ U7 W' F9 |* E# o4 ^* K
    // 时钟配置+ h% H1 o1 D( N" E# s; V
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
) S" T$ v& s# V, u4 E4 n/ s( x- S( I: C0 z
    // 配置周期' C$ N' F: _# `3 ^5 H' M& u
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,- \2 _& e* _" n: u% Y3 L& R/ m+ [
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
7 U7 s( J; z2 j2 f2 B4 B" t9 u' `+ T# X3 K* D
    // 禁用输入同步信号8 H0 n& z* r4 Z  U0 _( i7 x
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);+ U' m# i" W1 C( B" I

. `2 b- H9 r: ^/ N. L6 w5 K* J    // 禁用输出同步信号
6 j# d3 ]5 r+ c7 |6 ^9 }7 j    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);! f( l. t& b$ _8 h, U) @6 `% v* J) ~
2 }7 C$ Y+ b& q. @6 u* U1 P
    // 仿真(DEBUG)模式行为配置
9 M$ W& @* {4 h8 m7 |0 V7 I1 H2 [    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
( N% h. c2 J8 w: d8 R( f5 m, U' f) c+ X' e& r( \
    // 配置计数比较器子模块
" Q0 G  u4 h6 n/ y; i2 p    // 加载比较器 A 值! e# T. K# y7 w# g1 y5 z
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,' b# `% a. v7 k& _
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
  z3 P- W! k' U- d; J* t, ?0 v- x8 i% f' d. K8 p
    // 加载比较器 B 值8 ~$ e2 y6 y& g$ Y: I, D+ y5 [
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
6 Q9 E# W$ G5 e# D0 i, N                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);& F& ]& b% m; Q' o8 \) B# P, d. m8 r
. u( P9 {3 y- l6 Q
    // 功能限定配置(输出引脚触发方式设定)4 J  Y* I$ G( c  r5 H+ ^; }
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出8 D6 |9 p7 ]1 [% @- @' F9 ?
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,4 ?% T( a; F) g# A
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
4 s- B0 Q6 E* n- Q                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
+ z+ {% f, h, \
8 k0 |) h* M. ]    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
" r; w) I# X3 l, M+ N    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
- D- R9 k  ^* T6 @1 n% m
" w/ a+ i& z* F2 G% X% u( v- d    // 禁用斩波子模块5 R+ R9 u: K+ i& ], B+ c
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
" p6 I( j# r5 T# l6 Y1 y# c3 \! k% m! h
    // 禁用错误控制事件2 k* N: K2 A& g8 _5 p0 g4 B
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);' ~; ^, W1 g( ^& z8 s* [
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);+ `* i( |$ G6 C7 s7 ^

1 W/ j3 d5 \! ~$ ?3 d; i* _    // 事件触发配置
" X; d. s+ y6 f' Q, f    // 每三次事件发生产生中断( y- ^) v4 p# g5 u- I* g
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);. X: a5 d$ C$ q9 _
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
8 S3 g' }9 h7 H  W    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
* N* R/ z' ]7 y2 T8 D    // 使能中断, m% c' {6 E4 \' u
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
; [9 u) }7 ]$ H! `
8 n  ^1 ?  X' o( Y; f8 o. S    // 禁用高精度子模块- R# _2 F1 [( G# i
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
" }9 E; o- b  N* b6 |1 Q# e( d4 T1 s* I5 k1 U
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
# V" J2 N" v5 u! Y1 c6 s}- E  h& f7 s# N2 q& y% J" x

: y7 }! g0 N4 g$ [2 e8 h$ ?- D7 Dvoid ChopperWaveform(void)
) I0 ^1 V; S& Y3 [{
. ~5 U% e' |+ B# k: N    // 50% 占空比2 _0 V0 _, I+ ]. s
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);( l2 M+ N4 i- W* P' R
    // 4 分频$ a! F$ e! K! ]7 M* L% X) d  x
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);% z: s( |5 `# c( Q" {9 n
    // 单个脉冲宽度
4 [9 z5 t3 U2 t  C* v    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);& T( v# [. D9 H. }/ m) g8 a8 Y
    // 使能斩波子模块
& Z1 G/ k; S$ F, e( y0 \    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
! P9 a$ g. s1 i8 o, F1 V( U}/ i+ Q0 |6 q' ]  p6 A

2 n# b  w9 a3 f$ V9 g/****************************************************************************/
9 N, ]  \+ ~, W# {/*                                                                          */, E0 Q  L/ B9 u4 t0 v+ S2 m
/*              PWM 中断初始化                                              */
7 y+ v( n$ P; l. w% R9 H$ c/*                                                                          */) ?- P5 d7 ]# H# d! Z
/****************************************************************************/
" T  b* c0 G6 W) R3 fvoid PWMInterruptInit(void)
8 ]8 s1 b" Z7 ]" }% F1 v. n{
% B- g6 t8 t' w        // 注册中断服务函数
' j& W3 o/ x& A) \) W        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);7 C( q- V% {- D9 l) R' z
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);$ J$ @' U+ l8 D$ W7 r9 N
; e( o% @4 B, ^" A* T3 i% S9 ]
        // 映射中断
4 b4 s+ f" Q1 P0 W$ N        IntChannelSet(SYS_INT_EHRPWM1, 2);
. Q7 p$ `8 r. H: D  p3 \! k        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);( P9 Z( D/ M) K- }
8 I6 }/ j5 ?  Y, u/ z* Q4 |
        // 使能中断0 j- Y" w9 e- x; P5 Q  b
        IntSystemEnable(SYS_INT_EHRPWM1);7 A" p' r2 G% }; g/ O
        IntSystemEnable(SYS_INT_EHRPWM1TZ);" T. H# i9 G3 e8 y* N
}7 `- S' E. W2 M* B

% n7 K4 i3 e9 t+ |) [* a7 u9 q/****************************************************************************/
. @5 Y3 M2 m" }% o& D/*                                                                          */
; a! v. [; Z3 B/*              ARM 中断初始化                                              */+ Z: @& J  M; b$ x1 Q0 t- K& g
/*                                                                          */
) m3 Q- _/ X0 s* \# u1 F9 N/****************************************************************************/
9 k" Q" m. B; h' [2 zvoid InterruptInit(void)
$ j/ F" h. i1 i+ Q, b{2 ~2 h5 W* P# [
        // 初始化 ARM 中断控制器
+ W, `/ A9 i6 X/ r8 ]        IntAINTCInit();; r! }4 M) l$ t! a8 z' n
6 [  y) X, Y3 D
        // 使能 IRQ(CPSR)5 F: ]# ?# l" a5 P3 ^" z
        IntMasterIRQEnable();" p% h3 o) c' [1 _
7 p1 Q* w1 V) H$ b$ Q$ Z4 V/ }4 S
        // 使能中断(AINTC GER)* s/ I& d9 k$ Z: `" R3 f6 `
        IntGlobalEnable();3 }% c! v% l5 I8 J8 ^2 ]
; j/ m0 y' i% A- c
        // 使能中断(AINTC HIER)
9 w; B; Q4 p' ]) E. M2 I8 {        IntIRQEnable();
0 k# x/ r) c& I# B+ I1 b}
! k7 E( W/ x5 l
) w( W2 v- O3 R
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/, Y# f/ E+ O3 q' o
/*                                                                          */
' O' R- P5 F- i- W/*              中断服务函数                                                */
9 @2 I8 H8 G# p: D6 D0 s4 w- k/*                                                                          */
% g1 ?! q8 w, d6 h: n% S( k" H/****************************************************************************/3 _# f5 _/ y7 C
void PWMEventIsr(void)
0 G( y/ ?' K; G7 r6 B! x( r{
& G; R. q3 ~& z! F9 E$ i9 r        IntSystemStatusClear(SYS_INT_EHRPWM1);2 W# |, C( K9 Y/ Y! Y

# R7 A; ^! }6 F    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
' q% N/ d, B* y  y}" l" j5 j$ \1 v9 x

  M$ J/ w! K4 Mvoid PWMTZIsr(void)2 l. x2 {* v3 D& Q/ [2 U
{3 ?; j0 X" u/ R) g% F% n3 x
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);8 n: Z0 v$ b8 ?, G
" ]1 {. b/ G; H4 X, q
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);, v$ p7 i  h# y/ W
}5 T0 }! X+ g5 v
8 C! L/ A. ]6 V/ D$ M* ^
/****************************************************************************/9 b$ Q, h4 L) ]9 V; Y+ |
/*                                                                          */
# s' v1 n( C0 @9 m7 W/*              初始化捕获模块                                              */
: o+ w) q2 q, G+ m+ y. l6 u/*                                                                          */
5 j6 L4 a- [* ^, u/****************************************************************************/
+ X+ ?1 D* i  T( L4 d$ nvoid ECAPInit(void)
+ o; L# T1 p. k9 q{
3 R5 ^/ F. n' J. m! [, z- t! X        /*-----设置 ECCTL1-----*/
; q' i) D2 n8 I% `' ]  g4 T- o        // 使能CAP寄存器装载
8 V; B8 @( f0 E. [2 g        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);7 s( v* T0 ^( }4 a) m# v1 @; P3 e
        // 设置预分频值.
. j" k0 q( {& e        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
( L$ J4 n( E3 S# b- a' B; f" c# \        // 上升沿触发捕获事件
- M( }5 l, A2 t; q) ]! H6 \6 `: D9 b        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
! W2 u4 I- _; p; b0 y. r        // 输入捕获后重新装载计数器值.& w) c* k& @0 T) K' [0 n" e5 E$ ~
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);- V) @) P, I+ [4 s. l/ b
( w+ x' X1 ~8 w+ d" {
        /*-----设置 ECCTL2-----*/
! Q& ^# w( l$ F* u/ E0 Z4 n6 z        // 连续模式
8 n" j9 j' ?5 Y1 S        ECAPContinousModeConfig(SOC_ECAP_2_REGS);4 Q& z$ p1 T2 @5 c( s
        // ECAP计数器TSCTR持续计数6 e- h' }3 W  N
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);$ U7 z# h: G) {7 F% |
        // 禁用同步输出和同步输入
3 I* i" x+ N) ~2 x        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);/ t% }$ s* u' Y5 z" }9 w
        // 配置 ECAP 2 为 CAPTURE 模式
& n2 }6 ]3 V& b; `        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
* B7 Y7 w& d' h5 J" g7 u' h$ p; w+ o% a( F
        // 使能中断
7 b' [- B% g* r# B$ n1 a: `6 ^+ D6 v//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);  [% n! O8 m2 P6 T- f
}
( i; _5 L) X1 {1 W# C+ B: t$ J8 E  H1 V( \% s0 G
/****************************************************************************/
8 W5 t1 H$ `7 l7 p/*                                                                          */
! P7 a7 o( N$ I/*              取得捕获结果                                                */9 s' S3 a! |. p$ b& U7 d. U3 ?
/*                                                                          */
" i) B" B" U8 J) c2 Q1 }. N% r/****************************************************************************/7 Y+ P( O( W5 K& b
unsigned int ECAPRead(void)% E! ~6 T: Y- D' [5 }8 g
{
& A4 u; o: l6 J) o9 U# P. F' b        unsigned int capvalue;
- Z8 S2 s8 Z  c% R0 |. g& w5 y/ i        unsigned long frequency;
- ^1 c1 j. m$ G# l1 P: \% b% z4 [7 U# [. z3 T! A1 _
        // Event1 中断标志9 V; T. h7 E) \' e
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
1 H+ V6 {* d6 q) ]        {7 b8 Q* i7 K8 J3 v2 z) Z& Y, A
                // 取得捕获计数! @. C3 L1 `+ s3 D
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
2 `  ^' ]/ h% |                capvalue = ECAPResult.cap1;9 F9 _# N; c$ `; I" Q4 ^1 v5 W" o

5 `4 n' O+ S. U                // CAPTRUE 模块 228M 时钟主频7 k4 T- A7 K+ v5 F& a
                frequency  =  228000000/capvalue;
3 D& y$ q( v3 c0 ~- M6 W9 A6 M                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
7 L6 m' @. b3 J- p5 E, x; J- c3 l# A  o* R! J
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);: o# O5 g; n( L3 h* V
//                IntEventClear(SYS_INT_ECAP2);0 C- o- E7 y. k, s* G
        }
* \9 `6 q) T$ o0 Y7 y        return frequency;( b  c5 |8 V8 R( l) D4 ~
}
* X7 [, f" \  k% ?
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。) w# `; F3 r5 C: m8 M7 h
[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