嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家) T3 T3 i) [; U' o8 h

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/" l9 C8 X: Q7 Z
/*                                                                          */
$ Q/ L2 ?2 \. G0 v0 s$ U/*              宏定义                                                      */
! U! W! ?, L5 q& F. S3 u/*                                                                          */. ?7 X0 M, W4 F8 g7 n2 l
/****************************************************************************/! X4 y  S8 {* E+ R, K3 H
// 软件断点
3 O  Z; ?' T. P9 ^#define SW_BREAKPOINT     asm(" SWBP 0 ");
: }6 U9 k: w2 g, i; I9 m
7 @) |' S5 H5 s; Y// 时钟分频
3 x  L6 ]* c5 B+ P& |0 Y8 x#define CLOCK_DIV_VAL     228
% m; m: T  ~9 M+ Y; X; c$ j0 ?
. h$ e9 H9 ~$ A/ S, t$ s/****************************************************************************/( ]) T8 \8 X8 ~1 l4 ^$ }
/*                                                                          */% `, I0 K1 G* I5 g7 t
/*              全局变量                                                    */
5 M! [3 z* p0 U* q! d/*                                                                          */
' T0 t2 Z' p" c6 r4 Z3 e! ^/****************************************************************************/
1 @* V& j4 n; S; T4 }6 x) [ECAPCONTEXT ECAPResult;
' l- [6 ?# ~% ?0 K
! s# g/ k; z6 I8 _# L; J; m/****************************************************************************/
. H+ F1 k& ]$ T9 ?! s, _/ z+ o  J/*                                                                          */
0 A* c5 x' d7 X2 r* b  m1 z5 i/*              函数声明                                                    */6 R5 i$ ^8 |; I! `" p: N! {
/*                                                                          */
# L8 \  S: L2 g- U/ m" ?/****************************************************************************/9 Y. R0 G1 V9 S9 ~1 g
// 外设使能配置/ G; P" [* g% T* a2 p" l0 C
void PSCInit(void);
# i9 l  V- M) Q# z
2 c: A4 E6 j0 A. u; C// GPIO 管脚复用配置8 |  Q0 e. B4 f: j7 R$ K0 H5 L
void GPIOBankPinMuxSet();3 Z% s: w- K9 y

) X! Z! Y0 w+ [- ^( L, H9 u// 产生波形
! g/ M* F* o9 [) yvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
8 W- ^0 `: k: ?  R7 h* Vvoid ChopperWaveform(void);
# s# [0 f+ `" v4 F* K  b# H( S! J& s1 |
// ECAP初始化和读函数
2 w' T$ R& I2 \+ b. Qvoid ECAPInit(void);; i% @  s; y5 q5 C8 v
unsigned int ECAPRead(void);
# F7 S, T' R6 f3 |/ f1 `8 x, l8 _6 I0 s! g& _
//ARM 中断初始化
4 J* K, t9 c# G( S- `void InterruptInit(void);
. W% n: t5 F, K% |
( V4 P/ b  p2 }8 e/ `0 U" X% ^9 A// PWM 中断初始化
1 r5 V' L% N% G. `void PWMInterruptInit(void);
6 ]( L) a' _. j+ `2 Z// 中断服务函数
$ U6 E$ j1 i7 ~' B5 V// PWM 事件
/ ~2 {8 q! m* m) ]7 R' U6 m3 Rvoid PWMEventIsr(void);
. S$ n$ f7 C: b% t8 g. z1 a// PWM 错误控制事件/ @  s1 C  a" Q; L/ E5 M1 L
void PWMTZIsr(void);( E' U& O( |" M; I" j

) h/ o( S. k5 T) y8 Z0 Z) n( F0 n8 K/****************************************************************************/1 R5 @+ p# A! I, y% o
/*                                                                          */* ?) w# O/ ?% }! [3 J/ I( W
/*              主函数                                                      */
8 S1 k5 R% D, a9 m8 ^# E/*                                                                          */0 S' n7 x$ S5 {
/****************************************************************************/
7 y0 g. ^1 Z  Kint main(void)
" j, H6 Y0 F  ]. |# o6 Y; ^- v( H7 U{
/ ?; g: b1 Q/ c8 x        // 外设使能配置' `) T# K/ D/ b  K1 X/ k
        PSCInit();0 h5 K" H. s" Y0 I4 G* O

4 W) Z$ m, X# X8 j        // 初始化串口终端 使用串口2
/ b/ b& R- L, W4 J) `8 H        UARTStdioInit();
5 H& S) ]: g* R. \3 A        0 G; Y+ ]7 x+ Y! K
        // GPIO 管脚复用配置! Y# I3 N3 x+ z
        GPIOBankPinMuxSet();
  m, C# p' Q9 w/ `6 T) M' @% ~' A
        // ARM 中断初始化/ z/ ?. W4 C2 }  }; r6 J
        InterruptInit();
* ~8 `8 I+ C1 i5 {% r4 Z- O3 Q& [
7 _  r! R# D8 K/ E( Y  P        // PWM 中断初始化
* X/ v7 j6 Y9 j1 X) a- |2 s        PWMInterruptInit();
( v4 p. p/ Q  P# B- ^$ o3 \' Z; F
! e; g& i4 q1 z- |; f$ i2 ]        unsigned char i;8 U# V1 y% H9 a4 M
        unsigned int j;4 V" U/ |+ p: y

- {# g3 P5 |; |0 u        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
" ~/ Z- \2 f( z" E* n& ^' @        UARTPuts("------------------------------------------------------------\r\n", -1);
1 L' A% C! J' J3 c        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);! X" v3 F. t- y' c  W. o: f
        // 产生波形
. S7 k3 x3 h+ [" v        PWM1ABasic(25000,50);( l- j8 |1 L+ {2 u$ [" M

8 l" `  j* D& c% r4 w, [: [        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);8 N% _( w6 |! Z
        UARTPuts("------------------------------------------------------------\r\n", -1);
# e' n5 @- F+ l3 O; c2 F! f5 Q* K0 ]$ e6 y5 s0 y7 m# N3 r7 h" S1 k

' [5 y- m. l* @2 E* P: X2 h  L- _) n) n
        UARTPuts("------------------------------------------------------------\r\n", -1);
" ?( Q5 b' O, T  {3 S% P5 @/ }        UARTPuts("                    C6748 ECAP Test\r\n", -1);: Y8 ~9 @: g) d0 M) h9 A" J
        // ECAP 捕获初始化
# v0 P( N' l8 e- K        ECAPInit();0 H, A6 _6 G+ ~6 |
        UARTPuts("Initialize ECAP.......\r\n",-1);
) H+ |  E: b1 v$ X( c& `* @) @        for(i=0;i<5;i++)
: _/ e3 ]1 X2 k1 {/ p% j        {
+ t* y0 K  [0 K: e% C                    for(j=0x00FFFFFF;j>0;j--);            // 延时4 I0 K3 k- {, J- Q9 H, P- H
                    ECAPRead();
" W) ]7 O" @- v& a1 U7 f        }0 J$ \2 P" _  x
        UARTPuts("\r\n",-1);. i' F& v5 f# C, B/ n. Y
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
; m2 }( e0 y) H+ s+ j0 Z/ C; u7 v        UARTPuts("------------------------------------------------------------\r\n", -1);
  ]: n1 T+ O5 ^: W+ J  I
) @, g6 L3 K" `( Z9 T        // 主循环: P2 }3 D* ?: c3 J9 Q# ]
        for(;;)
. p" l9 K  }1 Y  B. X3 r8 Q        {
/ c' o8 ^! ?/ J" H; s6 t
# n/ ?* B* N/ D! u; j        }* I9 i8 ]. g$ ?% U$ p# N7 E
}$ C) E; b- i0 t  x7 k" y7 B
4 H3 T- t( @- {2 I, R7 U$ W( c
/****************************************************************************/: I2 [8 [2 U" w1 p
/*                                                                          */. S3 X2 H% C5 l& ^" n+ w$ e  O7 C+ m
/*              PSC 初始化                                                  */3 d5 n" E6 P. g3 q0 w* N: E. {
/*                                                                          */
! k. u9 k* O8 P- w/****************************************************************************/4 I7 c) y! R* Z6 m8 [
void PSCInit(void)
2 H, O0 v+ t% L6 n{
  e9 \8 Q) E" H! |7 O* y3 m        // 使能  EHRPWM 和 ECAP 模块+ }6 w+ \8 r% f& Y
        // 对相应外设模块的使能也可以在 BootLoader 中完成
9 N, ?( }& J- V! Q- b2 m2 x8 t- O    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);% H$ g" F% ^! n! l! L
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);% \2 o" H4 G& ^2 U/ ?5 E! }  f
}
7 h1 `3 Q- I1 b3 e4 [7 W0 R) g) B2 ]2 {  d
/****************************************************************************/1 O* g' Q1 U% v. a1 e2 R, {, I4 M
/*                                                                          */
) a# v4 @" l' {- _; t' L* C  @/*              GPIO 管脚复用配置                                           */
! z3 P  i- J0 m8 J1 Q5 y( @/*                                                                          */
9 E4 T( _+ e% O$ e% T1 y) {/****************************************************************************/
& r) V! T* ?. o. r' q( `void GPIOBankPinMuxSet(void)
$ I- y" Q; J) d* @( x8 n{
* Y, Q8 v, ]' ]9 E" ]9 N9 u        EHRPWM1PinMuxSetup();* P  i9 Q2 t. \5 X& n2 W: V4 H

" {  Z8 w' z! |        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
; K0 ], }& r$ p8 G* V! O        // 作为捕获功能时管脚方向为输入
6 W) G/ K7 ^+ O; D% ^+ I* O        // 作为辅助脉宽调制时管脚方向为输出
7 }! u4 U' l& ?" K; t8 O    // ECAP2 / APWM2# _6 l  I) C9 Q2 e# S
        ECAPPinMuxSetup(2);5 _; b8 f- z( }: {+ r

! W- `4 q( U! @8 T  J2 s        // ECAP2 / APWM2方向设置为输入; D# b" _/ o4 g9 s, w* @+ r1 ]
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
5 \- h+ w' E* j+ |}
$ J7 V2 Z- {! p3 R" H
# E  v: X* T6 z  l/****************************************************************************/# S: f3 B4 H( q( z( c/ D
/*                                                                          */- L9 d) _! f* v3 F$ p( Q8 j2 P7 @
/*              PWM 输出波形                                                */
6 _9 a; {  q* [; L! G" N/*                                                                          */9 S6 _' n' j" W$ |2 l
/****************************************************************************/
4 d/ _; k2 ^4 ~1 ]/ I! @5 s4 _) Cvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
+ G1 [, \( k( ~6 J{: G' Q6 e5 @9 H$ e. n
    // 时间基准配置
/ f7 c4 H% R/ S" t' L& [% x9 h% Q    // 时钟配置% |7 B  i6 o9 _, U$ P8 s/ `
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
; \# S0 K5 v: o% J0 n8 T' P4 L3 q1 U6 H9 G* }
    // 配置周期
/ ?. x- x' ]6 r7 i0 e    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,6 k% J2 W* I! b) R
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);) D" v3 m$ L6 B3 G& `
2 l) z. F  _) g8 k
    // 禁用输入同步信号
/ I  N0 R. V! b- g; l+ t# P, j; i    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
1 ^5 S! J, ]* c4 x, R# D. O% v  f2 b# J, M
    // 禁用输出同步信号
7 B, h4 a+ l9 x5 r4 J& p    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);; K$ P1 I- K  Q
" I; s. L# L4 Q6 M
    // 仿真(DEBUG)模式行为配置
, Y' e( x8 q- \* D& F* [0 k: O    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);7 `. ?. b! V) T( S- V: T# J
) K! T/ i! x" S' V- R, n! B
    // 配置计数比较器子模块
0 B! p' Q+ e( ~: _    // 加载比较器 A 值
" _, i; _* U/ A6 Z" `$ a3 ^    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,( w5 m1 ?9 J& G0 y
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);! b& Q; l/ F9 Z8 ]0 v) p

% @* v' r  f  M8 L6 J+ g& w) b    // 加载比较器 B 值
) ]6 h. k$ j8 ~7 u; b( S    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,. ]# p3 k: H9 ?' N
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);' K9 O& u- }; F% V

$ M/ X: `3 k: x1 w. z& ~    // 功能限定配置(输出引脚触发方式设定)
2 o" e! u+ y) q% g8 C5 D    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
5 N, g# C- ~8 W    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,# G; J  Z/ Z7 R  d5 T
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
+ a- v* Z9 c( J# E2 w; e                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);* U/ |5 s  z2 ~0 I
" x( u2 o  g( s) N: y' Y/ k
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块2 Z- Y$ l5 z: I1 m/ l' \
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
4 o, C( y, f+ G8 X) L' {6 J; d4 s! M7 M3 N" r8 G5 k
    // 禁用斩波子模块  v( }' M! Q1 _& x2 J5 ]8 O2 \
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);# I+ u9 N$ ~6 v3 l5 h$ C: y6 K! _$ M

$ t- O6 F# n) U    // 禁用错误控制事件
! d: q2 m1 A: O; X    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
/ C' i/ _1 S! T# `% U  b# [0 L* z5 u    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);" u$ r6 V* W5 D3 n
5 `3 o4 ]6 a+ a. M" f5 |1 W: [
    // 事件触发配置, f% j9 v' {* K7 U
    // 每三次事件发生产生中断
) q9 C& Q5 s0 s5 W; N1 E    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);8 z- s, t; |: ~+ Y* i$ g# i
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
" t  ~2 ^) H* d9 p3 L    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);0 g+ b* Q! V- l" i) j
    // 使能中断2 O  u1 l2 U& \; Z8 ^4 S( W1 ~
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
% u9 r5 p/ `3 P+ d, I! V6 M; m6 f* H% ~
    // 禁用高精度子模块' a7 N+ \, S6 \3 h1 z/ J
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
& L/ f( @$ [' }2 p' K) E  k) V/ U) W$ Y3 Q
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);; C4 T- T5 K0 C* \( _5 r6 ^
}) z4 Y& J$ e8 B5 u- L
; W: A3 W1 A* V7 M
void ChopperWaveform(void)  y- ^/ C8 i: g
{
* i3 `7 l) r; E2 V    // 50% 占空比
) H, i2 `, d, J    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
, u9 M" A/ j0 Z" c2 z* ^) h$ p# M' e" Q    // 4 分频
4 Z: {" f" @5 C) I9 Y1 m3 U    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);, _% S0 V# O2 W1 Y; p
    // 单个脉冲宽度
) j! X! I7 U6 w! ^    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
0 s# Y, A. v+ i+ n- S    // 使能斩波子模块9 u: N' T7 P, k3 C3 _9 v1 {
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
; Q9 ^7 [+ l) |: t0 ?) V( ]}3 i' ^( X9 F3 g$ U+ ]4 i. y0 U

% u3 d5 W5 f- b; x* @/ s/****************************************************************************/- W3 g- s& E% c) {7 W2 b/ I
/*                                                                          */7 ?' ?" P* u* w3 L& O* @( K
/*              PWM 中断初始化                                              */
- B0 |; {: K" y# X' K! s% d/*                                                                          */% M/ K+ b& ~& f, U
/****************************************************************************/4 _  W; h+ x2 n3 |
void PWMInterruptInit(void)) k. Z7 D+ P9 B' H
{
, k; s+ m: H/ a" W        // 注册中断服务函数
& O. ]+ s+ _+ k8 L& v) H4 V        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);9 s4 O% x# w" M8 ^3 ^
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);0 n% a4 h) p$ [

6 ]3 A+ ?6 o% N% {8 d$ x8 \        // 映射中断
8 d3 m; u  ]' D7 q5 c! ?- D        IntChannelSet(SYS_INT_EHRPWM1, 2);
! {/ C/ V3 Z! p& H: H) K' V1 F6 W        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);' G' ?+ g: l  Q) l

4 m2 q8 r# L% L- J  y        // 使能中断
/ L0 c  Z' N+ y/ Y3 r1 i# C        IntSystemEnable(SYS_INT_EHRPWM1);5 B! i9 R' m' U+ u7 J0 m0 ~
        IntSystemEnable(SYS_INT_EHRPWM1TZ);
& [- H* H2 o/ C& g  T- p% J- B}) w4 b& g5 A5 z. M7 [
& f1 f3 S, e! ?
/****************************************************************************/. @$ r! k/ Y% P
/*                                                                          */, G, k- G6 w# L5 n
/*              ARM 中断初始化                                              */
! n6 K: y. w2 s) D  X+ _/*                                                                          */5 S( V8 _6 @" r  m: F5 O
/****************************************************************************/. \! ~$ Q% \- i4 }3 @
void InterruptInit(void)
2 J  }4 z7 q# V7 C{
" G: Z8 |& L0 a! m& j6 C        // 初始化 ARM 中断控制器& M# t8 S3 r" ~& p* D% U) t
        IntAINTCInit();& A; B0 {) `" d
2 N6 h! a4 x4 Q- `$ h
        // 使能 IRQ(CPSR)# |# m% ?: ]: k' X9 Y
        IntMasterIRQEnable();
# y8 [" _6 E6 x/ Y9 a, X5 P, C2 l3 i  [1 R4 I6 Q
        // 使能中断(AINTC GER); _% q' P" D3 @% E: t7 [, H
        IntGlobalEnable();
4 ]( u0 g$ H: ~( n5 A  F; }  b
: _% }# w; [0 F        // 使能中断(AINTC HIER)
0 `8 e5 {* Z3 g9 h        IntIRQEnable();  j6 S7 j2 U* q: z
}
4 q; b$ g& Q. Z9 a, @) q8 h. k4 P
. P/ b2 M" A1 v1 m: L* z
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/8 X: ~8 [# }) s6 A) t4 S8 O
/*                                                                          */, ?& Z) j8 N% ^4 L, j! P
/*              中断服务函数                                                */" S# s" @% S. `4 [$ }/ u4 d/ I2 E9 `9 {
/*                                                                          */2 T+ q6 {& k- @) w* H0 W% g
/****************************************************************************/! I8 T" z) c( q) t/ h
void PWMEventIsr(void)
5 F* H( N' N% E5 p) i5 Q; ]{
8 o9 u% N2 q6 l; _3 Q& @        IntSystemStatusClear(SYS_INT_EHRPWM1);
5 V$ ^) g+ O/ `/ k) [; {9 Q, N, C( a( S2 v+ h- U
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);* [5 X1 K0 Y8 |! P# y7 V
}  ^- _. e! a$ b4 V& }6 U" |
1 S7 D" V" N( c! X, A' X/ v
void PWMTZIsr(void)
# Y5 A7 j8 T* k% r{  {1 t) o4 c3 J0 ^9 z5 P
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
9 Z' t4 q8 X4 K" t8 _( ]/ U/ `
/ @& r! j' E# Z/ p  S; X    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
/ b6 F7 v) V# y+ s  o% B}4 Z: H9 c" U/ m& K
* r9 J4 O, f  y; ~8 h
/****************************************************************************/) U, s5 W: B2 |% C* v/ j
/*                                                                          */
8 q9 g3 S8 p3 F) }/*              初始化捕获模块                                              */% b- O4 q' `: _2 [# O1 u$ K& E+ J+ ]
/*                                                                          */
' ~& b& K0 x6 q. G& e/ o% T; R# I/****************************************************************************/
/ Z! {& @- L7 C7 Tvoid ECAPInit(void)9 {2 T5 C/ y+ q
{. m4 M* X' B' N
        /*-----设置 ECCTL1-----*/: @8 Y. a7 G7 ^) w, M1 ?4 R' o
        // 使能CAP寄存器装载$ j8 |: e5 x& A5 W+ J, z* T, ?
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
+ ^3 |7 u6 s1 i8 G% x. i: X" b; D        // 设置预分频值.9 @" k9 L( |0 M
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);6 T! n/ t2 M* L6 x
        // 上升沿触发捕获事件, T1 e2 i% k( ~4 O2 V, ^7 c9 X
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
$ B" D7 _& x1 V        // 输入捕获后重新装载计数器值.% z7 m9 u& h6 K2 K4 r6 l4 Q/ s
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);' I# p3 M8 y6 W) ]5 O4 @/ f

4 o2 {: l- q2 S: @: u        /*-----设置 ECCTL2-----*/  @3 E! W- v9 I
        // 连续模式
" y. H2 S* V0 J        ECAPContinousModeConfig(SOC_ECAP_2_REGS);. e; b& N1 p1 [; ]7 Y
        // ECAP计数器TSCTR持续计数
: q5 [, v. Y% C        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
& v- b1 A/ g4 H        // 禁用同步输出和同步输入
2 i) k1 I! A; q# O! S# h# O3 D        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
& v$ ]* U8 Z/ h4 r! O# e0 b4 G3 p        // 配置 ECAP 2 为 CAPTURE 模式5 @/ E5 S$ N2 h1 ^7 @
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);/ P0 k! z- |2 y8 i; V( |

- S% t1 l. k& |+ u7 U" p# @        // 使能中断) e4 D/ x% [" f  M9 M, l
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);6 G& ]7 x% _2 t# h9 L: D
}
3 P! g* V3 }8 ~+ t( y8 j
3 O* P0 m1 |# U, L; U6 C/****************************************************************************/
, }1 c6 P: J8 u% y+ L9 E7 T- \& a/*                                                                          */
2 s. K, M$ c" E; y% g/*              取得捕获结果                                                */$ Z+ U; N' u# }& e% Q5 @
/*                                                                          */7 c3 y/ _0 c+ V+ j  V
/****************************************************************************/
: a2 R; ~. D7 X! L/ Junsigned int ECAPRead(void)' B% M! a' M1 e, T5 h! C
{- Q  z9 G1 Y8 {" w4 [# d5 I
        unsigned int capvalue;
0 w+ K  w1 m% K1 J& K: |        unsigned long frequency;
/ U) {2 W# T, l& r) ?% E
7 M& f5 {+ T$ k: E9 L+ w/ K9 h. v        // Event1 中断标志, R0 k. J8 Z! x1 W4 m  v4 l
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
6 x- P" C% K# Y  j1 l: Q        {, ^1 Z. Q! l6 D4 e# F- \7 I
                // 取得捕获计数
% f+ N5 i% K+ Q                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);9 R8 V2 O; M7 W9 |& T; e/ X6 k
                capvalue = ECAPResult.cap1;/ O  Z' \0 w3 Y/ O  {
" n8 Q" B0 p+ D" g* x$ t0 p7 F
                // CAPTRUE 模块 228M 时钟主频
' e! t. K5 D: f0 h                frequency  =  228000000/capvalue;
1 G8 \2 q3 ^% W8 L2 t! |/ h                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);7 y+ [) f" K& n& F
+ a( G: v9 I* @- T% _* |
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
$ s+ r  s" F) A* i/ {4 B3 N4 h! J  u7 J//                IntEventClear(SYS_INT_ECAP2);
( o" B# i0 p2 w, b' R        }. m% @7 t9 j& W) `8 l, m) F4 T! f$ Z$ [
        return frequency;
0 [" Y# L& J5 ~6 H6 m3 q}
6 x. N, d' n+ w0 @5 T9 V- k
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。, W! J5 I* ?' 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