嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家: q. f" {1 F/ G

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
- g6 Q5 [' A9 Q6 J/ C/*                                                                          */
  ]0 o% n: [. ?/ ?2 X/*              宏定义                                                      */
; e2 c$ J. U$ j0 z+ y) Q/*                                                                          */+ K4 |. M8 _$ N, ^; I4 z
/****************************************************************************/' P7 Z3 [/ Q5 I( `4 m
// 软件断点
% N% ]+ ?& ~: R5 m) p1 Q$ l9 x#define SW_BREAKPOINT     asm(" SWBP 0 ");5 n, _# Q6 o" ~6 M* r

$ e5 E- W0 e" b: W& P9 C// 时钟分频$ N& m3 f: S% @
#define CLOCK_DIV_VAL     228; m8 k/ ]. H0 O8 ]2 e1 u
' n& S' ?8 _2 x( j% E
/****************************************************************************/
0 k' ]" Y4 U. W2 z5 a/*                                                                          */
7 f' e0 X# t. u4 P' k, t/*              全局变量                                                    */  A8 k& R) t+ s8 _
/*                                                                          */$ m/ Q# i9 o6 X0 N/ x$ d3 N; m8 }
/****************************************************************************/
8 \2 _5 X/ L% ]6 u4 J9 s5 {) LECAPCONTEXT ECAPResult;% {* }  {" |  I/ A# X( Z7 f# l
# l6 O$ K' W& w4 t
/****************************************************************************/4 c, s" t" H) W6 {: T
/*                                                                          */
% ?: p/ Z. Q7 y8 v, Z& |/*              函数声明                                                    */6 ~) S0 Y) h" R. @
/*                                                                          */
2 [5 H; t" Q4 X, `) w) t6 o/****************************************************************************/1 j% e3 O' m6 i. A$ D" J  D. Q
// 外设使能配置8 R& `9 P. G+ k- J' K7 E
void PSCInit(void);
0 n& g. b' X; Y
" ^# k" D- o. r) ]// GPIO 管脚复用配置
' S$ L8 k9 `; x! hvoid GPIOBankPinMuxSet();
& Y1 g, X% q% F! `- O# {% X/ R( w5 A. y
// 产生波形3 P; X, l. ]* w9 @1 x9 p- V; D
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
& A" h  Z; `8 w# V1 Tvoid ChopperWaveform(void);# o9 v8 I2 v! [5 ?$ Q

' w6 X4 `2 y5 P! ~2 l. y0 Y- R* w// ECAP初始化和读函数5 K. U; R% j) S' J* C" u. i  m
void ECAPInit(void);
1 k8 p; v6 T* R6 l% C* ounsigned int ECAPRead(void);
/ j8 S7 W2 W4 }" u: I0 d4 a, A  D: Q0 t2 a2 X
//ARM 中断初始化
: ]- T. R& p( C5 [7 Nvoid InterruptInit(void);/ ?/ z3 A, q3 L& t3 z8 T% W
  U& Q( y9 D: _& F# f
// PWM 中断初始化; {1 m$ \" I: ?& ~- i
void PWMInterruptInit(void);7 U0 b% A+ f/ L$ l8 Q5 \
// 中断服务函数
6 P3 p3 U2 e- J( O( `1 `9 l// PWM 事件8 I3 [- j9 @. g( H
void PWMEventIsr(void);
, w, E% q+ r+ A4 _: r. C9 a) r// PWM 错误控制事件/ b& r/ h4 [5 C
void PWMTZIsr(void);6 ~! [) N8 H& u# g# I$ U

+ M+ a. ~5 d# w, U3 W2 z* X/****************************************************************************/
9 b- m( N' I2 e* e/ p/*                                                                          */& }# ^' J8 A8 \8 f* w
/*              主函数                                                      */
) e) x1 l; |! @9 n, u/ l/*                                                                          */
% n2 C" }. F! U5 ]7 y. C# {/****************************************************************************/
* C; H5 e6 F; {int main(void)9 l* ?. Z- `' b5 k. U4 R
{8 _7 y; X% X% p0 @- I# Q, Q) ^
        // 外设使能配置% i5 u) M+ k5 H, V
        PSCInit();
' I( X  s( [% J! m  b: g$ `% ?4 G4 y
        // 初始化串口终端 使用串口2  |0 E+ G( T, s! L# t
        UARTStdioInit();  i- S  j& T8 D0 S
        8 u( ?6 G5 j) U9 d: ]' Q6 w( Z2 k
        // GPIO 管脚复用配置. L; K% W: r/ K; Z) I! U7 c5 R
        GPIOBankPinMuxSet();
6 Z1 p" r5 q( L4 H2 t
4 O9 Y& _( |0 w2 T5 O- j4 _        // ARM 中断初始化
. `* Q8 c% H1 p/ d5 P# }7 d! j        InterruptInit();
' X1 d- p3 M' N- g, w" p& _, j3 v& d& B; Y. P& D
        // PWM 中断初始化' t' f, Z2 v4 c8 n$ w7 e
        PWMInterruptInit();
4 |  C( C) \9 `, o* L
/ `7 f& Z4 r% _/ d        unsigned char i;/ I  W  a" [  \, t3 y1 b
        unsigned int j;8 A1 H7 M) {# u9 I

2 ?6 O* f4 u+ N  ~8 R! `1 }4 B3 |' f        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);; F8 V0 X  k; J0 _
        UARTPuts("------------------------------------------------------------\r\n", -1);
8 K6 O5 X' \  a1 s        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);" V+ C3 Y' u% a" A
        // 产生波形- a9 j" e0 X; U! G+ w
        PWM1ABasic(25000,50);2 I( Q! A: o" }: E- y) G
& ~7 [" v! v+ X
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
4 g9 j5 ?) k" T2 C$ |; S        UARTPuts("------------------------------------------------------------\r\n", -1);- m5 F6 J- z- M) P
8 ~& C1 _. a( n( N

5 f- Y1 [0 X  H% d* k2 j; B$ l$ ^' P$ |; q
        UARTPuts("------------------------------------------------------------\r\n", -1);1 `. T) X  T5 k$ V
        UARTPuts("                    C6748 ECAP Test\r\n", -1);
9 c2 p5 ~1 u" Y, H: t1 [- a) R        // ECAP 捕获初始化
9 H/ J1 {5 o$ u+ [        ECAPInit();
7 J- s+ D- F4 U0 u; h6 |; m        UARTPuts("Initialize ECAP.......\r\n",-1);
, O5 y) F9 F! ~. z9 Y        for(i=0;i<5;i++). o& n* l: R& M; Q
        {
7 o4 i9 _* i! G$ X; a* k8 o$ ~                    for(j=0x00FFFFFF;j>0;j--);            // 延时
# g3 ]& U" D2 s& |5 [: U6 U, R                    ECAPRead();) j8 u# P' K9 u  a
        }
: r" z& `9 L% b0 Z        UARTPuts("\r\n",-1);! Z/ {6 q1 |! E) m* x
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
2 y' J2 m7 z4 K4 |        UARTPuts("------------------------------------------------------------\r\n", -1);
0 [# p" D- o; }9 d4 X& q( Y+ b; Z" j; F
        // 主循环
9 o$ y- y4 Q2 e; V3 k1 L, d        for(;;)
) g4 z& y+ W8 R- h        {
7 Z  ~( h* y1 H5 O) h/ q4 S% U7 @3 C0 B! B! I' |5 x& A- i
        }
5 E+ _6 q* \4 R& Y}# E9 h: q" a6 l8 G/ R
# V# _9 `9 @+ g6 w& v0 c# y4 _
/****************************************************************************/5 c( `, V2 P4 s) E  Y: L4 Q
/*                                                                          */
8 o" {+ L0 a# W+ |6 R5 i& B/*              PSC 初始化                                                  */6 }) a" a- [. d$ W2 `, ?
/*                                                                          */
2 V) d4 ~' c* F9 G6 [2 b& y/****************************************************************************/
( M$ E7 d! Y& n! g1 u8 b5 Hvoid PSCInit(void)
6 a& S1 `2 l9 E4 ~( f' x{6 J4 G" z) t3 E/ G2 F: ^* \
        // 使能  EHRPWM 和 ECAP 模块7 R% p4 o. \7 ~, f& P
        // 对相应外设模块的使能也可以在 BootLoader 中完成; |4 `* T2 @9 F2 c) {4 r5 V$ _
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);1 N. e/ M6 j8 Y1 b2 [
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
- W6 E) W9 O8 J: V: j}
9 B& t: l- y# [) Z( P8 F8 f9 W. W, ]" X" L, ^
/****************************************************************************/
  ^4 t! d1 j& b. i/*                                                                          */. U$ T; B3 L( [0 ]1 x* i
/*              GPIO 管脚复用配置                                           */
& O" Q3 W! E5 Y: O* Y/*                                                                          */. ~" N- l, j% L( M
/****************************************************************************/
. I3 n) H& C/ H9 evoid GPIOBankPinMuxSet(void)' T' `+ C; t& Q$ S, U
{
# `$ {! h) [9 Y' b        EHRPWM1PinMuxSetup();2 B7 R6 {, y/ |* n2 G1 _; c

- ?# N& b+ J9 ]8 g        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)2 n% R' Y4 U) G" ~- ^1 M* j. @
        // 作为捕获功能时管脚方向为输入6 y: c7 D: t4 U! ]
        // 作为辅助脉宽调制时管脚方向为输出5 b! C: L7 K* e' U- ?
    // ECAP2 / APWM2. |; t4 I$ a7 e+ X5 L( ~; u
        ECAPPinMuxSetup(2);4 F3 Y2 M# K( p! i, P* ]7 |2 D6 `, h
6 A( ~  b- C0 \+ u& Z
        // ECAP2 / APWM2方向设置为输入; k" r! |, Y7 p' U0 s  c( j1 c
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]* H6 j6 O: T4 X( S1 {( c0 j  S
}
5 @1 m# a! t5 J; Z
. B3 E6 H* ^, P" x3 b6 _+ }/****************************************************************************/9 \1 M# V2 J. F! {
/*                                                                          */
6 ^, T  A$ A( }$ [+ E" S5 j( \/*              PWM 输出波形                                                */: Q7 i- n, u+ `/ T. N- U2 G. I
/*                                                                          */
* n# o! X4 ^' ]1 I$ ~& T' i8 Y/****************************************************************************/
4 U7 K0 b0 N6 Z, m* ^8 i7 dvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
; o7 [8 n5 u8 r0 G{
6 R; B4 c+ Z3 d1 X$ C  Z    // 时间基准配置" C- Q& ]* c$ ^" l3 H. b
    // 时钟配置
$ F: _& v+ W8 z) W5 L0 g( u' g    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);* |' Y: {- m) M. t4 j' {

: m( S# l# d( F    // 配置周期0 o7 l  _+ N& G7 o. V
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,/ n) x( f( ^) h6 y
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);9 D- u2 C, P: R
1 t% J/ \) A/ S8 Z
    // 禁用输入同步信号: I  M) X/ u( c& \
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
$ o2 I: D( Z' L2 Q+ A5 u# Y2 Y7 d( O6 \' \; G
    // 禁用输出同步信号
- R! R% a5 q2 ]" ?" s' f0 M    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
! l! n5 h* B9 g+ i% }; t# U. ]7 s/ ^! M" Z  H
    // 仿真(DEBUG)模式行为配置
5 e1 {8 A* {: [2 j/ b    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);: r( K. t1 l9 u1 R
0 l8 n2 C! Q7 M8 P* o% g, h6 h
    // 配置计数比较器子模块
; A& z5 Z) P+ T0 p9 a2 l    // 加载比较器 A 值6 I! {/ P% D8 v# `$ N! g& j
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,- P  O" Q" w6 Q) k7 B
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);6 V' u/ _( [0 Y; n2 e' A0 l2 ^

  F1 D3 V: d$ h    // 加载比较器 B 值& @- U. x+ ]7 i  C. y+ W
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,7 O0 M3 F6 z+ l2 s1 X* r
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);& P3 x" t* A- [3 k/ b6 l% U4 `
8 @0 l/ V" |1 t6 x9 C+ o
    // 功能限定配置(输出引脚触发方式设定). u8 H- b8 N0 W% j. M
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
+ y) Y% l$ F0 s& I# Q    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
  h% r6 V1 r( w$ C, g5 l                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,( E: Y2 p6 ?# O; `7 q" B
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);  ^& x$ E& _+ u: x2 A

+ B2 R6 _3 L: @: I2 q8 V8 v0 ]    // 禁用(旁路,信号直接输出到斩波子模块)死区模块4 `" ^0 E! H( g3 a, Q- c. [5 _( O. c/ ~) g
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);8 `& ^+ K! i# k# X% v
+ I0 L3 k7 }& l( @% q& ^
    // 禁用斩波子模块
$ s, E% O7 j: r( v! x    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);% Y3 n0 r4 t6 F8 H
" ~/ G% z/ `$ V% J% d& `4 K
    // 禁用错误控制事件
: N( C' _' R+ P; M- w    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);1 F: n) J) [% ~' ]
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
; j/ N+ i9 P# D) i3 e" p# k  W' X5 q
    // 事件触发配置
% P8 y( e- J/ {$ x! K; v    // 每三次事件发生产生中断! e+ o; T& I6 l0 X+ W8 U, b& L! |
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
* u* L- y9 \' [( I2 j    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件5 d* {# N+ Z* ^; A! X  ^
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
- Q; U; y2 H+ s    // 使能中断
5 y! f$ M/ e; u6 k5 d0 ]2 U" z, \    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
. o& [1 ^* ~9 @6 d& w7 V/ B
" P& q, b5 a9 t9 q    // 禁用高精度子模块. {7 a, t* T- d, `* L' a8 Z, |
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);& p4 X9 x2 p$ V2 ]- W. S

1 n3 z6 T2 c! D" _    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
" `% B# W) k3 r% ]0 A1 `* c7 R8 E}7 G$ w& @0 m- T/ g( p. v1 h2 _9 X

) z2 q! z( d& Q+ r* J3 E) J- G; wvoid ChopperWaveform(void)4 v5 W5 n" ]( }* H7 y
{
: X+ U' k5 r  L% _0 Y    // 50% 占空比
# s& d& [! D5 N2 z5 q    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
8 {- `/ u$ h2 T% p2 `* ^    // 4 分频
; w: M6 g# r  A+ Z* z' I) Y7 I6 ?    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
( N* O6 a* {7 \* o    // 单个脉冲宽度% a2 y; P7 p0 _  _
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
/ Q. S$ Q$ Q5 ^" Y; F) G0 C    // 使能斩波子模块- R4 |, {, G. z8 h1 G4 I0 Z
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
% j) B4 a- ?+ ~+ k& l}
5 R; k' z) L/ w3 j. e7 _- e' x9 J' x# m- t" \  y
/****************************************************************************/8 a' `5 I) q! h9 h9 W  N. [' s
/*                                                                          */
" |( T: _, ]: [7 g2 b7 a/*              PWM 中断初始化                                              */. [& q1 e! _( D
/*                                                                          */
8 t5 _( ~  p  T) d" b1 Q& b/****************************************************************************/6 I* @; \7 n2 `- J3 o
void PWMInterruptInit(void)2 W) [0 s6 r1 E$ \) d6 I# K
{4 ^5 F# k9 l$ U; J6 I8 \# r6 O5 a
        // 注册中断服务函数) w' k6 M8 N# x' n( f) o
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);8 B- q9 r: g2 L+ e; H
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
7 E0 J# {$ i' n1 t3 ?) U, I% h& z3 g2 {) d' w
        // 映射中断& B7 S  e, w7 v0 W4 r' o
        IntChannelSet(SYS_INT_EHRPWM1, 2);
! l, d% `8 ~8 E: L& L5 O& `        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
' {) V6 [$ w* y2 W; I+ W4 j1 A4 j+ r2 o5 f
        // 使能中断5 Y, Z: {. j7 H" N' ]6 J7 \3 P4 k
        IntSystemEnable(SYS_INT_EHRPWM1);
% K# Y! y* D/ s0 c( T' A. O3 h        IntSystemEnable(SYS_INT_EHRPWM1TZ);
5 c& x7 p" ]  X. p0 v}
& o6 m/ }" U& a9 J; }( m& S5 [% t7 h$ I* D2 X
/****************************************************************************/' Z2 b( r3 P( l+ d6 k/ m( O# n
/*                                                                          */
( K7 e4 S% i; n( {* p/*              ARM 中断初始化                                              */4 A7 ?. K! h& j' {
/*                                                                          */
/ F5 w7 h8 k: h8 R: L6 }2 O( c% I/****************************************************************************/9 g: W  Z" _0 J- g: e$ k
void InterruptInit(void)
4 ?$ n. }2 Q7 ]8 S% g# T7 z{: `/ j/ j- _) ^$ @, ^
        // 初始化 ARM 中断控制器
/ [0 ^3 t) H5 H; u" ^4 s# f5 W; A/ u        IntAINTCInit();$ X$ ~+ S) j. w1 v4 f! B
9 U) w( t8 f. G
        // 使能 IRQ(CPSR)4 O& V( e0 P. X
        IntMasterIRQEnable();
8 S. m2 U* D9 H  T  ^4 N/ a5 Q' r- |( c6 j
        // 使能中断(AINTC GER)3 s! M6 {! \  W4 E, _. O6 ]
        IntGlobalEnable();
! B% ~& Q6 T* G6 K* `
& |8 }* T. f+ H; @: T        // 使能中断(AINTC HIER)
( i  [( X1 t& v- Q. G+ f        IntIRQEnable();
, y4 n. C7 @+ I$ q}0 b6 ?1 [0 j( m9 H% m4 {
( w6 `6 x1 F; b' n# z% ~

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/9 _3 H; B, U7 E: }
/*                                                                          */3 C. |5 U! l+ _3 B0 N5 F
/*              中断服务函数                                                */+ l9 D% b" R( z! D5 c  z) @
/*                                                                          */+ ^3 r6 B2 x# s* u6 e$ `
/****************************************************************************/
$ N, a9 z2 C, A# c8 b& Svoid PWMEventIsr(void)
0 b. R% g6 G& c{5 R, M. |( `  Y. s
        IntSystemStatusClear(SYS_INT_EHRPWM1);
1 [  p( P8 U' F# ?6 x; Q" {* b+ r# F0 s- z0 F
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
" D% H+ A" n- s3 \( ?3 b}7 e4 K! p6 {! v4 D& w! h
1 B% v8 o8 J; ~9 ^
void PWMTZIsr(void)
2 r( ?7 K. c! F, h9 b{2 S, G/ K% }' ]
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);9 U" e2 V8 u% Q0 S  C
$ X' @7 `" W* L' T! W' g  u
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
, D# T7 j" L$ @$ a, _7 ^}
; U7 o) ~' ]1 H! X  _
9 c6 i1 Y# K# k7 S2 |1 o& u/****************************************************************************/
" c6 O6 d( T6 A/ B8 A/*                                                                          */
+ ?% S) K$ X; f$ L$ m/*              初始化捕获模块                                              */
" L) |, [( J4 m3 d# r7 J/ F5 T/*                                                                          */  L0 b% l  `. }/ G* C
/****************************************************************************/$ Y, F+ ~+ F3 T
void ECAPInit(void)" ]; ~' j) C6 p3 @: s2 r  [% S, Y
{
  W! n" S0 O9 X" B: B        /*-----设置 ECCTL1-----*/
* z" b# p6 ?3 N' p1 L0 W* o$ Z        // 使能CAP寄存器装载
  Z( T+ H) b0 R) n- O        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);( O' E: V3 I, \
        // 设置预分频值.
3 `) F- t$ r( s0 i; x        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);9 Y* `- {# A5 P. F' \
        // 上升沿触发捕获事件
# O% {  n$ o+ b7 I        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
: \1 @8 K$ p" p! {5 m        // 输入捕获后重新装载计数器值.
3 `' ^7 C5 L4 G- `4 O        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);! W7 r4 ^! X8 x4 J4 x  j6 B% v4 m
$ T: C3 Q" _  I0 D- X9 C
        /*-----设置 ECCTL2-----*/
+ n, z6 d) d8 M" L2 U; D5 G; t1 f! c        // 连续模式+ i/ U5 F) O5 d
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);" ^( v" d  O2 a' @* a
        // ECAP计数器TSCTR持续计数! }8 M! N! j1 W7 T/ i  {8 n% @9 q
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
/ ^7 _9 p7 ]! X% j* T* C9 ^        // 禁用同步输出和同步输入
) h& j, p0 S) |5 V. ?4 K2 \: D        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);& h9 _; \9 q& ]/ K( P$ G$ l+ u7 b9 g
        // 配置 ECAP 2 为 CAPTURE 模式2 p/ f2 C' U& e) u9 l
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);# }4 Z6 S5 W7 e$ Q

( v9 w0 v7 g. n        // 使能中断$ H' q; ^8 I5 `2 w; l
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
. ?2 \6 R+ y' _* Z+ d4 f}" J9 u/ G1 r9 Z5 _* q" n* G
9 I( j( L4 [$ C& }+ E1 ~  B
/****************************************************************************/- [; b% w5 M& H
/*                                                                          */! f( C; u5 m/ x5 F. j! F
/*              取得捕获结果                                                */1 E/ v1 W. i' y* Y
/*                                                                          */2 \  i( v) _9 [$ x' j' p
/****************************************************************************/. m' Y0 K% ~/ c3 k/ m3 w2 E
unsigned int ECAPRead(void)) `0 ?8 o; B. f( w( ~% H
{# C' f0 v' `% x" s$ `
        unsigned int capvalue;* x/ b$ G- @) G% P) x* Z% ~! a: v
        unsigned long frequency;
% O) p, d' p9 H+ U" f8 D4 x% G
, L: c4 N( x8 e; s7 X  t        // Event1 中断标志( Y8 r) Z- o$ z; S2 L2 b. F* y
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))* I$ S# L* ], w" v( O
        {3 N. q8 j' m8 E9 r9 v: b# q- @8 B
                // 取得捕获计数" F! x0 I$ Q+ q  u' \
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
7 F( v1 a& \* W2 U, I; a' a3 |                capvalue = ECAPResult.cap1;
! p& ]2 o3 S+ V1 L$ l6 [( G- a4 `$ k) ^
1 `) o! Q: s. h. |                // CAPTRUE 模块 228M 时钟主频+ q# s( S" H! q4 T0 W; r
                frequency  =  228000000/capvalue;
" m4 B/ ]& c4 E* z8 X9 O. N( M                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);7 l* Q& ~+ f* t) T1 W5 N5 d3 @- w4 i

, g' w3 C+ Z1 F1 z3 y                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);- D8 K- y) C' u! j8 r
//                IntEventClear(SYS_INT_ECAP2);8 B, j% J/ C- @; p
        }$ V% N$ |4 g% N4 e% @2 u
        return frequency;
3 I5 @& T2 _; T2 |}5 g( U8 ^$ i! p0 `

作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
2 x& ]; O, P/ N( I4 Z# 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