嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家0 \- a$ s) L" d& r

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/  x" p+ R  {4 u6 Q6 O) f% q
/*                                                                          */; v! f% l* v8 R. h5 ]! B
/*              宏定义                                                      */; e& A. N  I& u% _; _
/*                                                                          */( V5 q3 v- I2 f
/****************************************************************************/
  c7 y* R4 @$ w$ L3 L/ O( ?// 软件断点
' A1 M( w  Y- Q1 \( G+ A) d#define SW_BREAKPOINT     asm(" SWBP 0 ");
) w4 V! C8 O; t7 B/ v2 }/ N: z( d- O1 W) ]  d  T
// 时钟分频
4 o( y/ n6 U) L5 G6 g! q1 K#define CLOCK_DIV_VAL     228& {* \4 Y" ~7 h
- M6 G( n( N0 }$ k
/****************************************************************************/
0 _8 L: d) l' _5 Z( N( g- G7 s/*                                                                          */+ u8 ]% x! J( G+ Q
/*              全局变量                                                    */
2 G- @& P- t' u  Z, w/*                                                                          */) X5 f/ ?8 Y- ?' g. J
/****************************************************************************/
; K2 P3 U. Y: _" O& u; Q. OECAPCONTEXT ECAPResult;2 k4 H- I( ?$ ^& X" a
; y3 p/ t2 B1 \5 Q4 v
/****************************************************************************/
2 \4 I6 ^0 w0 |: f/*                                                                          */
! a4 W& d% S* G, ?/*              函数声明                                                    */3 d7 A7 D( m% x" U+ m- D
/*                                                                          */) m! j- j8 I# T+ f& V+ v
/****************************************************************************/& j/ I; ^5 @. J9 N- ]9 z5 a$ F' a5 M1 m0 I
// 外设使能配置8 F8 a8 ^3 |5 H: h
void PSCInit(void);
/ k4 e1 i. L/ X' `9 c9 ~) W; t) w6 ^' Z9 H+ g  t) X8 n
// GPIO 管脚复用配置6 ]/ y) ~) a' G4 g& I
void GPIOBankPinMuxSet();9 Y/ N& }$ i1 n0 ]+ i+ q
6 P' P  B6 w( c0 L
// 产生波形, E1 a: \2 r# j  J
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);4 R; d: E/ O$ u. W* F
void ChopperWaveform(void);( N& l/ A# C1 u9 J% D

6 v, @# P0 E+ s+ ]  O$ d1 K// ECAP初始化和读函数
, B* q+ |, R0 Zvoid ECAPInit(void);# l) m! P" E5 A% s
unsigned int ECAPRead(void);
4 O8 o5 ?- S6 g/ E) o1 V7 c* X, X3 w$ h2 i) P
//ARM 中断初始化" ^; t  c2 Y* b! C* j
void InterruptInit(void);
  E3 I( m5 K6 F5 n* z9 y5 z) i( i. T" _/ L$ P, c, w1 i' ?9 r
// PWM 中断初始化; Y, c$ f  R0 {7 Z* ~
void PWMInterruptInit(void);
8 u" }0 t# O( |1 R4 m- M- o# F// 中断服务函数: C( n8 q" B' i. X! B  E6 A
// PWM 事件
1 r( @0 M) @) @; evoid PWMEventIsr(void);
3 g8 ]4 ~( l. A- M1 B// PWM 错误控制事件$ X& p, L/ }  N+ G9 ~2 A9 I. p7 ?+ _
void PWMTZIsr(void);
. ~8 z( z# \9 f7 m$ M/ Q8 ]3 r
/ a4 R; l  K7 @8 J) v1 x( x/****************************************************************************/
& S5 c+ V8 e: O9 B7 J/*                                                                          */
0 t# I/ X1 m- o' P/*              主函数                                                      */
. a1 s/ a7 @, p2 g/*                                                                          */  [6 n9 M+ l% H1 g* ?) D6 K
/****************************************************************************/
' t, Z# X0 ?, L2 Q% ]  sint main(void)- A6 U) A# ^8 t. ]
{1 [, S& {' v, p$ v! ]9 I5 X  u! ]
        // 外设使能配置
# P6 T8 J# H) Y        PSCInit();, z( f) ^$ }2 n' R: }$ i$ x& a# T
% c- ]. Z* X% F: [; b! a
        // 初始化串口终端 使用串口2
( w, i/ M- }5 U" x        UARTStdioInit();
. I4 |) [+ m9 G9 b6 }- C* \4 T       
; ]8 G. m% K, Q        // GPIO 管脚复用配置& K) c7 G! P$ H! b  |" ^
        GPIOBankPinMuxSet();9 s" ^+ a4 P; g, o2 ]5 `1 D
6 Z! L5 @' O. w, g7 o6 d+ ?& X
        // ARM 中断初始化. r  H- k0 H* v  h
        InterruptInit();8 w; e% N5 K5 D- ^8 B6 A

  H- v' U& |  j3 h' M        // PWM 中断初始化( c) B: M. d" L5 V  t, U
        PWMInterruptInit();8 d3 C  ], F2 i

  A8 u( ]6 I% Y+ g# H% |* C4 w        unsigned char i;0 y1 H/ L! p' b$ w: n6 X6 F7 F
        unsigned int j;
# G) ~* ]  V+ O/ r" ~
+ x9 a, u& O  s4 H' g/ t        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
3 `  [. {" M: q$ w1 Q, n2 `        UARTPuts("------------------------------------------------------------\r\n", -1);
" N% G5 k" L5 o1 f( o; `  Y( Q$ a' N        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);% r5 h2 \9 M. ~5 i( z
        // 产生波形3 k3 j8 X/ E4 S& e% p
        PWM1ABasic(25000,50);% E  w- q: j. ^3 [: n9 {% I! r& x9 R
8 M( s' o  c" U+ }% i+ C  I
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
: V7 a' \# a  j9 P9 K+ }+ V  `4 x        UARTPuts("------------------------------------------------------------\r\n", -1);% K& d0 n5 v- `) A! o

% D0 i2 ^. A! d/ u# |. \" c# E& w% I9 \
' Q) i  b" |& d( j9 ~0 }
        UARTPuts("------------------------------------------------------------\r\n", -1);
& i/ ^5 P0 D' e* U9 ]2 d! [        UARTPuts("                    C6748 ECAP Test\r\n", -1);* ?& m$ {5 S- n1 b
        // ECAP 捕获初始化
6 j8 c1 @: W* }. k; p4 X' q        ECAPInit();( ~( Q/ w  X; s4 W
        UARTPuts("Initialize ECAP.......\r\n",-1);
! Y6 z+ Z  a5 Z" E        for(i=0;i<5;i++): ?$ V9 [5 `& z, ?# h  \) E  j
        {7 }2 D  W1 Z' {7 V+ ?6 J5 b
                    for(j=0x00FFFFFF;j>0;j--);            // 延时7 w8 [! @& g' A7 G5 Y& J
                    ECAPRead();
2 L, T1 _* `! _6 u* \/ ]8 I' K' Z        }8 [2 c$ w& P$ G$ o/ \
        UARTPuts("\r\n",-1);
4 s* X' l! H6 n* @5 n) {9 X8 C        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
/ T. X  ~; z7 ]& d        UARTPuts("------------------------------------------------------------\r\n", -1);
7 c, q" e# y( e, M8 O- h) f; h# C  i7 p2 ?6 z- P
        // 主循环
  G+ Y* `  L# c        for(;;)
4 x2 p# k! s7 R4 p        {
3 q) d% Z% Z: T. ~- I! S2 e9 }9 I; y
        }8 V% O6 B- U) t+ \3 k. c
}
6 W: I8 T0 Q6 y/ N' M: z3 b8 f1 W
; j( z* l: v, y; v; R* a/****************************************************************************/
# {3 F' D8 C; m' o6 R# f9 k/*                                                                          */
! d5 r1 j2 P. r& h/*              PSC 初始化                                                  */
! k  [, @- \& J0 ]6 a9 N  r/*                                                                          */( m( h, {# Z5 s/ Z$ z( N0 {
/****************************************************************************/" U, ^, p4 p: u9 s! \) A. ^( l
void PSCInit(void)
2 ^) X8 j; O. G& {( m! g3 g' D& e. Q! p{! u4 Q  e: a: G% `, c0 C
        // 使能  EHRPWM 和 ECAP 模块' U3 @* }; h$ J% I
        // 对相应外设模块的使能也可以在 BootLoader 中完成0 z1 r% d4 s* `3 W0 I) o8 @4 D. ]/ m
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);' a6 {8 Q  u- q" {9 E) v2 M+ n
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
% Z9 u9 q$ R$ c, {, R* X% D}
; y# h1 L6 g- `- n% x% D( V& F' j
6 t% S+ e1 h+ o: E/****************************************************************************/
  \. g8 k  H' l% M. R: b/*                                                                          */
# A2 Q# Q: `5 d% R; L* E$ K/*              GPIO 管脚复用配置                                           */
& Z3 R& s: u" O: V  s. g" i/*                                                                          */+ ~9 E/ f2 T# W
/****************************************************************************/: \" {* T8 o1 [+ M& T- g
void GPIOBankPinMuxSet(void)' I  x& g: V8 U9 l  E5 Y
{
3 X+ u1 q$ b8 Z        EHRPWM1PinMuxSetup();
5 T2 t: S2 y( b8 A
. g8 ~' J9 I9 p1 A! ~' O4 L        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)' c2 X% O) w  b8 r
        // 作为捕获功能时管脚方向为输入3 Q- R& Q  a9 H
        // 作为辅助脉宽调制时管脚方向为输出, }* n/ e& H' Z( O
    // ECAP2 / APWM27 F9 M$ t1 y5 d5 Q6 G
        ECAPPinMuxSetup(2);
. Z; u2 B6 q5 L; O" I- H9 W' a5 S
; f) G" U' s7 f        // ECAP2 / APWM2方向设置为输入
, ?9 m/ V, ?5 [+ ^        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
8 w, s& b  J. S+ x/ x$ [}
  p! f) Z- g5 ~9 S* o, \& c& _
, [, p: v" ?( e0 c/****************************************************************************/8 U" W3 W3 M& j2 c) z6 {; q
/*                                                                          */0 H7 u* S; D4 L
/*              PWM 输出波形                                                */
- y2 @4 u9 G. f& f  J5 |/*                                                                          */- w+ i$ {4 Z; C3 s1 J0 l( G
/****************************************************************************/
0 k) v6 F& d0 F, C6 Xvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
* L6 S2 R2 }- H6 `{
1 J3 Y! M5 ^7 ]) w    // 时间基准配置' W4 ~& u. u% K: I) ^9 y2 \7 e. \
    // 时钟配置
7 d8 y$ R' v' a    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);' Z+ ~; f4 Y3 {( t. U3 O0 e
" R+ _  k( g( e" ~( k: E
    // 配置周期
  U$ j) }9 K: n3 ^1 D2 w5 }# J    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
$ o8 R0 W4 h* m. K                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
: V" x7 g8 A- }1 F8 }
) |  z2 F. b2 {, ?" I6 h  r    // 禁用输入同步信号9 ^: t' E- H5 U! c
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);6 X$ r7 G' n, j: d' {- J
2 ?) d7 _$ \& i1 t# I4 h3 G, v
    // 禁用输出同步信号
) u$ G6 s- t2 @& i3 k8 k3 m    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
0 j8 x6 D' i% Q$ p$ n( o3 |, W2 a6 v1 N: s! D( d
    // 仿真(DEBUG)模式行为配置
9 k- W, ^) f: Y9 F/ e0 v    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
  R+ ~+ C& i$ \( ~9 V2 |* f, n$ |; A2 p1 K
    // 配置计数比较器子模块
& y9 k" z7 k  |1 v1 T1 C    // 加载比较器 A 值
8 G) y, F& G& Q: V, O4 B8 z    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,8 K2 e6 g' |" n7 u0 a5 G" k+ m7 Y
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);& G7 N* \  I: u; ~) I

5 q7 s$ V& U1 {' g& D    // 加载比较器 B 值
7 @6 B$ D+ \8 z* p    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,5 D. Y' {9 E% J; x) R2 J
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);! H8 k- D" g* R4 |4 M: C' F; M

& w4 x# f# ?$ `) Z    // 功能限定配置(输出引脚触发方式设定)
  }8 U6 B5 u9 G4 B$ X5 m7 L: N    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出3 |( D) b0 h; L0 y# @/ n" F
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
9 U/ {8 U1 z2 h                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE," r$ x3 ^2 c9 r5 w
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);4 `. {% t- k/ N# @% H+ E- F

3 _% n. l* \  ~4 m% c9 M$ P    // 禁用(旁路,信号直接输出到斩波子模块)死区模块3 j( r0 X; K( D
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
( w9 y$ n0 b7 l; G6 ^/ Z/ j
& ^6 Q+ W+ _/ V: n    // 禁用斩波子模块
$ X9 G5 L. @+ U2 u/ b    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
: b; W" e" W6 D# K) H9 d' w2 J6 D  ?% ?! T
    // 禁用错误控制事件
5 z2 r. w5 G& w7 @0 P2 y- C/ W7 Y    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);6 ]: @/ ~0 f# @2 x. W. h8 P
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
# F7 n6 Q" {& C
+ g. G. T& a2 x/ P8 |1 F    // 事件触发配置
) M6 n: w% J" f# C    // 每三次事件发生产生中断& s2 L2 ^/ y) x
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);! }9 |  ?( |2 w9 ]8 M2 }! N: D
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
5 P2 O7 h! B+ F  i: ^5 s( [    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
& Z# ~  x8 l5 ~* Z* Y* {* r    // 使能中断# O. e2 e# M& ~1 g& d% W0 Q" {
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);1 c; m2 C" s( u0 K9 H7 z
+ D( z/ i, p/ f1 t0 C- A# s
    // 禁用高精度子模块
7 g- A- w; J* c- M& B' `) F- g    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
- K& n$ a+ X  A4 @2 D0 @  [$ y$ h$ |6 b% H1 \1 k+ D; @# q/ g( M
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);/ E1 B' m) M1 j8 }, s5 c9 r
}; c  a5 K% b8 ?/ N- U

( Z9 y( @" d  h, g& r7 H* r4 N( {, \void ChopperWaveform(void)5 s( K+ M, _+ N" f8 _
{
$ C3 e: C% I8 _4 e' _/ m* N% O    // 50% 占空比3 B7 P1 Q! R  `+ t& b! T" r
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);" H; r  |* @8 ?( u: C
    // 4 分频3 l  Y0 n# f  L5 o
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
7 W+ R( L$ b3 [) A( u( x, _9 r    // 单个脉冲宽度
. J' p# s9 b4 P& t; [! P3 t    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);7 k" _5 D9 J1 {$ E# m  N
    // 使能斩波子模块9 S, Y- k$ n% X  G) N: G1 W( m
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
9 C& C" S' T5 I+ c}
' b" a: S% g$ w3 o  @' c: D. R& a3 e- L# n; C
/****************************************************************************/2 `4 _* p" X7 F# h7 c8 k
/*                                                                          */
6 M& N! i4 @! D  N9 t/*              PWM 中断初始化                                              */3 K+ c( w3 C& p: j7 X/ F
/*                                                                          */! n# o6 G7 \. J9 m+ ^) u8 ?
/****************************************************************************/
$ m2 |1 I6 h- l3 Jvoid PWMInterruptInit(void)
, A, v7 a% T8 s) ]. m  O{0 A# r+ ?# B; l4 D. q  e
        // 注册中断服务函数) I- h2 c2 a3 W% i& d
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);0 L. F: w" m# |3 ?
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
* z6 E0 o! A3 ~8 S
3 o5 A) }# ^/ h. }5 d  g; O        // 映射中断
: K' J+ Z, ?+ h% }" q; ]5 e$ {        IntChannelSet(SYS_INT_EHRPWM1, 2);
/ D5 b6 k2 P3 r5 H$ f        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);7 h* n: V4 i: E( ?1 L, G
4 L( V+ q/ Y3 P; E
        // 使能中断
; g$ R7 m; w3 z: _' g        IntSystemEnable(SYS_INT_EHRPWM1);6 g: {4 B) b0 K0 ^' y% E
        IntSystemEnable(SYS_INT_EHRPWM1TZ);
" g  O  M' Y2 n8 F}
4 |, H8 @+ O& ?7 u, q( f4 O- E- @5 E% k8 Y9 k  |* w4 x+ k
/****************************************************************************/
' x5 F# Y" J; r8 D. ?  {$ r9 [/*                                                                          */
: X6 n, N+ E3 t5 X" ?1 u& x# }/*              ARM 中断初始化                                              */
8 v$ K3 I  y$ w" x' \! F% B+ ^/*                                                                          */& z/ q' P) }2 }* U  n
/****************************************************************************/
7 [8 g' n0 f$ ~7 b5 ?% n0 wvoid InterruptInit(void)' t" r; d7 ?6 s- e2 G% W* h! p4 {
{
/ l6 x" K  y3 e- u. t4 ~: G7 ~7 t: O        // 初始化 ARM 中断控制器5 f. L' d; ]' ?6 m
        IntAINTCInit();& S6 U0 \9 l  b  e: _, _
# V! k. U  s7 P! Y7 B1 @
        // 使能 IRQ(CPSR)
4 K* t0 Z/ N* u# n2 c8 Q" n$ D        IntMasterIRQEnable();' n9 f) f/ ]: K% a5 i
8 ]) W! S* e) z
        // 使能中断(AINTC GER)
  R# J$ R8 J& p8 y; j- R        IntGlobalEnable();2 X7 ^$ g: b. q2 B

* f$ ?- \5 b' w. @/ g, z        // 使能中断(AINTC HIER)
9 @& ?$ n5 k: h9 S% o2 e5 e" G        IntIRQEnable();9 k4 g4 N- `: ?  H9 H
}
( @  A% t1 M# u; f8 V" |1 a2 `* n2 f, u+ z% `$ }

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/3 e+ t0 ~5 D6 R* T
/*                                                                          */
/ s8 f% R0 g% r, D, f+ K/*              中断服务函数                                                */) j9 \6 [8 d" E: [
/*                                                                          */
% H# y1 Q# y/ u+ l) J/****************************************************************************/4 C6 M: _0 n3 U' G4 T& f! p
void PWMEventIsr(void)
! J0 Q+ Y6 D, K& z5 z{7 d, Y) D+ O3 v+ q* u6 A' U  l
        IntSystemStatusClear(SYS_INT_EHRPWM1);7 r+ y( j+ h- w4 c

$ O; n. q8 l: i9 _& r9 R" e% p    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
( w+ u2 o8 x  b* L9 `3 `' I}5 O" z( s# o6 H: j
4 n- a! O% J* Q5 R
void PWMTZIsr(void)
* G3 v9 K9 {4 @9 g: E1 o{
/ Z1 F( j. @. J, F7 ~* N1 H) H        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);3 }4 U2 G1 U2 ?/ V8 v. _1 w

; [$ `6 O# C8 u. x: E    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
" }$ o) h1 o4 f3 {4 Y9 J}, \' Q  Z, k  q4 e# L+ z6 [& ]
- N) e( R/ b9 X  r) p, x3 m5 c
/****************************************************************************/9 r+ C0 R9 I$ s4 {6 P
/*                                                                          */
- v3 r3 G+ K/ `  [5 T  c1 p4 a, p/*              初始化捕获模块                                              */
( ?9 ]; t9 Z" o; G4 U/*                                                                          */  i; y4 x! L: f9 h% U% m: G
/****************************************************************************/: Y8 w+ D" a- L0 V* c  A
void ECAPInit(void); c/ z, s% R3 g6 v6 h9 j$ f6 w
{
7 O( A& b  g: j  Y4 B' G" X        /*-----设置 ECCTL1-----*/! b; f+ Q; l& v4 ]+ H. p# f
        // 使能CAP寄存器装载
5 h8 E. w' j2 M0 R) h1 ~        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
3 @: E  D7 n1 l% o+ {        // 设置预分频值.9 X& Z' L* _& W8 f5 T, _
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);1 H3 V2 P% I$ P5 p5 x5 L+ O4 G
        // 上升沿触发捕获事件; ^+ s# n* o) R9 L* y
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
2 N: U( J# s- p        // 输入捕获后重新装载计数器值.& }: d9 C9 j2 {" }( R" q  @
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);* z* x/ @4 m, F+ v# t

4 {6 |. d& O1 B0 j$ \  ~) o        /*-----设置 ECCTL2-----*/
% h6 X8 D+ Q9 \' D! N        // 连续模式
$ R# F& [$ h' k, E8 z1 [2 g, {        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
3 g  z% A: b. `4 w, Q        // ECAP计数器TSCTR持续计数' Q9 e/ ]) P; ^4 b
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
+ s1 u* x6 I- ?$ j) I7 }        // 禁用同步输出和同步输入, U4 l0 I9 r- T- I2 @6 a
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);: @) u+ l8 \& i' _! O/ G6 d
        // 配置 ECAP 2 为 CAPTURE 模式
9 T; P- u# L7 X' ?, }        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
9 S# _% @2 ^% j  ^
8 j7 W; \- X0 V) Y! H        // 使能中断
0 d5 {% m. g; y% o0 W//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
0 V' p# @" A5 i+ Y7 F}+ \1 R5 u/ K; S# o, F, h+ `
; W# K4 ?3 x& \9 C/ |" W/ m
/****************************************************************************/2 p! x; x, t6 |3 Z6 Q% R
/*                                                                          */" z3 R/ p5 W; W. ?4 ]  q0 m
/*              取得捕获结果                                                */. f, z6 O  \5 g1 H
/*                                                                          */3 M: i( b! q( e9 I
/****************************************************************************/! z" r8 ?' V& Q1 A, s+ ~
unsigned int ECAPRead(void)
2 j- W* J  E6 Y1 [$ ?* e1 Q4 n{$ J8 h& ]* X* K( J, {
        unsigned int capvalue;
, c( n( g/ p8 J$ A' ^        unsigned long frequency;
" S" D( X2 g" ?" u6 ^1 q: u8 G2 m) |
        // Event1 中断标志& u3 X4 @1 E* c$ G4 C. h9 Y) T1 C
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
& z3 R9 p$ z+ G, `( X! e        {
, v8 J$ q. ^' t* I: D                // 取得捕获计数
: V2 W( P; d% }3 v0 [                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);" U6 x) R3 z& W7 q+ m, V
                capvalue = ECAPResult.cap1;" {/ d1 u: J1 K& V, ?* C
) t) W* E2 ?" w' @5 f+ A/ ]& M
                // CAPTRUE 模块 228M 时钟主频0 [; L8 m1 Z5 Y: A/ |" ~& s0 i
                frequency  =  228000000/capvalue;
; `! G! P6 L! q; ~4 c0 \9 ^; X                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
9 F7 P! r+ ?& {, g/ q6 }) v( e
4 w" @- ~/ {7 i                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
/ C0 C0 |9 N- x5 u& s//                IntEventClear(SYS_INT_ECAP2);5 y, P8 ?% g3 u1 l$ c7 n( K7 U
        }
, s' x: y( M  n# U4 z; C        return frequency;3 F+ N" x' ^$ N8 s7 G1 `
}% o, @7 U/ ~2 b7 x; |

作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。$ r4 e' B# k& `0 s, 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