嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
- f# E' b0 y/ p; a0 o
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/: U, _5 s+ Z  T  \5 K. `, d
/*                                                                          */
  L6 C( @8 |+ d$ V' @/*              宏定义                                                      */* i7 n% w+ G. o/ D2 X# V! d
/*                                                                          */2 l3 b+ K# f! N9 A) s) u; f" F
/****************************************************************************/
1 w/ b5 w. W$ i4 I- k# ~4 v// 软件断点1 |1 K# G2 \& }1 s% i% Z
#define SW_BREAKPOINT     asm(" SWBP 0 ");" q" j* L$ ~! l4 d: B4 v, r
! }3 ]. d) @7 d- f
// 时钟分频  f) ?/ M" c; ^2 F; o: ]. N
#define CLOCK_DIV_VAL     2280 I9 P4 B; ?! |% F
7 C: v3 A& S. m5 o9 s7 a
/****************************************************************************/6 J1 j4 S' H' e8 Y  Z. ?
/*                                                                          */- `% U% f, K0 a: J1 b6 `3 K9 Y
/*              全局变量                                                    */2 O% o4 U4 f# k" {0 y! S5 g
/*                                                                          */! Z! c9 f- t" U. |5 T" M
/****************************************************************************/. a6 A1 V- u/ z
ECAPCONTEXT ECAPResult;# l* ]: O3 c: l  `# K: ?; `- \

9 d0 d. o/ Z% i; t% t1 f: \/****************************************************************************/% a& }8 F, H: ^$ u! h9 R& {
/*                                                                          */
/ j* |" B2 p; I, c: a/*              函数声明                                                    */* ?- l" z5 ?- H2 j
/*                                                                          */* k6 r4 X2 X0 \+ U) J
/****************************************************************************// f. W% t2 f( a: {
// 外设使能配置
' i7 Z! c, M; v2 svoid PSCInit(void);
" g$ U4 Q! [: [! C; g4 k, f5 ^- S  L) g" s0 O4 V
// GPIO 管脚复用配置
) n: Z  h5 j4 \1 Bvoid GPIOBankPinMuxSet();
' g5 `, U; K& `$ P' N, w5 `2 \) C6 ]+ e# r. x# ~
// 产生波形
0 M! H8 L  d/ svoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);9 _: @! E1 e! N1 V
void ChopperWaveform(void);1 f' h( x5 F4 z* B
3 [" w: G4 R) `5 d" w" Y: E
// ECAP初始化和读函数
5 J6 T. w2 [5 P* E. S/ jvoid ECAPInit(void);+ U- x- I( G, o  B
unsigned int ECAPRead(void);
2 r1 Q, Q  R/ y' p% b1 j
- U/ X# Y$ w! T# `/ ?1 A( g//ARM 中断初始化* q1 n& D  Y% H
void InterruptInit(void);  p) e2 `+ ~/ Z
3 l8 k0 l' ]% \$ i% Y# `
// PWM 中断初始化, ^* \' [4 Z: G+ K6 s/ Y5 b
void PWMInterruptInit(void);
/ D* ~' s; a' z1 f3 T4 i// 中断服务函数
% f! g$ n; @: L9 a: p// PWM 事件. c+ ~3 Q# A, R, S
void PWMEventIsr(void);
* i+ _/ z* v: Q) C// PWM 错误控制事件3 S4 q+ y& e) I1 S
void PWMTZIsr(void);# S3 j; p: R$ T  q. |
( w8 ?6 [5 _% }" T7 G
/****************************************************************************/: V1 W5 Y; N2 ?, A. \# T) l" \
/*                                                                          */( _$ O- O; M# Z: \7 {
/*              主函数                                                      */
( e, c# A- H6 u* I3 P/*                                                                          */
! ^, K; b! D6 s+ z) ^2 q/****************************************************************************/4 U3 ?' ]2 o4 ?7 n. L
int main(void)" v7 q, Y6 [# N, D" P0 ^4 l
{! s' I" |6 J; m$ s2 |
        // 外设使能配置
$ T8 h2 [/ ]* W4 @/ e+ f        PSCInit();" P' d& C. V1 I+ s
! R2 d+ g9 ?& Y; b8 ]8 |
        // 初始化串口终端 使用串口24 {) _  X3 I) |' x3 ?
        UARTStdioInit();/ M' D$ w9 {8 c* m4 |- v
       
# U' v, C7 @! H% ]' Y. H        // GPIO 管脚复用配置, a% D2 n: k$ P7 @) U
        GPIOBankPinMuxSet();
  d, Q# g) l& D& m% X1 v, w
) V; P$ p3 n: @9 O: K        // ARM 中断初始化
" j7 n" V8 M, k' H) f9 Z: O7 d  @7 L        InterruptInit();+ K5 c2 f$ Q8 w* U' l6 L

6 p" a2 {% w4 ?  N# B$ v; e6 C        // PWM 中断初始化) V# v" X3 \0 R3 d  |9 m- d# p
        PWMInterruptInit();' o2 q! K( T: [; B; ?

# Q, v- Q! w3 n0 i( Z        unsigned char i;7 a! p) G! f; E; r$ k
        unsigned int j;
8 _; T! k6 _. d# K% b$ x2 u/ _7 p& v( C
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);- I2 h* z* |' E3 x
        UARTPuts("------------------------------------------------------------\r\n", -1);0 u" c* p, G& h" a
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);3 z  Q3 s# B. W2 y, O
        // 产生波形
  S( Y7 d5 G  e        PWM1ABasic(25000,50);
; _0 Y# I/ R' O8 x/ `8 J( i/ N; K' U/ F3 _& t; Y* D# N
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
1 O9 r' v( l$ |$ E2 \. ^        UARTPuts("------------------------------------------------------------\r\n", -1);$ a! |" k1 K) }) ^9 G! p3 X
3 N2 L! M5 b7 a9 Y- `/ M

) R) Y2 }: r/ _1 V+ d0 X: V$ L. ^* s3 Z+ Y, C
        UARTPuts("------------------------------------------------------------\r\n", -1);  `# x- p$ K7 I
        UARTPuts("                    C6748 ECAP Test\r\n", -1);0 w- u7 I0 V; `+ \5 @; a
        // ECAP 捕获初始化
* t5 a! k7 I" B8 U# Q6 F% i& ?        ECAPInit();! }2 ]4 g7 c( v; x9 ?
        UARTPuts("Initialize ECAP.......\r\n",-1);* o0 V+ t9 j2 Z2 [& J$ o3 D
        for(i=0;i<5;i++)
; h! N2 I% Z- W- g4 H        {; t) k: c$ B, ^+ m
                    for(j=0x00FFFFFF;j>0;j--);            // 延时: s5 H, U  C/ I0 d, Q
                    ECAPRead();1 ~, W; o& d- N# U3 j
        }# Y: w4 J/ x/ D5 f  A+ y# M
        UARTPuts("\r\n",-1);
2 b" x' ~; r% A* x. z        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
; x1 h; Q! ~9 z        UARTPuts("------------------------------------------------------------\r\n", -1);
  H5 n/ C8 `! X* P: y
7 M. V5 B. p% h, }1 Q3 B        // 主循环
+ |+ X* m$ I% P1 J: V. \0 O$ O" W        for(;;)( W8 x7 }8 N6 ?
        {
; z' c0 j: E; O7 r- y) }( f5 O) G- c8 E. ?
        }& {+ p$ S2 n+ }: P2 J( p
}
: u" \6 E% J5 e, ~% O5 T' W1 ~! L$ n8 ^) Q, V: I
/****************************************************************************/
, F( c) q! V8 x# X% `/*                                                                          */3 q6 h; K7 T; z1 W$ V8 H
/*              PSC 初始化                                                  */
! p1 p4 s- V! C/*                                                                          */& g$ H! B# _' b3 i
/****************************************************************************/; B* q- }* z; m2 T7 A% ]
void PSCInit(void)
6 w. I+ Y; D: Q{+ s4 y& G' C9 r" I: v4 L
        // 使能  EHRPWM 和 ECAP 模块3 d) ?" F/ |4 f3 ]
        // 对相应外设模块的使能也可以在 BootLoader 中完成
: Z( Z4 B% Q' U" I% ?, ^    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
( X8 d6 N. u2 w( U& X8 ^    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);, O# y* l' T/ H5 P9 [( L/ V
}
4 F& E$ {) L9 X* ]# T* r& \( B+ f" j7 f& J, b2 y
/****************************************************************************/
/ k/ z% K: n& Y4 q: ]2 C/*                                                                          */
& G" U4 P- M' x* m' Q7 Z/*              GPIO 管脚复用配置                                           */& y4 r$ \& C% _% i2 z
/*                                                                          */
0 {+ `3 }/ Z6 N6 Y0 O$ ^/ \/****************************************************************************/7 u& h* S8 _3 ^8 [/ F
void GPIOBankPinMuxSet(void); G1 x6 F9 E; v/ R. H0 q$ Q; j
{
( k$ `! n& ?, A6 Z# T        EHRPWM1PinMuxSetup();3 F3 \. |, Q" j5 m( y- q: B/ i

* x7 M1 N. C; D- `) _7 s        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)& ?- K* M, ~0 e5 Y
        // 作为捕获功能时管脚方向为输入
# A/ B$ U# R' l; ]' z0 y) T. {        // 作为辅助脉宽调制时管脚方向为输出
, i5 {- h! q5 l9 a3 {    // ECAP2 / APWM27 x- r' O9 ~6 d7 n2 p( R* q
        ECAPPinMuxSetup(2);' H6 O" O" F- I/ E0 ~
5 |1 A5 ?7 w' |) C
        // ECAP2 / APWM2方向设置为输入
0 u/ s% f7 v; m$ ^* e6 q' s        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
5 F& _, Z; m9 I; X}0 Q6 j7 n3 f$ c) y, Y! ?2 e
5 Z% y& f4 @/ P9 D' _
/****************************************************************************/+ x# u# |. S# ?! ~/ K
/*                                                                          */, e4 G. x5 l, X% |' f" R6 h8 [
/*              PWM 输出波形                                                */
, \  c8 R, {& }* W2 q0 [/*                                                                          */
. N, b2 L3 }/ Z$ r; X+ O6 ?/****************************************************************************/
( @- Y5 T4 G- S5 b/ h5 Rvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)( i' _- Z6 ]' x- q/ x
{
& X3 ^+ Y& y/ L! m3 A1 l" G* d    // 时间基准配置
# p9 C- I# {! `/ M! h/ p# K    // 时钟配置' {7 r# b9 t/ M# |1 q6 ^
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
8 P1 l+ U4 W+ o3 f1 n' x% j5 W9 ^" I- o
    // 配置周期
: d+ H+ |+ t, o- B    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,& U- S/ n; P) s/ }; ^
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);9 u5 }/ O8 Z4 s6 e7 o

: C! |0 d6 K8 J+ J- K    // 禁用输入同步信号+ }5 y) H1 }) c6 K# p: W
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);6 G% W0 ~7 A% N) q% R$ K& ]

( }5 u! g: x1 ^  {8 u( S' y6 B' D    // 禁用输出同步信号
9 \" U& d1 l, b% q" I3 P" @    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
% k" C4 v9 d. w- |' K; o
7 ~" P- q/ `# C7 ]$ e+ A5 M    // 仿真(DEBUG)模式行为配置8 t( j# C: b3 @# o2 C/ Q
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
6 w- L1 R- \  K$ l
% A: {, d) r8 m9 _, h8 B9 o' A3 `* b    // 配置计数比较器子模块$ g" u: X7 t8 H: |" j% P
    // 加载比较器 A 值' p9 ~7 d& r8 ?- c, Y' U$ U* p. \
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
: H' Z& q3 w* `/ d, p# a                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
! {( m- [4 P  {3 s9 u5 n) {: A& S# q, I' a+ v7 l3 m" _% Z
    // 加载比较器 B 值) _+ f  q4 n( n, X
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
/ M4 t+ e) H  s5 f                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
4 }( }5 {: k* k. R& O* e% k+ m; m" I) }! @2 |7 N$ o
    // 功能限定配置(输出引脚触发方式设定)
' l% E6 i- Z: U" o    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出: u' h7 \4 P. N4 @# X- D
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,% R/ @7 `* x  {( H& V+ j
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,9 {, K8 K$ b' _2 A% g7 u4 u2 ^, q" H$ }
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
0 k, h8 \( ?8 c, P. F% [8 e5 l' }, o& e: S
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块7 U# X) A( h% F' q
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);6 l9 T" q+ L6 ~5 K# j! n% ]
2 q+ D3 T! S. N6 q! _
    // 禁用斩波子模块
# k) v* U) S) a. i8 u! |: @. C# k7 J( n    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);; l4 f  `( O/ d5 X- c; Y. H

+ `  n/ U/ q  O9 ~! b0 w# i    // 禁用错误控制事件( X1 D1 M# z6 Q! P+ a# Y: G
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
- ]$ a' R. M- z6 m+ @, e    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
- i1 j7 q8 A! F/ C6 B$ p6 F% a2 y2 o( t2 A
    // 事件触发配置$ j8 y7 I% g4 s  Y
    // 每三次事件发生产生中断
, I# N& ?2 G% f& f' N    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
# _4 N( b6 R- v( ~6 d& }0 `5 e    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
* {( M% K8 ]' \    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
3 U  h* l  w9 F+ x  K/ W3 L, @1 n    // 使能中断
8 p0 {( ]- F( s: l    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);) A! G% J( p" D/ U8 ^( i* N; i5 C' s
) H* u( z+ f/ A/ E: ~( s
    // 禁用高精度子模块
4 U7 f9 B: U9 d/ q    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);1 }: ~3 m6 w1 }8 |+ n- s+ t

. ?% D( I+ R1 t+ A( ]# g' W    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
; u( s; y1 ~+ [  }! U}
) x8 |8 P4 h0 e5 ]) b! ~- h, U" _& I5 h. c
void ChopperWaveform(void)
, H% d; q- U4 C/ T+ s) J{
6 [& {$ }5 i5 L0 s    // 50% 占空比
4 @+ j' g8 |* D- l    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);8 W6 d" D( p5 _1 x( X3 H
    // 4 分频3 p( q' L* v- |" D8 E
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
1 Z- B1 Q1 N! ]; A2 P3 U4 |* {, U    // 单个脉冲宽度9 ~, R4 S2 ~/ s2 x3 _
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
5 ]5 P1 v9 [/ X    // 使能斩波子模块' Z8 I7 ]) a" Q' X! V* |
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
6 I6 D% u: e  b% V}4 v1 ~3 }5 I4 e; [; u! ?4 m0 A

$ B' ^( {/ s1 D, {* Y$ J2 \/****************************************************************************/1 s8 o3 g, w1 `* M
/*                                                                          */
; @8 |& t( T7 ~1 N/*              PWM 中断初始化                                              */3 E; f) W) [& n2 K  |0 w
/*                                                                          */
; A; A4 |( V  V& J2 Y+ a/****************************************************************************/0 h: c5 ], c, f
void PWMInterruptInit(void)
, A$ E8 ]# e- @, n( \4 F{
, A! ~# H" u4 [) F* o        // 注册中断服务函数. y% r! x7 E3 z. R9 N* R# D
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);* G5 \8 m" }- H" m, |
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
, D; J4 U* C5 P
- r$ m9 j& T8 z1 f4 L% R" R! G1 t% W        // 映射中断9 b9 ]5 M2 v7 U# i- H7 V
        IntChannelSet(SYS_INT_EHRPWM1, 2);
7 T* Y. \2 f5 }7 ?2 h* U) F! v# q        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
- L& u5 Y( \' y% }5 p1 J0 c0 Z- ^' U
        // 使能中断6 Y: s' C# ~4 K/ u2 x
        IntSystemEnable(SYS_INT_EHRPWM1);# S, G2 v" T& {3 S- M
        IntSystemEnable(SYS_INT_EHRPWM1TZ);
6 a2 f( L) M7 p, c6 f) c}  z9 z0 d! M  V- A1 z

! Q2 F7 g" V0 L5 k1 g! Y/****************************************************************************/
2 {( e. V0 Q! |0 ?6 D1 a, `7 y/*                                                                          */
# u0 ~3 I6 c" z! K+ p- W/*              ARM 中断初始化                                              */
1 k$ k% t" y0 O) u/*                                                                          */
+ |5 C; R  d0 E/****************************************************************************/" Q% `+ J& s- y* J4 E/ J* `" J
void InterruptInit(void)
( d  l' n9 t4 A& Z! I{0 W1 Z+ k, i. ~. n/ X' d9 V' K
        // 初始化 ARM 中断控制器+ I( g3 }! u! y, B+ \
        IntAINTCInit();# x' C% H- Y" y# X+ U
) W+ K' F* @9 K/ h2 P: T
        // 使能 IRQ(CPSR); y9 O( a( h) _6 a
        IntMasterIRQEnable();
/ }. I0 ^/ ~0 D. g$ b8 O; r3 u+ i+ d" A# I
        // 使能中断(AINTC GER)
! V3 Y& @1 H1 H5 t5 b        IntGlobalEnable();7 t6 ?- Y- U. M+ x

& a1 m1 `1 a8 C/ J        // 使能中断(AINTC HIER); c7 y' U7 t6 ~' d/ W! n: j* l
        IntIRQEnable();9 D0 U8 K% N2 [- u) s
}0 u- f& g$ u& }1 b3 |
6 l5 ^, P* ^6 O. K- m  H3 Y' v

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/7 b+ Q+ m% ~/ E: x
/*                                                                          */6 f1 Y" a, h' ?, L, A
/*              中断服务函数                                                */) V6 J  x  ]6 p6 j- p  A
/*                                                                          */
( G6 P5 l' h* p$ d/****************************************************************************/7 ]0 z6 l, p2 A; o- k0 ~* b2 s
void PWMEventIsr(void)
& Y- [6 ~# G1 ?( h2 i{" m# l3 _1 r3 \; I3 i( q
        IntSystemStatusClear(SYS_INT_EHRPWM1);
: Z' m/ |, q; [
! L) W6 y& h+ e) J8 d    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
& k' v4 C) s1 B! ]}. k$ s& C8 U$ ~5 O9 }0 P! R5 k( @) y
' m0 E& d6 n6 v; p
void PWMTZIsr(void), _& Z5 B  d. }1 I1 j% H. g
{- R4 X' b8 e* \
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);- h. B% L* i% I
9 T# F- j/ Q* P. I& {" {4 J3 ^
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
3 @, ^1 R2 D" j7 m  v# a}; Y/ ?4 q# D0 }3 A( S& o3 o
' B7 n* R* Q" _1 e1 E# D
/****************************************************************************/4 K8 M2 s( M; X/ `& v9 m
/*                                                                          */
) s2 q9 f6 k- X1 ]& t9 P/*              初始化捕获模块                                              */$ _5 V" q% a$ y1 }' {; a
/*                                                                          */) b+ B: ]: G3 y3 \5 B" w
/****************************************************************************// |; J# I5 o4 a
void ECAPInit(void)
5 H: T/ w) u1 j9 F{1 o% D( v6 t- j* t) J+ y
        /*-----设置 ECCTL1-----*/
" E( H: a, e( B# a        // 使能CAP寄存器装载
, Q: k& r& x! |4 U; o        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
; |0 G' Y- V+ q: v        // 设置预分频值.& B% |0 O& k. Z1 Q* D0 Y) d: p; m
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
' ~2 P' S( g3 R' \$ f        // 上升沿触发捕获事件
& m: O5 }# h0 w3 B        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);7 K, H: O7 }5 X0 P; N5 i
        // 输入捕获后重新装载计数器值.6 z' e3 V$ y) ?7 H
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);$ g1 K+ a) y% V: W4 Q
" W* ~! t& O$ e) v
        /*-----设置 ECCTL2-----*/) E6 _" \$ U; S* I$ k
        // 连续模式- D# V, b' F1 G6 v3 w5 b
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);) b: e, D8 ?9 ^) f$ e
        // ECAP计数器TSCTR持续计数
$ j4 ?2 B/ T  {) {2 j        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
2 b  T# X# q6 M/ \        // 禁用同步输出和同步输入
1 R) ]" W) l+ R# d( f% H        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
/ p1 J8 n( m! I8 P$ Z' @- K6 A        // 配置 ECAP 2 为 CAPTURE 模式
7 X+ N# d8 K' C; v" ]* ?4 c; {        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);8 X9 A  \" d( A! O
: D0 u) f& |  f* I& Y4 W5 p0 {0 Z
        // 使能中断0 y( F% B; u; K. D2 f
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
+ d' v3 M, W, F% b: S}
/ r- s( W( m# O2 E' t
" i! j: a! R9 e; z' k/ E/****************************************************************************/. ~3 R) V: F0 X" L, j
/*                                                                          *// ]. X( K* G% D* c8 J
/*              取得捕获结果                                                */
" Q8 E5 k/ ^, _/*                                                                          */
2 F5 M5 `( m$ T# Q% b; F/****************************************************************************/& v, z4 [# O4 s2 J1 A
unsigned int ECAPRead(void)
6 d& a' q6 V) ^( b6 e3 M# W{* \# y5 B4 h" c* @, e8 u" j
        unsigned int capvalue;+ R- g7 a4 }  F7 a9 S+ j# x
        unsigned long frequency;0 {9 @; T% w: a- U; x' M" I1 h
2 A& Y' e0 e7 [, ^& {6 e. w5 o
        // Event1 中断标志
& C4 T& {: a! l        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
7 `$ [/ Q# G. X, [1 T9 f7 B        {
) k7 N& ?4 a7 O+ S# k! f" |/ m                // 取得捕获计数
# ~6 m( y3 n9 `                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
2 l& I/ [2 f0 c4 G1 N                capvalue = ECAPResult.cap1;6 C# b6 o, e3 v8 [- ^

0 v0 j6 w) n0 w, S$ M& A; \& c                // CAPTRUE 模块 228M 时钟主频
: b& n# n+ e* K  {3 M3 P                frequency  =  228000000/capvalue;
' ?% I' V& F0 v5 \8 Z6 M2 \9 L                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
. n. r7 I/ }3 i. Z% l7 A; Z, u, k! d1 \( f  O
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);6 S$ s) @# F$ |7 G- J4 B
//                IntEventClear(SYS_INT_ECAP2);0 U5 z# Y5 k9 O4 }7 k
        }2 ?/ T) I: {1 h: q
        return frequency;
9 o' `, [' G$ A8 \8 k1 R}
. T6 S* I8 h9 Q+ ?5 m* T  M9 A3 o
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
/ [6 H2 C; ^8 X8 X9 Q; [+ A[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