嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家+ T% u; j! s7 O2 L9 x

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
- [: l  U! P& }/*                                                                          */' ?# l5 H' x7 e. W6 V! E  m) h* u
/*              宏定义                                                      */
5 c3 a- W/ O* X  }3 z' d6 J* J8 U) q/*                                                                          */7 @% u. c' e( b
/****************************************************************************/1 U0 p6 O$ Z0 K
// 软件断点5 ^- l$ e/ v: C# b
#define SW_BREAKPOINT     asm(" SWBP 0 ");2 j' ~  C. _) Z/ \3 E3 N2 ^
0 |* D! k, T7 F( X; `, A! S7 q
// 时钟分频- E+ J. O/ o- \+ q& z7 ~
#define CLOCK_DIV_VAL     228
2 l! r( g! p: D& U5 d5 D3 s( i3 `8 a3 ?
/****************************************************************************/% D, M' y. }' d- u
/*                                                                          */
5 l( W6 ^. P3 O' q8 }' M7 y" A/*              全局变量                                                    */: T2 r7 A5 w8 O6 G
/*                                                                          */6 j) n3 H1 Z4 w* J7 ^
/****************************************************************************/
/ z9 M- l( t  X0 vECAPCONTEXT ECAPResult;
) E, c# u( y: \% R) d: I7 c
) y" P' A4 z: W- S+ P" B/ L/****************************************************************************/
7 T$ a7 J- T$ L# z, r; }2 p/*                                                                          */: q3 A' k1 b& }( e$ b
/*              函数声明                                                    */  X8 N5 @+ M/ r7 c
/*                                                                          */
9 E5 i  Y7 Z; ?4 G/****************************************************************************/
5 n# M& R# n1 W  d* t+ f, r# k  _& Z// 外设使能配置
, u# _4 z/ v  @/ ivoid PSCInit(void);
. f, P' [! E8 b; _
4 X. x2 P8 j2 {+ {/ @2 Q6 F// GPIO 管脚复用配置: Y. }3 |4 Y. c  S( V$ ^
void GPIOBankPinMuxSet();) z" o' }) L- q
7 S9 b, S; c! K( i2 d9 d$ p
// 产生波形3 u5 o% {5 a- T  Q% x% c$ I6 o8 z
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);0 o0 g2 r+ A) b% v4 a" b" f
void ChopperWaveform(void);
# j$ r* v# V% c! r3 C/ a6 v. d1 u1 O4 x0 ~% [
// ECAP初始化和读函数
; x0 [4 N( l8 x* U6 @+ evoid ECAPInit(void);
. Z+ k! ]8 w& C7 \unsigned int ECAPRead(void);
# ?4 A6 C* u- G9 d# q
# |" ?' f/ g) y& i1 t: M//ARM 中断初始化' g& W! c  E* n
void InterruptInit(void);
0 |. w2 M9 n; ^* b4 m3 G$ p. R. o/ @* `/ `' u
// PWM 中断初始化; y# g6 Y: {/ t1 o/ _- B. }: w6 S
void PWMInterruptInit(void);' y" E. B- I4 P7 |5 H* G
// 中断服务函数' p2 l( s2 `7 U3 p* z
// PWM 事件
; _% O7 D6 U. n: \: v$ Dvoid PWMEventIsr(void);8 R. ~5 s/ N2 r' ?. I
// PWM 错误控制事件
+ k  `$ k; X; Qvoid PWMTZIsr(void);3 `9 z2 S( [- @) W; t

; C/ |9 C( S: ]( b( H+ d2 }/****************************************************************************/: O7 _0 l* H( l$ M, J( v; R0 T" ?# E
/*                                                                          */5 d; \! |( c/ w$ c% v0 {
/*              主函数                                                      */6 A" M7 @4 F) J/ q! b2 f- b
/*                                                                          */
, ^  j3 U" H8 k: }* j5 j/****************************************************************************/8 s# k0 |/ p% B4 a" f- B
int main(void)
; Z! n" q/ G1 H5 ^  _: L7 N& Z{( u7 t. e; [4 S& q
        // 外设使能配置, M) c2 v" Y- l7 g/ |+ e+ j
        PSCInit();
! \# g; d' I4 X7 K
5 R. P$ }$ G; x! e" A, e/ Q5 E        // 初始化串口终端 使用串口2
0 v1 v( U( A# a        UARTStdioInit();
  h9 A, L0 z) ?# V5 L! F5 X; L       
$ t: O" q: r8 z! @+ y+ j        // GPIO 管脚复用配置5 b; ?% w2 c2 A; L
        GPIOBankPinMuxSet();8 N# V- D, }. o: ^; a  _. S5 O

9 b5 I. S. C( D5 u. B        // ARM 中断初始化2 O/ L, M9 q( l. r  C7 n
        InterruptInit();/ \! _. r% ~" n+ }# M9 |- P
! A' z1 ^2 _& l7 h7 Y' R
        // PWM 中断初始化6 O( o( F; `* j' `
        PWMInterruptInit();
' @3 g$ l, Y4 @8 E9 {
/ N1 J! P  c" G" y( h) X# t        unsigned char i;6 F3 o0 S8 K: V+ H
        unsigned int j;
% U% s& x! F" _5 K$ V
1 c1 E4 R* x9 Z! v( i        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);+ V$ K4 |" K, Y2 @6 ?
        UARTPuts("------------------------------------------------------------\r\n", -1);
, U% f* D  y, D+ I7 u5 I) J        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);, L& ^0 t; A$ V8 b
        // 产生波形
1 d2 W3 T5 h0 L! E# f        PWM1ABasic(25000,50);
3 e6 j. g9 E& \6 }" c3 ^; ?* ]) V4 k, v7 |4 W
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);+ j4 K/ [( ?% L4 d
        UARTPuts("------------------------------------------------------------\r\n", -1);
/ k' A& K9 ]7 k' O# j1 m
! y" x  x2 R5 ]0 S& S4 f" z- \5 F! N3 l' x0 S+ X) }
5 ], D" k; z- }. W& H. K) X
        UARTPuts("------------------------------------------------------------\r\n", -1);
# [& H, M! h& h: Y        UARTPuts("                    C6748 ECAP Test\r\n", -1);# L5 x( p4 ?# ~1 O7 o
        // ECAP 捕获初始化* x& p! U! d( G# K3 l
        ECAPInit();1 h3 S$ _' t, @7 {. v
        UARTPuts("Initialize ECAP.......\r\n",-1);7 d0 X2 T$ Z+ g+ E5 r. p# r
        for(i=0;i<5;i++)
; u/ _5 ~, y/ q0 T( n, }( p& F8 D        {3 |  B# X( g# a) N4 H: {
                    for(j=0x00FFFFFF;j>0;j--);            // 延时
5 H) Z  d4 N! \: F! |7 M2 W                    ECAPRead();1 g& t* v& z2 C# E- Y0 o4 t$ h
        }
" u2 Q2 [' y# V5 ~        UARTPuts("\r\n",-1);  b4 i. j4 l3 T' i/ v$ h0 Z
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);6 L9 K6 V6 \' ]! A3 O
        UARTPuts("------------------------------------------------------------\r\n", -1);" J. C' e0 j, c$ i# I& O  W) d- a! \

' ], J) H. l" ]3 r% A        // 主循环
+ [6 j# `# z. M) g% e& u- P% q        for(;;)
9 k0 b' J4 m' a) E: d' i        {
" `2 f4 C9 F& s1 V
9 O7 m" @3 l) S: Y1 z6 t5 v        }$ p# e& B2 e' r! U
}$ \, \0 S* X, ]. K# R& ?: C5 I9 G7 b$ `2 x

/ y/ X( e: C5 `# d; W9 n3 c/ p7 ?& s/****************************************************************************/$ m3 e' ~0 N0 X+ C
/*                                                                          */4 _0 k0 q. f  Q0 I1 Q* c5 d* M
/*              PSC 初始化                                                  */& a2 d* ^# j+ I9 [  a/ d4 d
/*                                                                          */( D" `9 T1 x6 }% q: F
/****************************************************************************/
& g+ q6 H) f; ~6 }, Dvoid PSCInit(void)' d+ b  `7 u/ e6 n( h
{
. u% ]! I  b2 L        // 使能  EHRPWM 和 ECAP 模块+ Q9 W1 d; O3 M: I' @% ^
        // 对相应外设模块的使能也可以在 BootLoader 中完成
' P2 @& K4 K& s+ V" Q    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
# T: `/ X, }6 F, [/ ]9 n    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);" K  U9 k& X  w' s1 l+ T, P6 S
}
: e5 S" A; h+ i
6 }( w; L: J, D5 n! I/****************************************************************************/
9 C5 q7 I0 z7 M$ h/*                                                                          */
" A5 F! i  k: \$ i4 h9 G/*              GPIO 管脚复用配置                                           */
0 a+ Y( i, t% z/*                                                                          */
) T# Y& m+ E4 @" m; ?( I% k& ?1 U. _/****************************************************************************/3 W! U2 t4 ]9 [' l$ K
void GPIOBankPinMuxSet(void)
4 x) o. e. c2 g* C{
) J2 o* a4 J$ l        EHRPWM1PinMuxSetup();# C+ X( h. K2 t/ f) Z: @
* J: _; m+ ^7 _4 g
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
- Z. `( J8 u& T2 y! L; t* h% W  a        // 作为捕获功能时管脚方向为输入1 c0 W1 b6 }6 _) X8 Y% P
        // 作为辅助脉宽调制时管脚方向为输出
* C" T$ \& j3 E; y" l9 q5 X, X  S8 D    // ECAP2 / APWM2; w2 P  J$ a% _
        ECAPPinMuxSetup(2);! z* G& {9 h2 B: T) i3 J
0 W% U0 g, _$ y9 Y7 D8 b
        // ECAP2 / APWM2方向设置为输入0 L2 B8 v# c1 q" A1 t% |
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]" C( ?' B! B% z# e/ Z, ?1 C
}
+ d6 _( X0 x$ R
! j' t0 o4 T% s6 ]! u1 c9 ~( Z/****************************************************************************/
" j! H+ w% x8 t/ z. k1 u* f& h/*                                                                          *// q/ U! E$ Q* s- U( L
/*              PWM 输出波形                                                */
% x8 T& h  y! s/*                                                                          */
: r2 X" i9 u0 H, ]/****************************************************************************/
- Z- k' f# y* R! P6 J1 nvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)9 {# U! m1 C+ L! x. ^  E/ f
{$ x5 Y0 h3 @8 N
    // 时间基准配置
/ Q. r6 d6 Y# z# c    // 时钟配置
$ Q4 @$ I% v8 V    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
1 d' c( c9 N, Y* L/ i
, h: |2 ~5 x! D; L: ]5 @    // 配置周期, F4 V: |/ u, ?' p2 s
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
% P; {; Q, a  @4 g$ \4 G* ^: u0 ]                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);0 i# h3 R  B( ?* a. l
) m* E4 Y0 b- S1 u: J& P
    // 禁用输入同步信号. ?: q( s  `% Q& B& D
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
6 [7 r, \, q/ U' l% M" P  W; l2 T
: {) [7 ~, V9 J  z2 _    // 禁用输出同步信号2 ]5 z5 R" z( _: l1 [
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
" e2 d, b0 N- m) H2 K; f% q* ~. K( b+ N+ F6 E, r, ]! ]
    // 仿真(DEBUG)模式行为配置
- n4 J0 X8 P& E* I    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);7 D% F/ e  X" e
& i: U; s  O3 @2 e  K6 x* u: k
    // 配置计数比较器子模块: p' i# F" C& Z
    // 加载比较器 A 值  |( e. d1 v0 U
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
8 d( r) }. F) W, k/ e                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);& q. M1 Q* O9 H8 D( f/ a, D

. S! s6 U  F& c8 v* N. S! {    // 加载比较器 B 值
" |2 S& b" [; ]/ P4 J7 U  _    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,. |- A% j( z2 I9 D
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
4 C% v' S6 e$ }1 |# u
; M3 ?6 @) J* [    // 功能限定配置(输出引脚触发方式设定)% n' b4 {0 b3 c
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出* D) H. j3 C6 V: `5 k, O
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
0 W  C' L' {" I- G0 p% N                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,8 x6 u/ N8 s9 J8 T% G+ l
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);1 ]4 [& X5 O/ B# s* R0 [% R
8 z. r/ b9 w& i
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
; g, Y1 T% K( U4 X    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);* {3 Q7 T! i  {( ]0 W/ c% n

4 A, y" {5 l- l# S; [    // 禁用斩波子模块
, r2 x' l, h$ Y6 ^    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
: h  G! J" v+ l! Q! ]1 I" ^" S4 t  J
    // 禁用错误控制事件
! [9 ?+ e0 J* B7 A+ R  V' d    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);/ _. O+ |. [  e* A6 _- i
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);/ l% j/ x7 `% Y  C+ O
* }; M) i4 U# c/ W& Z' c7 M3 ]& t9 v
    // 事件触发配置! L: e3 n2 |/ V) l0 y- J
    // 每三次事件发生产生中断% K; ]! G6 t6 e" \
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
1 Q# @* K1 V; I5 {& x# G    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
6 H, a9 c. X) v1 |9 ]- ^    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);# K6 U4 o( B( c* E" g$ E
    // 使能中断
0 ^  s3 D! `# ]2 D$ @# Y    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);- P* y; s5 z- L% s* K: {# \
# C" r7 a6 W$ E# L
    // 禁用高精度子模块
7 R7 b4 N5 T( a2 G0 N# E0 [    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);3 ^+ r: Y* G: m6 l7 ?8 `. P# z# _
4 t  m: {2 s. }2 F) {) N/ H9 u1 n
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);  `6 y3 Y8 P) C9 K
}1 u2 ^% b$ ^+ [- o

* }- P9 K9 l: l9 [void ChopperWaveform(void)
2 Z% Q( s9 G1 ]& [2 o! H{
& I$ r" n  Y# L: g7 X    // 50% 占空比/ _+ o7 S0 D5 T$ d9 B; |6 p
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);% \9 ^, x, Z0 S0 x, F
    // 4 分频& W, \7 j% }$ D6 ]5 M- O
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
; }/ L# J) Z8 i, P  E3 [, T) b' i* _    // 单个脉冲宽度, J( e0 @, t6 H% U+ K9 }
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
. D. `4 |9 c5 I1 G- B! p" h    // 使能斩波子模块
1 |0 ^% o- X" ^) l+ p6 Q    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);. _2 S4 b3 T, _
}1 q# M; s5 L$ }" Q
- T  _9 Y2 z+ o: `% V  }. G" \$ |3 Z/ H
/****************************************************************************/
2 l1 m/ e% F3 g6 V( V  O5 [( C/*                                                                          */
. ^: [9 z. x2 e# G; K/*              PWM 中断初始化                                              */
0 q" i5 @* y; U3 P9 ~: I2 l/*                                                                          */3 o" F+ P+ p* I) r9 m# i' e0 G& J
/****************************************************************************/
0 h1 H" a0 H/ \7 p. [: s8 p* Ivoid PWMInterruptInit(void)
: _4 w& A/ k* [4 V5 o  w7 ]{
1 c2 b; w7 X5 y& Z% D! [; Z! F8 E        // 注册中断服务函数3 @9 o6 f3 B/ S0 x! k) y% J
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
# o, {2 O# P; o4 t7 c# W1 ~6 G( G        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
, E: L. g  c" q0 Z7 v
8 s" h! K3 k- a' |6 L5 t7 q        // 映射中断
" y1 @# R( _& V2 M- n. p# p8 U        IntChannelSet(SYS_INT_EHRPWM1, 2);) I: S! \0 m2 D( }9 o* q
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
5 \) D/ ~+ Y: `$ `' o& ?7 Q* w3 l/ [" U8 D/ ^) o  a
        // 使能中断
* ^/ m& O' C+ A        IntSystemEnable(SYS_INT_EHRPWM1);8 r" K2 D/ O" y8 E* a, Y- [* g
        IntSystemEnable(SYS_INT_EHRPWM1TZ);
* I! i5 a% ^& n( T1 \, }. {}8 Z, y2 i4 {7 q( W8 F

, ]3 I5 q5 A( n1 E, n4 e/****************************************************************************/, K  K  p" c- O
/*                                                                          */# ^* C% Y5 C3 w3 Z" B) u
/*              ARM 中断初始化                                              */4 z& y' w# s& Z
/*                                                                          */
7 c$ O0 |& _% `5 r2 G5 D; ?% `4 M/****************************************************************************/! L: P: N/ m3 I) \# Z( j( G( ?
void InterruptInit(void)- g% A- Q2 P* |% n; Z7 H8 Z8 U. z  `
{
& j: u5 x3 W  m4 i/ T& g        // 初始化 ARM 中断控制器
) n0 s8 c' p* X0 t6 w        IntAINTCInit();* w& j: k' V/ W, N! k" ?% w7 j% a
$ C# V6 f) p. P5 B3 a: \
        // 使能 IRQ(CPSR)
) v8 ^! v  ~/ v: n9 g+ O        IntMasterIRQEnable();! u+ [0 {7 R( P9 v  a% y
1 a% r7 Z7 t+ h: ?
        // 使能中断(AINTC GER)* M6 X3 y; t) I& p9 @( ^5 g, B8 b
        IntGlobalEnable();4 t0 X5 F$ q) C, J  X3 S. \6 {2 l

2 n. s/ ]" ?7 M* Y( A& r        // 使能中断(AINTC HIER)# r! Q- ^) {5 O/ Z& M
        IntIRQEnable();
; J4 ?6 F! M, m+ Q% |}$ {& `  l* o8 p; v( D+ W
9 m( g, [/ m+ O" _

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/
  M% k% H0 C( U4 _# {! H# \/*                                                                          */7 l1 R0 w# H( c( g6 z4 M
/*              中断服务函数                                                */! d, S( C) e; p; _/ Y6 J0 u3 q6 k
/*                                                                          */
9 d5 ]' f5 Z1 N, M! N: \; k/****************************************************************************/
4 T) G3 `" f& R0 I4 I6 zvoid PWMEventIsr(void)5 ~' r8 b! S" K) S# @) R
{- T* }2 _0 p% p3 y( E7 x
        IntSystemStatusClear(SYS_INT_EHRPWM1);
6 c+ n7 z' C& \5 h+ T6 a3 _" w* }- z8 `
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
/ h% D, I/ l3 J  V/ j1 q7 F5 @}9 A0 ^8 k7 T2 m8 N+ a; I

) A" a& }2 w$ }- k( Y3 ?9 N) cvoid PWMTZIsr(void)8 V1 z: u" U, Z4 T  D2 F8 ?
{3 t* T5 p4 o$ _2 N2 ~+ Q
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
0 H$ [% i' E1 D5 Q' U; [* h$ O+ Y7 {. C1 L: L& ]/ @
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
1 W% R- i) Q4 H! `- G  i& C}3 |0 }1 H7 [( E& I; Q- I# Y

/ v9 _9 I& x, {7 O0 p/****************************************************************************/- D* A6 [& L- }: ~  u& W. ?$ L3 ?& G
/*                                                                          */' D; c( t6 W, e- c2 V  K
/*              初始化捕获模块                                              */0 {% d  q! b6 i8 Y. t$ B
/*                                                                          */0 y5 Y5 U4 w, ]0 B, f
/****************************************************************************/) x1 a! ~6 r0 m" v# D* I+ i
void ECAPInit(void)6 U* K) {+ {( v* K+ y
{
: n, C) k- l( V$ q$ j9 I        /*-----设置 ECCTL1-----*/
8 s& @4 w, o3 A$ }" r7 Y! ^$ D; n8 |        // 使能CAP寄存器装载8 P/ V0 k4 I9 L
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);# n) v7 }5 P& C5 L
        // 设置预分频值.
( x9 W3 A4 e  T5 D: T+ E        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);; P* {$ D2 f( v
        // 上升沿触发捕获事件2 z" C% H/ S$ r
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
5 c; C7 n1 e# [( Y        // 输入捕获后重新装载计数器值.% A% O+ I: w; E" u& F
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
5 _! ]! K1 V5 w4 ?) e4 \/ l: `* q! E! P& _1 o
        /*-----设置 ECCTL2-----*/
2 B" A9 G* a; S9 N        // 连续模式
2 @$ k! I( B( c  E& L        ECAPContinousModeConfig(SOC_ECAP_2_REGS);* m6 k3 X( n( H% E8 Y3 D- `3 ?8 R
        // ECAP计数器TSCTR持续计数
$ _5 x9 ^- f6 C# Y$ M        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);$ ^; l2 g- P( S" }0 ^
        // 禁用同步输出和同步输入
! x' W) E" Y7 S5 I        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);: Z% ^* p( A. ^4 X1 [
        // 配置 ECAP 2 为 CAPTURE 模式% a4 ?/ _$ f7 D* ]  @" \
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
8 W. ?/ M: M* B3 v; y9 d0 g. |4 V5 [7 C3 `5 u9 z% U
        // 使能中断
) C2 C4 h" W+ A0 T//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
2 f% |$ ^) w9 z3 }/ l3 Z}% m% {9 u1 x6 z* Q

2 ?% l+ c1 W' |$ E  B, G/****************************************************************************/( z( I8 h5 M; D+ C$ r
/*                                                                          */4 a6 ^2 K2 ]  \. h, D" e/ n- y
/*              取得捕获结果                                                */: a, j- E0 I2 U, V5 s+ R( _
/*                                                                          */
5 S& M- ~7 @# Y. V/****************************************************************************/* s9 f. I4 a( [
unsigned int ECAPRead(void)
0 h( v# d" M2 O/ r4 [{
: p. K* u' s, I$ M5 s        unsigned int capvalue;
. W: Y1 ~/ ]5 _9 E  _        unsigned long frequency;
; p5 |/ X7 |2 x( v; X  ~
! s* C1 r- G8 \9 c% w        // Event1 中断标志/ M+ X' \6 l- Y0 W8 d* c' [" _
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))$ L: [2 L' W2 I7 y4 q/ X6 p: |
        {! c5 c! L! o/ G
                // 取得捕获计数
5 g* C& H, C* e; B) t! s% N% h                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
3 Q, e! Q6 `, d# j6 T0 T                capvalue = ECAPResult.cap1;$ n: g, C4 P9 ?

7 P0 }3 s9 C! m( z  _                // CAPTRUE 模块 228M 时钟主频/ }9 W$ l# }* q% {
                frequency  =  228000000/capvalue;( k2 b' h9 R- }! w8 Z
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
2 Y9 x) P; L* R# t5 L. w6 h8 i$ c4 B& A0 z( [
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
# c* X' \; C, \3 o* [# G4 I//                IntEventClear(SYS_INT_ECAP2);7 Q/ b0 k0 z$ D
        }/ q, R. \7 I$ Q& {
        return frequency;
& N3 Y+ n6 |1 H( ^; u; x2 B) W. R}# x6 F+ W/ Q6 u" p- W

作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
, C  f% e& G; q1 @3 G[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