嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
9 l, |3 d+ l4 J9 h6 Q( Z/ f: j; s
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
' C0 n5 p; @) C. J5 g/*                                                                          */
* _5 ?/ k7 M6 Y% J) y% f/ Y+ U/*              宏定义                                                      */
3 V- S3 h" B. @! v) g% [/*                                                                          */
1 N9 a' ]2 ]: I/****************************************************************************/: i; K8 g+ a  c$ F6 k# R( R9 F2 L
// 软件断点$ ^2 m8 r. _4 d; d: m
#define SW_BREAKPOINT     asm(" SWBP 0 ");' s# S( G, W* U5 b9 b; q$ X
- [2 Y1 P* C/ z, V$ }
// 时钟分频  m  `6 Q( o5 I* `) `2 w3 L/ |
#define CLOCK_DIV_VAL     228  y, c  \1 o+ t3 c# n- i' Y
( M  |' ^, c9 ?
/****************************************************************************/2 Y) H- g5 W+ v' _  ~- z5 `
/*                                                                          */  m( j: [$ H- G; B/ h0 b
/*              全局变量                                                    *// J2 V3 }( ^. t6 w# X
/*                                                                          */
+ U+ s' F) S* v. ^# _+ @. y1 B( b/****************************************************************************/' u( z& s; N5 G5 V* _6 O, K6 C0 P
ECAPCONTEXT ECAPResult;+ r$ h% ~  x. K- N3 F; n& v

4 @/ e/ p$ E7 N  D  t/****************************************************************************/
1 f0 |" @- h5 T9 J  h3 B( @/*                                                                          */
" I) ]0 C$ l; W9 s8 `$ M/*              函数声明                                                    */
4 I+ l! D$ W8 G/*                                                                          */9 \( @, J9 \3 F. W
/****************************************************************************/) Y5 ]8 S, J' g$ k; R$ g
// 外设使能配置4 a8 c3 e% Q- b. l
void PSCInit(void);9 \; H: c9 S( @3 i% v  I, ]/ g
) e: _+ Q8 R/ u' p. N
// GPIO 管脚复用配置
" P1 c5 v1 B4 a* \) Qvoid GPIOBankPinMuxSet();
8 E  E" B  h. d3 z: N$ O' w. x8 x+ B/ J- j3 s5 t2 F: E' Z
// 产生波形
* X( U: B8 J+ _" X* p4 qvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);6 R/ I$ [' o( d, j1 Q/ P7 M
void ChopperWaveform(void);% e% {, \) h, b. Q- Y1 Y: f  g& ]

* X1 x! S7 M6 {0 f# t7 X0 F// ECAP初始化和读函数7 N8 M! X5 Z! h/ f
void ECAPInit(void);( C* R2 |' h9 F
unsigned int ECAPRead(void);
3 C  y) N% b. ^1 u  U. r
) ^# H) o5 K8 f: y//ARM 中断初始化. d6 b# [( Q. |4 ~3 x
void InterruptInit(void);" L8 [6 \& X$ m$ {" L$ ~( ^
$ w7 W6 O- k2 f0 p; ?
// PWM 中断初始化
( ]) u- D' t/ W  }; t. @, B6 nvoid PWMInterruptInit(void);* ~' x# M- B* j" G, o0 T+ {& B
// 中断服务函数
+ _9 R- ~( C8 r" Z2 g) e& @// PWM 事件. m4 y8 c5 ~4 ]7 r0 w& g1 l; j
void PWMEventIsr(void);5 M3 k+ Q. J8 w! R, T
// PWM 错误控制事件$ N/ I: J2 j" g6 E
void PWMTZIsr(void);* B1 {0 J. c* L$ i! |

, m/ X2 ]( X/ n/****************************************************************************/, E0 m1 A. P( r) O5 q% Q% R( D
/*                                                                          */
# L7 Y' |( d( }& A3 m: J/*              主函数                                                      */
2 g- W8 X1 d5 ^! J/*                                                                          */
0 j8 [0 a7 v4 q1 ?* y/****************************************************************************/
" N& Z- H8 ^2 @* b) b9 n+ e" m# ~int main(void)
: v; m& S) e; s  e$ [. |% Q{" `$ k8 F8 H! o: A% D/ k8 l, D, M7 N4 H
        // 外设使能配置  D# x' ~6 }$ |4 i; h4 l8 N3 V
        PSCInit();
9 ~1 i3 V8 o" s1 O& H
4 @2 ]+ [2 A+ |        // 初始化串口终端 使用串口2
* o; E( A/ g- g: @& b; v4 m        UARTStdioInit();
" p% A  Y, R7 R4 D- E0 r        5 _1 t3 V- `0 J6 W
        // GPIO 管脚复用配置! {8 H9 t7 W5 V
        GPIOBankPinMuxSet();
8 g6 G: C3 m  c9 S* N  m2 o
8 F& s+ p: ^# `7 u% p& X        // ARM 中断初始化1 g. D: D6 M: ?
        InterruptInit();
8 _9 k' Z1 c! I% v$ {
8 d$ H1 U# A3 o: P        // PWM 中断初始化5 b2 S& o7 P4 _7 q7 U
        PWMInterruptInit();/ O6 S0 i6 j2 v8 O0 j
4 Z' c( e( g4 F/ }! y# s) R3 e# H8 K
        unsigned char i;
( @1 H) i6 d$ P0 O0 w        unsigned int j;2 K7 v# K3 U7 I+ U8 }+ e
& e& O+ i  L' C
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);  s- U" x% P+ w+ \* O: S$ x' {# {
        UARTPuts("------------------------------------------------------------\r\n", -1);* l1 k' J, E8 W0 a) F
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
8 X& l) ^/ U& E5 A" G        // 产生波形  v3 L4 ~. ?+ F: H$ R( s1 s* J: ?* r4 m
        PWM1ABasic(25000,50);
- s% J( C, I" e3 s5 }% i4 @" k, M8 v
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
, I5 s. v* E& U* ~# O/ G        UARTPuts("------------------------------------------------------------\r\n", -1);
& o) q9 J! K6 d1 v. P0 l
, l  C! _6 W+ \' v0 I2 Y  T# r" R- G& }2 ]

- K! ]: T- S" G( S- [8 D+ }% `        UARTPuts("------------------------------------------------------------\r\n", -1);- t" w8 O6 ^% D9 m+ Z1 b6 Y0 S- j+ W
        UARTPuts("                    C6748 ECAP Test\r\n", -1);
. m0 J3 h: g5 M, Y2 T        // ECAP 捕获初始化
& l7 W8 L, z$ C$ x8 j        ECAPInit();1 s2 M- O0 x2 g* b. t+ f, J
        UARTPuts("Initialize ECAP.......\r\n",-1);
7 D5 K4 Z8 d' |4 C! A9 _        for(i=0;i<5;i++)
7 b7 G  S% v& l        {
6 x- Z6 N9 ]" j9 a3 P) }                    for(j=0x00FFFFFF;j>0;j--);            // 延时
, U0 a  I1 [; r                    ECAPRead();
1 S+ |; @: O- M" k2 b        }
: m/ H0 w0 m) s' v* x) ~9 E) P" W        UARTPuts("\r\n",-1);- j  @& p5 O- \" D
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
% W; L. M2 ?9 c: |5 O8 h- `        UARTPuts("------------------------------------------------------------\r\n", -1);
. v$ Z9 B3 i1 {/ d- W, b) m# f1 ~5 x  i# H- f. w+ h8 x) ^+ M3 U
        // 主循环$ {' x8 @& `+ `
        for(;;)
; q5 c% ?. S/ J+ N        {
, j3 Z7 B9 ]4 Q' c- t& R, o9 g) v4 x/ }0 W4 D9 J9 O
        }
" g" K# o' g- j}/ e& n, T% U2 h+ m, z) B; J$ T3 @# u

) ?. n& r  {4 o( e/****************************************************************************/
( e- A3 D# |, z: P+ E, i/*                                                                          */% h4 }; \# M0 O) i# i+ m8 a; V
/*              PSC 初始化                                                  */0 D# A+ c5 a, W
/*                                                                          */
' |' s2 q) Z5 S% p- M/****************************************************************************/
1 m7 D7 G1 f7 {: w& evoid PSCInit(void)2 d) I; q+ h. L! b+ t
{
2 H/ b- x5 h) K  f        // 使能  EHRPWM 和 ECAP 模块9 W. Y8 Y+ Z4 A( v" Q- b# J7 _) m
        // 对相应外设模块的使能也可以在 BootLoader 中完成, [7 m0 E1 t, F5 y
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);2 O! G7 E. u. Z8 B- `
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);% o% |! L, ]9 }" T
}
5 |( P' K8 v: H
4 P, P; h: C5 p+ \/****************************************************************************/& L4 x( z. T- R9 z8 J: I! l8 n* y
/*                                                                          */. n$ I, X3 s9 H- Z$ c  ?4 h
/*              GPIO 管脚复用配置                                           */
" v/ c* H% o# q9 ?4 j* t1 A/ U/*                                                                          */4 m6 ^3 w& X: ]: p( M
/****************************************************************************/
( {1 H' I! R! t/ Evoid GPIOBankPinMuxSet(void)
& p/ Q  E2 s: \& q+ ~{
( M' H  G3 m0 L! F        EHRPWM1PinMuxSetup();
. ?$ C- O, U2 N$ y) v
  F+ f9 T2 m+ |3 _2 R* I* D        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP). r( x4 @3 U( d+ _- V: a
        // 作为捕获功能时管脚方向为输入
( r8 U$ E* {! i        // 作为辅助脉宽调制时管脚方向为输出: M. `' l! m  w8 q/ b+ R+ G; ]3 `
    // ECAP2 / APWM2
- u' C, `9 B( O7 r' n        ECAPPinMuxSetup(2);. a( @2 N. G* Y  d
( P- D5 P% E2 p4 r8 s
        // ECAP2 / APWM2方向设置为输入
! I$ ^" B1 }/ b4 a' o* a  a        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]) W7 E! }( c. T+ d, V7 s; o9 S- r
}
9 E' `* ]& _4 z. W" k$ u) z+ y& X2 O+ R, Z
/****************************************************************************/
1 |. s" l. o2 K8 d8 D. W( }, K5 b# x( `/*                                                                          */9 P. ~6 |2 G; i& t. }9 P9 H! ^
/*              PWM 输出波形                                                */9 Z+ G, Z' R+ Q1 [; \% w
/*                                                                          */: z0 k9 T7 a7 ~- a* r. ^1 K) l' D
/****************************************************************************/
! }& n2 H6 `3 {4 Nvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)1 ]# h" T" i4 B: _+ n
{
8 m6 q7 j; D6 P) E" J- R0 p$ \    // 时间基准配置* b, I* Y7 O, `9 g- L: o3 x* c. K
    // 时钟配置# ~6 h0 Z! C7 m8 q
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);0 V# q  ~# H# }7 V+ \6 w! H

3 y& E8 G  E) f3 |    // 配置周期
0 q' z1 S7 W: d" q9 i. z! _5 e( k    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
) R  {) y8 L) B/ V3 D                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
, p% @. R5 ?, u) V$ K, ?* ^
1 q( @3 W$ u% e: y. n# k5 @    // 禁用输入同步信号2 g8 `: i9 A' V9 J* ?# J
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);9 v0 }/ X4 r' S/ [/ x1 z
/ n/ y  ?5 K# X9 Q0 l& b
    // 禁用输出同步信号1 I- x  E+ M- ~) h: c2 c0 i. ?
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
: b8 J% F/ k0 o2 N( |2 W
# N9 r* T9 v. D% w8 b8 R+ C    // 仿真(DEBUG)模式行为配置: X7 H. Y+ V4 D' `+ l9 B
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
, s: [5 N# _: U% j) \; B8 _( f6 ~  n6 f2 q; g, O1 J: u$ M! T% a& B
    // 配置计数比较器子模块
9 }& H# a  v- ~    // 加载比较器 A 值
7 I6 R: t1 O8 {7 {# M    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
) m2 I  |9 S5 y3 I/ V# @% |- W                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);7 z" z4 ]2 l, P$ c

$ \' J* i' v- O' g    // 加载比较器 B 值
5 s0 j+ u: M7 h" d$ _. q4 B    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
8 b. w1 B  ^8 ~! E" W; q4 h                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
1 Y" {' Q5 E6 e; m0 c8 n5 I  x9 _' [7 J) K; e. U2 ^9 \% |) v9 b. ~
    // 功能限定配置(输出引脚触发方式设定)
) u$ Q# G1 Y# z6 }3 [5 z$ Q    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
2 ~* @" X5 e! d8 w. p* d    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
: n9 [1 {2 f4 C/ M3 U. L* e; ?/ ?                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
3 I) k. `+ K7 \) y                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);7 b/ t, I3 P& c- ^, r/ o  J5 d: }( h

& f7 l" R% H8 K0 l4 x7 h    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
% G% k( j( P! V5 N& t/ S7 }, t    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
' S5 i7 W' i3 |1 u: _. ]* b* d1 I# ?# b; V0 I
    // 禁用斩波子模块
! F; O9 A' M5 _; B8 S6 l    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);- a% h$ B1 L, n# s. R
% F. B; I4 W/ `$ L! O1 I% j  ~
    // 禁用错误控制事件: ]6 P) ^4 f" ^' `$ s
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);6 p0 P4 Q+ W) R7 x- k- _6 r
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);% \0 J8 M( {, `4 V! h( U2 {
' g/ ~& a/ A# U9 y1 y3 i
    // 事件触发配置4 Q6 l7 w7 _* F
    // 每三次事件发生产生中断
; B# |7 h/ q" k' k0 [( M    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);3 q" X5 \9 G2 e% y' T
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
2 `( [9 e2 \. f: k1 z! f    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
0 Y) `7 r  S3 R0 O2 U    // 使能中断
* z0 C: Y7 r  l) c5 |' [    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);% I% }) z/ c: H# L* E/ C, k- l, }

# m. D! L5 A! V. Z' ~    // 禁用高精度子模块- Q5 F) d/ B+ b, @7 a# p! d% `
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
  E2 [) u2 S' \; S& A! f% P+ V
% W1 X$ a/ d( \4 Q    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
6 x/ j- y$ u4 N  r- q}3 A$ W' f1 }# g8 W" N  C7 I7 i
$ \+ l2 j! l% ]2 M
void ChopperWaveform(void)
" s2 \' S  Y4 [' N{5 p; m) w/ U0 B  w3 x; n
    // 50% 占空比3 \: O& B. }8 A) t# ^8 \) ]- I" Q
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);+ q7 g. y4 m) m1 q
    // 4 分频) m8 ?1 @! j, z. z: b: ?. j
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
0 R1 P, E* u& y, k$ F    // 单个脉冲宽度5 V* R4 p9 o" |
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
6 v/ P$ D  M! \    // 使能斩波子模块
' G9 n% R* Q# b# A, ~    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);9 ~, b* W% O, g. Q' ^+ }
}
4 D8 Y: [% l3 ^2 m6 m, R  y& b* k2 _+ L* |
/****************************************************************************/
' R$ h) O/ l$ J" I/*                                                                          */
4 s9 _8 W- G- K# z! R5 ]3 b# [/*              PWM 中断初始化                                              */
8 A# ?" l& m% L/ p/*                                                                          */6 G0 X% {. `; V6 @
/****************************************************************************/4 y5 X* `5 Q  k+ ~! A
void PWMInterruptInit(void)
3 j9 H- P* g6 \' ]{
( ~4 q, C8 a$ U2 a/ D        // 注册中断服务函数
; `3 m; g: V* v! c- }9 s( T        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
9 F2 K/ ?% |8 }( t9 X- Y  z        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);) d1 {! G) S  s- A
& V6 t) l7 u  S- @% F1 v6 e; K' L
        // 映射中断/ E1 ~2 `7 |7 \0 l* K) V
        IntChannelSet(SYS_INT_EHRPWM1, 2);% ?& v+ P: Z+ ~/ v
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
" r% r. [% E1 v) ?6 ?5 `) q& d/ a7 |4 j7 I  o2 o+ m7 y0 b7 ?2 I
        // 使能中断
3 h8 z) C( t/ v+ Z1 w3 Y, @, u% g! G( T        IntSystemEnable(SYS_INT_EHRPWM1);
' Y& n( ~! k* n        IntSystemEnable(SYS_INT_EHRPWM1TZ);
( ~1 W7 A2 c& a: K}
# O0 Z' d7 e- t6 {7 o! ?2 {; l9 L, F( [( o( W/ V
/****************************************************************************/
6 F& `( x/ m' _/*                                                                          */
' v8 S4 d7 u; n* M& p. z6 G$ o& I/*              ARM 中断初始化                                              */- B' F5 ]' F3 t) S; X3 Y
/*                                                                          */+ N/ ?) j1 i9 m) {
/****************************************************************************/
; ~+ Z, c% q, f' a6 ?# d  t+ kvoid InterruptInit(void)2 ^9 Q1 d+ d' }8 W  i
{( J" z" \: g! L* y
        // 初始化 ARM 中断控制器
  a1 |, F9 k) c, ?$ f2 f0 p- H        IntAINTCInit();. x) j/ ]% G, ~) u' V

; g4 B4 K6 p1 W: H        // 使能 IRQ(CPSR)  \4 _" _8 N; Y, e* h7 _& g
        IntMasterIRQEnable();# L* S- c% E& n( K0 K" r* ^, N
: Y! E% r; H$ V6 O6 }/ g) K
        // 使能中断(AINTC GER)$ Y1 [: `# V5 F2 C" o( M
        IntGlobalEnable();8 O1 f' a# x' T; C1 u
$ u( |% \& o4 R  b
        // 使能中断(AINTC HIER)
7 T5 N# B4 P/ O: s8 v& {( ~        IntIRQEnable();+ }% z+ R8 s% F
}
9 s3 v8 Z4 P# V
3 P; G1 C8 Q0 h3 q$ h
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/3 E7 a: ^/ A4 _: l4 F
/*                                                                          */
) a! {5 y" U; t3 V0 B6 j+ ^/*              中断服务函数                                                */6 B4 T# g" z& \1 ~) u+ |" ]: _8 F5 M
/*                                                                          */% L- b1 E7 T  f$ h4 ?7 G) ?
/****************************************************************************/
8 n- y5 O5 m% i* mvoid PWMEventIsr(void)1 y. \. r8 y1 M# q/ V5 ?! _
{5 k* @/ \% L, ?% s
        IntSystemStatusClear(SYS_INT_EHRPWM1);
) T$ b+ R, _9 [" w
* [, e8 O3 @5 u4 N; u* C9 \0 I- I    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);7 }2 O5 T- j) w* t' h
}
5 z( k" H5 v' q& H8 |0 k
2 i3 J; s1 E8 ?- @6 Evoid PWMTZIsr(void)8 x) k; v3 d8 Q; V' y) s
{2 s# A7 n! T, q
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
% ~" G7 r$ z# I3 Z9 I# x
5 A+ R$ K, ~, X: D3 w3 `    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
+ D$ @: ]) s/ T/ t$ V}( d# ]% ~  y" F" F- u
3 C( |: O1 r( ~/ x+ p  _& ?
/****************************************************************************/
$ n2 u- B; S2 Y* @/*                                                                          */
, j1 y# g& s' W5 j5 R  W* k3 p+ P/*              初始化捕获模块                                              */
6 M' G) I2 Y) }, i. P/*                                                                          */
8 X4 A- s8 v" b1 g+ i) G6 o/****************************************************************************/0 i8 q4 R. E+ j/ G* C, t% _
void ECAPInit(void)
4 A9 Y' M* M4 s! ?{
' b- T. U3 i1 ]$ Q7 i5 V1 Z1 x) C        /*-----设置 ECCTL1-----*/
% G) p! T2 {: [        // 使能CAP寄存器装载
3 A; E) f6 f. w; Q& L9 {8 F% O        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
: {( `' O* ?. T9 Z5 S- f        // 设置预分频值.
  ~9 {! x; p+ Y6 f  z        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);  R6 P/ m7 f6 j3 G. w
        // 上升沿触发捕获事件; \$ g/ ^% s( u) v" A9 M( x
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
6 n5 b; p5 O" s0 H        // 输入捕获后重新装载计数器值.
% G$ p# {+ v" e0 _6 O# U$ b        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);& V  O6 |! x: H, W2 v8 w
$ n) O8 G1 u# ^% J* h/ P
        /*-----设置 ECCTL2-----*/
2 [9 a5 K- Q6 c/ E        // 连续模式! E/ _$ J6 R( _3 @% M( \
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);; Q  S. u0 n: A3 b  V% Y  b7 k
        // ECAP计数器TSCTR持续计数9 G# j4 m# v) i# f) l- X& n) U
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
! d/ b: S4 p* @  i9 P        // 禁用同步输出和同步输入6 G& o8 s0 }# y! ]
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);1 C( ~4 _0 s9 T  E; T7 v
        // 配置 ECAP 2 为 CAPTURE 模式7 f7 i" a, {: I' U
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);& H; X: v/ A3 {  E
6 F2 P% t3 W% v9 A  A
        // 使能中断
( |8 g; J) c, l( I//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);; p  ]7 m3 N; |: |0 b7 o
}
$ g3 k  K' Q+ y2 [! ?" q7 e
' f" R2 S- {0 N1 N4 F- ?2 u/****************************************************************************/
* S& ^+ r5 J$ A( Q, }, b) J$ U8 K. x/*                                                                          */
. X+ _* ~3 X4 J( F# [& o0 d9 ]$ q/*              取得捕获结果                                                */1 r! ]0 o7 _$ P4 D0 U, Z4 ~
/*                                                                          */
$ B' c) _" g( b+ `: h9 q- I* t$ Y/****************************************************************************/
+ u- h. F8 [  h% Y" H1 ]9 H& |unsigned int ECAPRead(void)2 [% i4 a7 Z4 L" ]% N8 B9 w& O
{
1 p) w! x# t0 q+ u        unsigned int capvalue;  {: b/ I) u% t; h( M( }! }
        unsigned long frequency;; u* a2 a% C0 I% R, v* v
0 n! I' P; f3 B( E3 B; `/ h/ H" l# O
        // Event1 中断标志
' n! L2 b, J. ]# t/ `        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
. O( T8 Q: n$ W5 f6 f* g5 U        {
4 r4 b! Z. H* O) Q8 U                // 取得捕获计数* P1 W5 G9 f  v2 {' [
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);- A' K: ?$ }2 m) G& t: Q% j9 N
                capvalue = ECAPResult.cap1;
( C3 L) F5 O- ^  ^9 t
1 u. E: R! y+ r6 G9 V                // CAPTRUE 模块 228M 时钟主频
9 p' w7 [. A3 d/ j! O8 i                frequency  =  228000000/capvalue;" h3 H9 R0 K, t
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
7 L6 u5 a5 r& Z1 \" ?
* q5 D$ J% w% x# z+ g                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);) `6 Q6 @' e& I7 z9 D
//                IntEventClear(SYS_INT_ECAP2);
) f: c( Y8 v" k" k0 V        }
3 o+ R$ a* p, m- k: R0 u# t* G        return frequency;0 q9 @, g/ y1 L- B2 [
}
% l$ t% H' b" r" x$ t
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
  P1 b5 J9 t# M  `, i" j[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