嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
* }, E6 i( p( F" Q
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/* `, i4 |/ t6 \: y
/*                                                                          */& K5 |# F% S! h8 H! o$ f
/*              宏定义                                                      */- v: I6 `& A* h4 K
/*                                                                          */
' g" C5 J3 g$ z7 d6 m+ A: v: A( b+ f/ A/****************************************************************************/4 t) v" H3 D8 n6 \  d2 q
// 软件断点
, I- T, h; ]4 y#define SW_BREAKPOINT     asm(" SWBP 0 ");
( P& k, J( b- I: F- t2 P) |! V# b9 R" T
// 时钟分频. ?" n1 ~% {$ H: V
#define CLOCK_DIV_VAL     228
2 Y' ?8 d( ^3 E! ?* w4 e5 f7 v$ a/ `8 C1 q1 b$ h
/****************************************************************************/" ~+ e& c. I0 x9 m* m9 n6 _
/*                                                                          */
4 w0 b- z6 r/ w& {, l5 D0 K/*              全局变量                                                    *// e1 w: J5 }' e+ Y) L
/*                                                                          */1 B8 j4 F1 [6 g1 C6 |. C3 C- o. M: x
/****************************************************************************/
) h$ p9 s" C9 h& I5 pECAPCONTEXT ECAPResult;9 S: n% l6 o. a9 I
+ b- F% y. w3 l9 ]
/****************************************************************************/
9 D2 k" l. n% U2 ?! L2 K6 Z4 ^( R/*                                                                          */; H3 n  j% i( b( {  Y1 p: d
/*              函数声明                                                    */
1 J/ s1 a& X- z2 P, D/*                                                                          */  {  r3 E* J9 a! I# H
/****************************************************************************/$ I+ k; e+ _7 V) S4 s- G0 A$ [
// 外设使能配置
# i3 a/ x; v5 f& w3 [- ?void PSCInit(void);1 v: x; Y: L( d2 d' a0 b& c- o6 H- U

) W  O" S4 z0 {1 b2 a( h; ]6 R// GPIO 管脚复用配置8 V+ j7 ~1 D, ?! a: v
void GPIOBankPinMuxSet();
5 |6 y" @7 e7 n0 r2 u& ^# F8 ~
1 [4 d4 E8 n5 z. G$ C2 x// 产生波形
( o" z  i/ _; ]  y) J6 M# k  U" j: Rvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);# }; y2 o/ N1 e' u; s" V. j
void ChopperWaveform(void);
. Z$ ^7 H2 w' D9 w9 b, K9 i" V: r; B: k. d, j
// ECAP初始化和读函数
: W+ M  T6 R0 Y: X0 Y/ s" Z. hvoid ECAPInit(void);! }: G% P3 k) _! l3 m% f' d* M8 E
unsigned int ECAPRead(void);
7 c8 f$ q2 V8 Z  N; b9 Q" C
# R* y; A% h- G1 t2 E8 D5 j6 w//ARM 中断初始化7 c/ c# T1 e( g6 {6 m8 Z
void InterruptInit(void);
/ m; b, v5 d" T( ]
6 ]* U0 V; o# z0 j// PWM 中断初始化
6 j2 r+ U) E! ivoid PWMInterruptInit(void);8 i4 m& r8 W0 [2 B: I9 w) R: a
// 中断服务函数+ }1 b2 V& [/ R7 E
// PWM 事件" n  p2 E% y* T$ Z0 v2 H: `
void PWMEventIsr(void);5 f- t. T; F7 ^4 i& G' o
// PWM 错误控制事件
5 I6 h! K9 G& O) pvoid PWMTZIsr(void);
6 e4 C( m8 ~0 q4 P% k) t# k7 `: m8 O5 D$ U. Z
/****************************************************************************/
! P4 K( G0 c+ P* x( p' o/*                                                                          */
. Z. ^7 q8 K" P  X2 P( |/*              主函数                                                      */
5 d9 j0 `- k, o8 J; ^/*                                                                          */& ]& Q( I1 [' |' |* Q: l, V( r1 z
/****************************************************************************/
' P6 ^0 [0 b& z3 W, ?' m1 uint main(void)- b/ k* y+ T1 u3 V/ M& T* v, h" r
{
7 @# g2 u/ Y/ N3 Z! ^        // 外设使能配置# f+ Y5 p4 X( N  g- H
        PSCInit();- w/ A6 C- F5 q$ p
6 I8 ?& j5 T  Q0 u7 V# f* c( I' P" z% \
        // 初始化串口终端 使用串口2) {. _/ o9 z1 h, w% R: ^; v5 D
        UARTStdioInit();9 A- [0 U! A# s' g( f' [; z. y0 p0 I
       
. s  _2 O: y/ x2 J; U        // GPIO 管脚复用配置1 R1 t) l# `4 H3 x  P0 g8 f( [
        GPIOBankPinMuxSet();
" F* ]5 w, c! o* S4 i9 I7 s$ _# }8 _4 c1 L% J
        // ARM 中断初始化
! A% \, X. ~' C1 |* u        InterruptInit();
! {1 [5 E- q& W, a9 V: r' Q; J
) C  t3 p% y$ v        // PWM 中断初始化6 `7 m4 w6 K% |' c% E
        PWMInterruptInit();9 Y; z: U, g4 m4 `4 _) K  i; V

. V0 S/ n% S: e        unsigned char i;
/ ?( f! _" F8 ]3 n        unsigned int j;; {: t0 P- j: f# q2 G

5 S/ |6 C3 m; A0 r: J) [* ?$ f5 G        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
, b# L) v: j$ I3 A  [, i& j+ B& T        UARTPuts("------------------------------------------------------------\r\n", -1);
0 V0 k' A8 Z8 m( D# @        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);- y* V5 L' c' U
        // 产生波形* Z* K0 X! ^  D9 X* k: w6 H
        PWM1ABasic(25000,50);
. I) b( _1 q4 h4 p" |2 b$ a- Z7 H* b& N$ \, h" p$ [% B
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);0 p; N+ B, I. R* l5 ~4 V
        UARTPuts("------------------------------------------------------------\r\n", -1);: B' t0 p7 T/ o* z9 w; g
6 Q8 ^/ z6 \$ S( y) f

6 J6 C: v! ^' C  z. ~5 [# z5 m0 ~
        UARTPuts("------------------------------------------------------------\r\n", -1);9 f0 ?3 [% b( N( g" I3 X/ l) ?
        UARTPuts("                    C6748 ECAP Test\r\n", -1);
- F2 q" U4 b2 s: C. r5 ~        // ECAP 捕获初始化5 e4 g9 D- P+ Y( F8 c0 |  O8 A6 Q
        ECAPInit();
7 {& d; Y2 p) Z2 K        UARTPuts("Initialize ECAP.......\r\n",-1);
4 p) t3 O2 P! \        for(i=0;i<5;i++)
- e/ @/ m/ _7 F3 E4 w        {
$ A+ n" L5 B) N5 }  H# |                    for(j=0x00FFFFFF;j>0;j--);            // 延时
# C7 I! j% l4 y+ a" I; {, @1 }6 h                    ECAPRead();- o) Q! K# k/ K
        }
, x. o0 s2 l$ p5 h        UARTPuts("\r\n",-1);" a, R* {9 A7 g4 e/ k$ y" W/ j
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
6 P/ R$ ~/ e% R( J1 V2 B        UARTPuts("------------------------------------------------------------\r\n", -1);
$ B+ W+ S) b5 h5 n6 B( S4 x: I. _
        // 主循环
" B1 }2 [# @9 O% H9 A9 P$ t- W        for(;;)! h4 P3 e! e1 U
        {+ D6 z5 o# j7 b

. t& N# m. S; u, z/ f: W, h) z3 y        }8 o  F! F. A8 o0 r
}
2 b  h. Z- W' X$ H% ~- {6 L  U# g7 \% y3 A) G1 ~: T3 {
/****************************************************************************/8 q6 F" c# Q6 s7 Q
/*                                                                          */" a, F; w8 m* ^
/*              PSC 初始化                                                  */
! j# M: s) v7 J2 e, K; d1 Q/*                                                                          */- Z- A  J. J+ J% S) G; j8 J' P
/****************************************************************************/. \% ~. |# k1 a$ d, X9 d
void PSCInit(void)
( H2 M# L( m3 m6 A{
6 m7 v) z8 @. _8 [        // 使能  EHRPWM 和 ECAP 模块
" w! \: j( C- O2 p# O' U        // 对相应外设模块的使能也可以在 BootLoader 中完成
7 p- }8 ], d% L( D6 {1 |    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);; ]: z) h( Z! E+ @, c6 k
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
. N( O# b0 U! |4 Y}
7 ?$ n7 z; |% h4 n$ l# f) q: a5 h6 w4 @+ D
/****************************************************************************/* d1 Q- R+ h7 z+ I3 N% L
/*                                                                          */
  A- a, T/ C: |. f+ E# W- O# \/*              GPIO 管脚复用配置                                           */- }! {( i5 v+ a: _: ~  v$ w
/*                                                                          */
" P; K- @; o9 z- ?7 K1 X; k/****************************************************************************/+ u6 H* H( T3 s- X- s9 j4 y. w- Q
void GPIOBankPinMuxSet(void)
* X/ [8 a3 H+ h7 @2 {, ~{
" d( E1 f, S& a* G        EHRPWM1PinMuxSetup();: s) W9 T( a/ J7 j4 ~' o
, a7 h  V6 V  X
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
8 S# X- F' a* t3 V5 s" V        // 作为捕获功能时管脚方向为输入0 F) p8 z- X& g2 h0 P
        // 作为辅助脉宽调制时管脚方向为输出
0 Y' B* J! Q, @8 Y( v    // ECAP2 / APWM21 L( g' C( U) h# ]# O# C7 O) }
        ECAPPinMuxSetup(2);/ N  E# F) {. B6 |2 u

1 g* n( C' j. x* c2 h, n' G  f        // ECAP2 / APWM2方向设置为输入
+ G- }$ }$ @% O* |        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]9 P) c3 c; o$ j+ z
}
- F" V5 k8 |9 g& x3 J0 s# c& b0 U) c0 Z+ f& S# F
/****************************************************************************/* q; L  O/ _! Q
/*                                                                          */
8 K$ h0 y  t3 c$ L- q1 W% I5 X, W/*              PWM 输出波形                                                */" @. R4 l* J& G  m( b
/*                                                                          */& k2 H0 d2 u1 q5 W1 J5 r
/****************************************************************************/
, L8 {* L/ v$ G& Gvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)% B) Z9 h2 b4 H+ w+ i- g! V$ D. N( y
{
) E. E( P" K2 j7 m$ Q3 R0 L# S$ _: e" n, d    // 时间基准配置
- c5 X3 w3 V; I/ l, M. m; N3 F    // 时钟配置7 z# i; g- g9 W& O; }
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);) o$ C/ S; j- ^4 H' B* b
& H7 d' G( V  r9 M9 b) I* w
    // 配置周期3 R5 u# |. H7 d$ b; C9 }+ @/ T- O
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,& {# Q6 g1 C! R  L! R
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
/ Y4 ^6 Y1 D' f9 U2 B$ C0 W9 \* _5 L+ i# g6 W
    // 禁用输入同步信号* W# f- E, y' V% h7 h, K1 @
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);& m; @* [1 n# y% ]) }
& A) A4 T, [: H" ]0 J* q
    // 禁用输出同步信号: }  T( w1 w! |, r$ [0 ^$ U! v
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
& u6 ?" p: J" ~" U) Z5 v7 G: ~, c) n0 E) c  {6 T
    // 仿真(DEBUG)模式行为配置
2 p  G! \" T8 r% v* }" E    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);. B0 ?# K+ i3 k' F3 {( i' P
: s/ ~+ C. l1 |* |, r
    // 配置计数比较器子模块
2 o6 m- T% I- z+ U    // 加载比较器 A 值
. P7 t% a9 r3 W    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,8 G- b2 J& x% _0 q) U" L
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);9 W& w! S( x7 x  l9 Y; O

/ M% z, A. m5 h/ R( i    // 加载比较器 B 值
* l; A7 E, {" A9 `    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
: h" W4 z) X3 E2 ^5 z                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
/ {- @) t7 w9 w; x$ n7 y0 B" B
, X- G' G4 S' Q! ~    // 功能限定配置(输出引脚触发方式设定)
% n9 Y) a, }4 }& l2 w6 V7 ]    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出; ]: ~6 J! D4 Y4 J% E
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,$ S, n+ c5 H' Z& U0 L
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
+ |4 I  \. ?/ Z5 E' X  v                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
" P, Q* q+ j: Z
; f5 M, ]/ j! l  G, L7 v- o( Z9 i6 t# p    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
, U, b, o- R0 S7 ]' v    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
$ h9 x* n( V: ^- _
1 p; R8 l% @4 h# ?1 x6 d    // 禁用斩波子模块
) c" A! R: D& d7 ^! J    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
. `" [/ W% A4 G9 [( ?6 V! _( X3 a  X
    // 禁用错误控制事件! A, t) x$ s+ L7 v7 x+ d
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);: L' S5 Y4 N! c/ B) ^
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);* e5 p# Z+ ~7 t6 m

' W- g1 g' E9 h/ A' t# k    // 事件触发配置$ {  w9 Y0 U" V7 d1 [2 c% Y7 Q
    // 每三次事件发生产生中断
3 c+ w; d5 o6 W1 o/ t/ M( b    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
$ R- Y# e% ]7 [    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件1 d& I% {; I. l( V( E2 C
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);9 h' C( |5 U: Y( U; P, p. u& G
    // 使能中断
, y+ g$ Q% n  H4 m: _* N    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
6 s& i$ P, S7 \, f& E
$ }* X* o3 x$ x# h6 y2 Z- ~    // 禁用高精度子模块% z) r: f% m3 w
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);+ p" V5 w  S% c) a. D4 X

. \) P! Y, X$ y" r% d; w    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
+ _( O& O( ^+ k. E}
" I- f, G3 @, R3 v5 N& O
0 B' h- a' c# }( j7 Yvoid ChopperWaveform(void)5 ~- X. C7 }" u
{: q1 @" C7 T# q5 W
    // 50% 占空比/ B3 \- d- z: M2 A. V0 q
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);' t( c, C  P* B
    // 4 分频! p" q" r/ A7 C3 G. c; U2 r
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
( |' S. }3 y; `/ ]( U6 d    // 单个脉冲宽度
8 H, m9 ?: ~9 x$ e, N+ O9 B4 F% _. ^    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
  e( q1 k& Z0 g! |1 ?+ K9 N3 s) T    // 使能斩波子模块
$ [3 T  h/ b1 f7 a( i- m    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);  f, P3 [( M8 `: ^
}
0 j& F/ E  i4 |' D2 o* {
9 Z6 U: W" |- ~- i/****************************************************************************/
) E. p9 C( Y' @# P/*                                                                          */: u9 C2 n# t  ]. K
/*              PWM 中断初始化                                              */
# a) ^6 k+ o" R) C- N9 ^! t4 K/*                                                                          */
  U' v' b8 a' |7 z/****************************************************************************/
% S3 M+ ?( [% O2 ]+ G) Svoid PWMInterruptInit(void)
3 c4 x3 }5 B$ r; o7 m9 c{9 g- \$ K) `) b) Q
        // 注册中断服务函数
8 d# P5 k0 f' [6 L& Z        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);' u- E  B7 f6 {3 z- r) R
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
& {+ r/ e- e: t/ b' |$ b3 k
" A, a9 ?" Z, z        // 映射中断
8 X. Y" i  b* q, o, C        IntChannelSet(SYS_INT_EHRPWM1, 2);# |' ~2 d0 h* M( d/ l) N7 T
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
+ k( k" B9 m6 x* c2 C- h7 x
  ~$ E! I4 B0 V8 u) ^, ^/ g        // 使能中断2 l, w% t# [) n, r! a( A
        IntSystemEnable(SYS_INT_EHRPWM1);6 w, j% e8 L) Y) ~+ y* r9 g
        IntSystemEnable(SYS_INT_EHRPWM1TZ);
8 L& q* K+ c* S# |2 s}7 ]6 ]' z2 z8 A
- }; i" F; G3 g0 F% I4 L& v3 x4 b
/****************************************************************************/
9 Y& U- c! u+ N- V& U/*                                                                          */
" L, V5 ]; `4 {) ?4 _( N/*              ARM 中断初始化                                              */* }* H7 t7 J# x, y: U
/*                                                                          */8 \+ |( L+ \- u5 l' x" J
/****************************************************************************/
# ]+ X9 W' J' M1 m& h! Q' wvoid InterruptInit(void)5 ~  r& s7 P. g# v
{; d0 ^/ l7 s" e
        // 初始化 ARM 中断控制器; J2 d4 i( Q! l0 k) M3 m
        IntAINTCInit();) [. c0 N$ o0 t2 @# C# V; M  i$ J8 }

. g- @: w  ?( c0 O5 k( p, ~# p        // 使能 IRQ(CPSR)
5 S$ J* e6 n$ F- O1 Q( M' g4 M        IntMasterIRQEnable();0 w9 k( g. R3 i
/ S" q5 o% W7 p8 h- W
        // 使能中断(AINTC GER)
# ]& _. ^/ F6 T4 K7 `. t2 z5 v7 _$ L9 I        IntGlobalEnable();& e$ h0 z: N6 x" m4 h
/ K/ ?' |* [6 W8 U
        // 使能中断(AINTC HIER)6 q$ N1 w2 Y" a  W
        IntIRQEnable();
$ ~% ?9 `4 s$ v9 x}
% [9 C+ P) _1 C% r9 E
+ G4 @: h2 q4 e9 x/ _
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/6 }* N% k% t4 Q# G$ v; Q; p
/*                                                                          */
1 D; s3 e: G9 f% J1 _2 L/*              中断服务函数                                                */
3 j7 F( W5 R; ?/ A/*                                                                          */, S1 O& _9 E) ]; `% o8 F( J
/****************************************************************************/
5 s5 ?) A$ M5 Y5 H4 A1 U" k9 T/ Evoid PWMEventIsr(void)
$ Z" s9 l# f/ Q7 X* H{0 J' l4 ?" G" u$ H, i. I
        IntSystemStatusClear(SYS_INT_EHRPWM1);( X' T2 H1 ]* S+ N9 q
$ o- P+ _! k; F
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
* a/ @: U0 C: v/ B' s* g4 ^}
2 p, U5 f8 H/ u% z8 ?" G  v) y- s% Z+ ^7 h  ^8 ]
void PWMTZIsr(void)0 x2 D/ Y9 P. h1 c, j' a' K: v& q  O
{" Y% P" L6 g. V* Q8 S, j4 K  B
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
, J8 l8 y6 J9 k8 x$ i
; E9 I- T0 ]: _  B1 K5 W5 ]    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);8 E) D1 ]1 A2 v. O0 r
}
; u6 ?* H$ V8 T$ J2 [+ E$ V5 _5 Y, F9 h  l0 |0 L* h$ s
/****************************************************************************/
) i. h( m! }8 y1 U& a0 C/*                                                                          */  G! [; P0 m1 \) G, |6 d
/*              初始化捕获模块                                              */) {7 ?- Y5 _+ D
/*                                                                          */
- D. X# G: o5 p7 l9 z3 j) L3 p/****************************************************************************/2 s  p/ L. T  Z( s( @7 y3 h* m
void ECAPInit(void)
6 A; m6 C' n( H& q5 _{
# d4 A4 W5 }5 g        /*-----设置 ECCTL1-----*/! e  Q1 @" V7 Z+ s- \; k/ W
        // 使能CAP寄存器装载
& |# {8 j$ m/ S  `& S- n$ a        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
9 [$ C& w' {/ R, v# ~7 l$ c        // 设置预分频值.
$ t2 E8 J! Y+ o5 v$ Y: k4 U' k& I        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
0 c: F0 I& c  y, N        // 上升沿触发捕获事件3 J& c, I3 D1 X" v
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
3 ^2 l, R- D7 N! r2 _  A        // 输入捕获后重新装载计数器值.
  ~/ c, a  p( q# C        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
& N( ]% B  R. X8 ?/ c7 F/ j
. R$ V) H' {. u) b% i6 Q/ }        /*-----设置 ECCTL2-----*/
9 @1 D; U8 M0 i        // 连续模式/ h5 U' S! I( b
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);. v+ g/ B* X' z& w* X, m% [
        // ECAP计数器TSCTR持续计数$ ~! |8 t: M( @. g
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
; L3 y( w9 p3 E2 ]8 s        // 禁用同步输出和同步输入
4 y9 G  j8 R' @3 E: n' Y        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
( s5 t( A5 Y1 {" I8 O8 C; R        // 配置 ECAP 2 为 CAPTURE 模式
: g( s5 f8 W/ s1 x1 W2 ]        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);, O2 s  n( f% d0 b2 v- |0 D
2 \! x1 s: p* f! V% E
        // 使能中断* [6 K# `/ U5 u+ P/ m: I1 {
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
- q2 F& }" _" y$ z9 _0 ^( y) K}. }# Q, Z, \- c" y3 ~" ~
" x: q' h: A! d; e! W9 h% X: s9 x
/****************************************************************************/. I  D, T7 V' W, l* z9 e2 l
/*                                                                          */
9 J: ?% V! e" ^9 A% ^+ k4 W$ T6 P/*              取得捕获结果                                                */
+ o5 @6 E3 M/ G$ x6 x) {/*                                                                          */
" j- l" c; D5 E8 l- s# N6 D/****************************************************************************/
* y2 K! o1 u  M& Q6 T6 Iunsigned int ECAPRead(void)$ j% ]# q8 A' @; ~. X
{
( w, w  V- ~/ C! X        unsigned int capvalue;" O% h: p; |) ~( A  @4 B8 O$ A6 x( a7 l
        unsigned long frequency;
1 i: `2 Y$ u5 N( u% K) l2 o7 _5 j& z( m, `2 U
        // Event1 中断标志
8 W- N+ I# M- o% v; S: ~+ m        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))& T8 f+ K7 j. d: D' E: i
        {0 I1 ^* K2 `3 s2 C5 O2 p
                // 取得捕获计数- D; F/ w  b3 Y; J3 s
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
* J0 w( ?% c* u7 t                capvalue = ECAPResult.cap1;
- O; d. ~/ U# I0 E9 X8 u2 |# r! K  m6 Y% g0 g/ u
                // CAPTRUE 模块 228M 时钟主频
6 j' ]. y6 V7 D0 t/ C. R, m                frequency  =  228000000/capvalue;
' T3 [+ P7 e- `                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);# A. ]8 l6 Z$ q5 O7 U% f& {. @) r
3 F  @$ I9 B) L- r) P# Q, f/ W
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);+ g$ F3 s( H4 y  W  O
//                IntEventClear(SYS_INT_ECAP2);8 D' P) W) |# a' d( B4 T3 }7 `' F% [
        }
+ S: Z. ?) o, B3 m. W        return frequency;  k9 _* G. z3 j# G; V' ~: t0 T0 \
}& j' f! v! f4 x( A5 Q. a. T

作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。! E9 {: ], O9 ~/ `" I
[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