嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
. W- k1 f0 t" G5 i
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/0 ^" C7 ?: @/ T1 f$ a1 e
/*                                                                          */
) G2 R- E% f" o( C6 A1 S5 I/*              宏定义                                                      */
2 l' p' L2 x  Z: Q# |7 u1 Q( _4 `$ v/*                                                                          */
3 J( O5 z' Y. P9 C" p! ^/****************************************************************************/1 w5 T* s( `% g  E# E6 W
// 软件断点1 ]+ ?& B, p3 Y( g6 k
#define SW_BREAKPOINT     asm(" SWBP 0 ");
+ m4 Z6 C! C" A# ]' d( M$ s6 O& F) w& T; b7 {5 H/ d6 L4 q
// 时钟分频& S0 H3 E$ E3 e* D( O  I
#define CLOCK_DIV_VAL     228  ^4 E1 M" R3 t7 L, u
4 J2 Q0 }; [" p% ^( d' l9 z
/****************************************************************************/& M' V( S5 G/ J
/*                                                                          */7 z6 }% w/ ?- `+ N& s
/*              全局变量                                                    */
$ [& l& f0 _3 j! f/*                                                                          */6 L  q) L, P. Y2 U
/****************************************************************************/
6 T7 V0 Z0 d9 S+ _& b4 x! ~ECAPCONTEXT ECAPResult;
! C4 M1 C- t0 s- C6 }# l- y, a% [' i; R5 b1 h
/****************************************************************************/
2 }) j/ e. V, O7 i1 w$ v: V! C1 k/*                                                                          *// @6 V  W% @1 H5 c$ i% X5 ~
/*              函数声明                                                    */
9 H% d5 a9 ?/ s" i3 m/*                                                                          */
3 O! o% Z+ p* q# l$ ?+ J/****************************************************************************/1 M4 d; n# K' t0 ^/ e, D
// 外设使能配置# r4 B* {' f4 \
void PSCInit(void);) R. \& h, X. n6 ~. n' x1 e" J! t
( w3 v% _4 O/ U: S9 h0 T  y2 w2 F$ k
// GPIO 管脚复用配置( w# j. L) \1 m; |6 e
void GPIOBankPinMuxSet();1 f$ r" O! Z) Q4 J
4 ~6 X( ?5 J' L7 q6 J: P
// 产生波形
. H  r* q6 Q% Qvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
3 J6 e" \7 x6 _/ I2 g. k9 B6 Cvoid ChopperWaveform(void);
3 Z6 r2 k8 e  l5 S/ g4 N, d7 n1 P( [; f# q+ ?1 L
// ECAP初始化和读函数9 y& ~; s' c* Z: z' O+ z+ Y, M
void ECAPInit(void);) N" z7 Y/ x# Z: c4 ?0 e3 m
unsigned int ECAPRead(void);
. e! g: b; J* O# c
" V7 t, W+ a: K$ N//ARM 中断初始化
6 [" Z* R1 ~, y( {, K% e/ avoid InterruptInit(void);& t+ A' U* `% W1 g  _
6 [5 _6 z3 u# V, P; f
// PWM 中断初始化
1 o3 ?9 }" K. l; J4 ^void PWMInterruptInit(void);7 ?6 n0 {% R( p/ R9 r9 x! h
// 中断服务函数
- m# N: S4 N2 v3 r, j// PWM 事件9 b8 p( `9 D& m8 B  }/ u7 ^4 [- G
void PWMEventIsr(void);
6 k3 A! O" S1 O5 w// PWM 错误控制事件
* N+ ]" w. ^4 U& w+ Qvoid PWMTZIsr(void);( ]( W8 ~, o! q8 H( e" F

5 F6 v2 }1 x" \2 g( L) W( X! [$ B/****************************************************************************/* l" b1 Q2 I" y& i( `' z
/*                                                                          */8 j9 m. ]% C: [: x/ n8 d' v
/*              主函数                                                      */
+ h# _- f; e/ v7 E! b/*                                                                          */) b, Y4 j% m4 t. N
/****************************************************************************/
6 D, p" d$ O) S" ~int main(void)
. b. m% t; m# H0 ]{  m" M- p  A: w7 {# O
        // 外设使能配置
9 a0 K' T! b/ {6 b6 j+ a; V7 y% z        PSCInit();
7 P4 E- m: S, P. D3 f) r
& N) U& f/ a* F2 N        // 初始化串口终端 使用串口20 O) h7 p, s. |: C
        UARTStdioInit();. x" ]$ w9 y( m6 A% W
       
+ m' N/ d. t5 m; D4 |        // GPIO 管脚复用配置- p4 t$ `9 q- C  H( @( O9 ~
        GPIOBankPinMuxSet();
7 k3 @: |; I3 G' ]% @2 M  w- W
# ^. d. j, i' a4 L& G        // ARM 中断初始化
3 T3 C9 P/ Q' B5 g0 }        InterruptInit();
3 p  ~) M$ l7 i9 M$ {( Z! q: s9 S" U; N% e# |' {
        // PWM 中断初始化% `9 @: X5 i$ O
        PWMInterruptInit();9 H& ?, k9 W; B( G7 p

  ]% z" E+ p5 s& k* b        unsigned char i;
) w& @  d* f/ q" ?        unsigned int j;
/ D! f7 ]) B9 S4 _
$ O5 k8 E) z+ _; h        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
- D* x$ {) i; i, s' A8 g9 P        UARTPuts("------------------------------------------------------------\r\n", -1);# p+ Y8 m' M2 c) h; v
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
4 v' ]/ O; h; f% H        // 产生波形
' W) g0 t( I5 o. Q# v        PWM1ABasic(25000,50);
/ u) I: ]* ?6 G9 R" D4 Q+ \' r6 ^' ~7 @. E( j* Y
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
( }1 i. T) L+ u' g; }. F$ O1 Y        UARTPuts("------------------------------------------------------------\r\n", -1);$ [. p& N0 |, V7 y

: a# ?8 A! N9 R  G: C# {8 ~6 f3 B* J) y

; J1 ]* k. X9 ~/ W) u9 B        UARTPuts("------------------------------------------------------------\r\n", -1);+ I7 F9 N" N; _( D& w4 `
        UARTPuts("                    C6748 ECAP Test\r\n", -1);7 J! a) D- m. X2 @! v1 Y7 B
        // ECAP 捕获初始化& `. D+ S; m; }8 K2 u! W" ]9 Q
        ECAPInit();
3 o7 j3 X. k- y& A- x        UARTPuts("Initialize ECAP.......\r\n",-1);2 r& y! c8 ]5 G/ B
        for(i=0;i<5;i++)& a  r" ^- _# j  D3 x$ S' A
        {+ |2 }0 S) p7 J, _0 C) g
                    for(j=0x00FFFFFF;j>0;j--);            // 延时
9 C5 D! w0 t* U4 K. E' c' A                    ECAPRead();4 z" h" h, W  q% ]. J3 F! o- V! A
        }
% I9 s  m3 \( A& q  d        UARTPuts("\r\n",-1);' i, M. n; _7 p9 |" i  Z) C
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);* C) _* U7 a) f
        UARTPuts("------------------------------------------------------------\r\n", -1);
" k. ^4 C( g& o
( ]6 P9 k5 J1 F% _5 c+ s        // 主循环/ K2 O' [; X1 `& Z/ f% }' \0 X, Y  V
        for(;;)
, c5 H+ C5 w9 i$ p, a2 g1 K  [" j        {. Q" u4 H' b# V$ p! b

" V. q+ I/ \9 e  a" w        }' \2 Z- O3 Z: b" L
}
8 ^# a! {- r9 {9 i4 Y1 }* t3 O, h8 @3 i& F
/****************************************************************************/$ [2 s$ }- m, n% ~( s) x0 h
/*                                                                          */
. Y& G' b- V$ A( I/*              PSC 初始化                                                  */
! F" \" k. P6 L$ o9 I/ r/*                                                                          */
7 }/ r' O7 ?, _1 N/****************************************************************************/" T- Q- P  g3 ?$ F, @
void PSCInit(void): d4 P  Z# Z6 k4 y
{
, |) G" n% a1 d! x, O/ w- q        // 使能  EHRPWM 和 ECAP 模块0 `6 @" B% s& @9 r0 T: x
        // 对相应外设模块的使能也可以在 BootLoader 中完成
+ \- m% C  r2 n0 o1 I  ?    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
6 W/ y1 Q1 D) E% J1 |4 G    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
) H: J; R8 V- p" @' E5 u# Q}( ?+ ^$ b( G8 S4 q% M  q
' _2 m. d: T$ m
/****************************************************************************/
- S' c* W) H- v/ ?  g/ m: u, s# V/*                                                                          */
; {! n& B$ l9 m3 P5 C/*              GPIO 管脚复用配置                                           */
$ {* u8 [; A$ q! `6 [0 Z3 @$ D% g# g/*                                                                          */$ ?# r9 m- L5 n3 |+ \$ ?+ {
/****************************************************************************/1 q* y4 U" u$ G% L
void GPIOBankPinMuxSet(void)
0 ]. H4 D  x) |3 k3 d; P" R7 n{
1 ]4 k, V# ^/ B- W        EHRPWM1PinMuxSetup();) w( J! I4 o% W# q" |/ `- f

* U- P  h. f; f% U" o6 i        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)* X6 Q* v- {6 R
        // 作为捕获功能时管脚方向为输入4 `( W. e# q/ c. z4 [) `. @& ]
        // 作为辅助脉宽调制时管脚方向为输出9 E, O& ]5 `. e- A# f
    // ECAP2 / APWM2, J/ F* ~/ ^! \$ s0 Q2 v
        ECAPPinMuxSetup(2);
6 O# p  r% m8 V; q# v( X8 }. V# ]  W5 B" G
3 B$ }! W. Q# m+ ^* Z3 `8 B        // ECAP2 / APWM2方向设置为输入
' r. B5 l8 n/ \" _- K7 ^7 U        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
- M8 N" _- f6 m6 t: J0 L: r. @}4 ?1 B- J3 U0 Y
/ I: _0 |4 k7 i" T; p0 ^! p6 Y+ t
/****************************************************************************/; h5 R& W1 |5 m1 H! A  P
/*                                                                          */" C3 D7 i& \% h4 l: `* G( h
/*              PWM 输出波形                                                */3 Y) M# `1 e! a$ p' o8 i( ~5 a
/*                                                                          */5 Z: q( B! O# G& m( k
/****************************************************************************/
5 o6 `8 x& R  a9 Q$ k& m; ?2 L7 Lvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
: y3 Q+ g+ V1 K$ M{1 G( \+ ?) a) N. E5 G! ^1 U& |
    // 时间基准配置
9 y- [4 o, {9 J  F) L( P    // 时钟配置
1 ^2 }  x" b- w& t6 s  {* {    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);3 _4 H4 r. {2 X- k' ]

& I, |: D  ?5 b' }& [    // 配置周期
0 c6 r) q; m: `- i' m% U    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
4 L/ r; U9 l) I& j0 H5 s% r6 o- P                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
1 Q, R. r, p. ~" P3 b% }# X3 t/ J% s- c* ^  @- y
    // 禁用输入同步信号1 s5 Y3 r: u& p0 k  P8 K; W
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
7 Y( a- |; q8 V( |, M
0 f* t2 g6 B3 e3 B" P    // 禁用输出同步信号
: I7 d( }4 F# R, M& \    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);2 _  A6 g  a( Y& \
+ ?' C0 Y" I9 t' r6 @* @9 B9 X
    // 仿真(DEBUG)模式行为配置. A3 }, ?& i) J5 }, c2 v4 w- Z
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);) L5 s! k8 k5 C- }

- f9 z3 o2 L- K7 A$ b    // 配置计数比较器子模块
, F8 n$ q, |9 V9 ?    // 加载比较器 A 值" T) q  C; D1 m1 A( S/ n
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
; ^' y( j' N6 G: D. o; S                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);5 Z+ i2 M7 P# b( [6 \6 N

* E4 q# ?# i' a6 y  l) a0 V/ j    // 加载比较器 B 值+ P1 g! j- a9 o1 K
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,7 x, p7 m- `* ~1 h* L( [
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
1 B& n' L8 s$ {/ {9 T
% }9 z4 d8 Y5 q. E) c* w    // 功能限定配置(输出引脚触发方式设定)
. }5 [% w7 G0 t    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出6 j- _( A1 L5 ]; g# F) a4 n) w
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
+ F! j6 y  N% X                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,& o  w$ m+ `0 u: U. w
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
7 m. Z  ]: N# P! t, Q( X' f- Y4 \( M9 j* D3 p# k0 w
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块  H3 {8 d' x% ?2 ~; O2 G, w. j: y
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
  e: X# A- R# b6 G5 P
2 i4 z1 S- o/ l' h    // 禁用斩波子模块% p1 d7 ~, G* B
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
7 _) h0 m7 v4 h& v4 i. D  g% j$ E% O4 @. `+ z# I+ [
    // 禁用错误控制事件
  d. h% T" L/ n* U4 [    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
! g  g; q& k: R    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);6 W! n' G' x. d. N. O" ^
$ a2 z$ Y" b5 o$ B# {$ `7 _9 ?7 Y
    // 事件触发配置
7 l- d* T8 o. I1 k    // 每三次事件发生产生中断
8 H# D1 e8 o# O+ _* i# ]& ~    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
! S" I9 ?! q5 R- y0 k    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件5 `$ \& v, n+ B& N
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);$ Q9 f" K( E6 m2 m6 H* g( \
    // 使能中断! t/ q: ], u8 Z( R- ^; V4 E' {
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
% V5 o6 y. }6 W
) k* V8 l! p9 C" R2 v/ t$ e, d5 Y    // 禁用高精度子模块
5 e& M) q, S" [/ s( B, Y    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);  W$ P+ H( n* n% l) J6 ^
7 c: ]7 Y* p: {1 B5 k
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
5 U4 ~/ g" c1 g8 |- i}
% ~  D. j4 Q! s+ ~
6 d& X& j4 x  t9 }$ S! |; B4 Lvoid ChopperWaveform(void)5 g" F+ U8 C* K* V$ E+ B+ q
{8 O8 ^% R7 U; k: J6 G: n
    // 50% 占空比
; _( J  \6 m/ b4 O    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);- J, K7 n" L3 N" ?
    // 4 分频3 ~- [7 C5 Q0 F4 m! G
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
! f/ w9 F) ^/ J* d; _( r/ [2 J/ v    // 单个脉冲宽度3 }3 f7 M* V+ R6 R$ Z7 Q0 Y
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);# a8 k9 F$ \2 ~' [$ p
    // 使能斩波子模块, [, x9 \' A1 Y
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
& z+ u+ P- B- a0 k' Z' d}& x# @+ O& s; K  {% e" m
: F  ~! s' J- G" C' k
/****************************************************************************/
( t& ~0 a  e6 p! {# `3 j/*                                                                          */& j& Z/ ^# c* W% K! O& T
/*              PWM 中断初始化                                              */
! @* o% V! _7 c- ]; v" W/*                                                                          */
+ G- M8 D8 v' R: Z/****************************************************************************/
1 n1 |4 Z7 ?( }# K# ^, U4 B. |9 L. ?void PWMInterruptInit(void)3 c$ f8 z# J. P+ b. k: w& Z
{
" r4 _- J4 z8 W8 N# s6 k        // 注册中断服务函数
& z2 }/ o( h. Q! U        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);) b" g0 M$ s/ k1 J! s. w/ P6 Z. o
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
2 q2 T/ B6 R0 f" ]% r( A& q; U, @/ Z8 ]3 M  q: U( t
        // 映射中断
% B+ D7 e6 w$ h3 b( C. T$ x$ @. D        IntChannelSet(SYS_INT_EHRPWM1, 2);
2 t/ w5 N4 @4 n" X) X        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);3 b* I0 i9 L+ z: b
% _4 G6 I( w' Y: Z
        // 使能中断' P, X! \2 _! c" O$ a7 K- A
        IntSystemEnable(SYS_INT_EHRPWM1);
4 L: y4 }$ C- v" P& U& y        IntSystemEnable(SYS_INT_EHRPWM1TZ);' q6 Q. D& V, ?! |
}
* A: e5 E4 k1 }$ y' g1 p5 R+ N$ t$ H
/****************************************************************************/
4 P; l4 i' `4 h. B' i/*                                                                          */) C$ a. T, @5 `7 [4 s$ j: T# d
/*              ARM 中断初始化                                              */2 G1 r6 O. f& v- B
/*                                                                          */
+ B5 d7 [& m' V0 ?/ b/****************************************************************************/# ]! X5 q0 y5 O. s4 j2 u) x% I1 @
void InterruptInit(void)
# X7 t3 l5 M1 f. l/ i& U{: q1 F) L  s1 Q. _& ~2 q
        // 初始化 ARM 中断控制器
/ H& u! j: ]/ w: w        IntAINTCInit();
8 |" W% o3 g  |
8 A& j% k9 G, m2 q        // 使能 IRQ(CPSR)
9 I7 C- {/ |& q6 w4 |        IntMasterIRQEnable();
; x( W+ H+ Z7 `( ^9 h' Q3 I4 p+ K7 ~: {9 \! t& M5 u  h( z
        // 使能中断(AINTC GER)
& {; \0 n# p0 {" y+ h7 g        IntGlobalEnable();+ ?6 X' b+ t% V; z. p
& h/ Z* ^! _9 L) r4 |8 X
        // 使能中断(AINTC HIER)
: G" ^$ _8 D: v2 F        IntIRQEnable();
0 A9 Q9 A/ y% H- _" D* |+ {* }" z}
  p$ c8 s; T& s* u- c
# A. ^+ D% H! U" o, H9 O# m/ n3 @; L
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/
# B; Q$ O! Z& l0 }( f( \/*                                                                          */# d) d9 Y  b2 \' O  d
/*              中断服务函数                                                */
! C# H) I* N* C# K/*                                                                          */% X$ o. [% |+ x
/****************************************************************************/8 L7 S( J5 _- z# x& R8 u/ Q
void PWMEventIsr(void)
+ Z5 U, F' |- y: w6 N{; e/ |& I- b" t7 Q) M; N
        IntSystemStatusClear(SYS_INT_EHRPWM1);
7 L/ H, @" X2 W% e4 s0 S$ e5 }8 ~% i( Y4 @9 W1 j, `5 Z% ?
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);( n" U! ?$ ]5 B( E
}" @! T1 M& M( U/ i
7 P2 W, t) \9 _% r8 \4 [
void PWMTZIsr(void)/ `5 y( |' Z9 d, k: A- G. K
{* z2 C3 V! h9 W9 u
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
0 I8 L! J9 K+ f( P: K6 _* K/ O* n9 c0 N6 W& [; M: d
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
7 J6 w! \: Q0 F}- X3 \1 B" R2 ?% J6 Z4 P$ k

$ q* U+ ^: e- y1 f* }  R/****************************************************************************/& ^  S. r3 [) z5 x' E
/*                                                                          */5 N2 ?" p$ I. ?7 ?
/*              初始化捕获模块                                              */
# \5 s/ E5 Z8 m* i4 P" K( i/*                                                                          */
$ [9 B8 p* m) `& t9 v& B# q& X/****************************************************************************/
) o# x, p$ _: \6 Lvoid ECAPInit(void)' z) E& Q0 A3 S! K7 U* H
{
0 z" y( F+ g. H  D1 y+ ]& K5 X        /*-----设置 ECCTL1-----*/' _' I. D& i- r& `9 z) ~
        // 使能CAP寄存器装载/ m" X% W5 ?( C& T5 l4 Z" P
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);. R9 X- z0 i# {9 b* n9 k& ~; d
        // 设置预分频值.; Z3 ~$ ~- I/ ^: D
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
3 f1 t3 f5 T6 `4 J        // 上升沿触发捕获事件
4 ]8 ~- ^! H$ [: S3 `        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
9 v4 F, x& D+ s& Y  @, E+ Q2 D        // 输入捕获后重新装载计数器值.! ?" `" A3 p: O/ p8 k
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);$ e4 x# a( B4 i- R

4 k# r6 S- v# ?7 [* U        /*-----设置 ECCTL2-----*/
9 g3 G/ q. D  E; s        // 连续模式' d2 k! P9 i# D, D! [$ S& K
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
6 ~# n! T" i+ l1 n, U( y; [6 \. d        // ECAP计数器TSCTR持续计数6 Y6 {' k9 J' o; T$ y( N/ S
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);8 l. }" x0 @3 C2 R. l. A
        // 禁用同步输出和同步输入
$ g: S" q4 s5 B* f( U        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);4 S8 i) n6 f/ q; q& i
        // 配置 ECAP 2 为 CAPTURE 模式
. b1 L* \+ u# W8 D1 T2 v        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);- E& q, U. @1 @7 |

: }5 {& A* T! Z8 T& z9 P        // 使能中断; ]- Z. W' U, K, P
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
& P% N  x' K, O$ v% U, {2 {* l}/ g) r; Q2 a+ Y  q) Q9 c- \. g" r# f
7 J/ {2 V1 f. @9 T
/****************************************************************************/+ T2 G- G7 i7 O( P& Q
/*                                                                          */8 h# x+ c, |1 x' V  i
/*              取得捕获结果                                                */
0 A6 K" V- J5 {# O9 |+ f( Y/*                                                                          */
# v4 Q) L+ `( o# i; V/****************************************************************************/( b- R* t3 x! h
unsigned int ECAPRead(void)1 m8 c+ U! ]+ t8 _
{! L, Y) p3 F3 ]; S9 Y+ X/ d- ^
        unsigned int capvalue;
) `" I6 L2 F6 N% V7 L3 T/ u. v        unsigned long frequency;( b4 V7 L1 t6 }& O% T& C; t* [$ n

: T" G6 q2 y# k. t* p        // Event1 中断标志
( K" l8 q& c: O2 E  U: J' W9 X" ?        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))2 Q* P" c, G4 @. T- B( B: Z+ s
        {# x, |/ f; Y3 Y4 k% S8 ?) D; a
                // 取得捕获计数( M/ C6 U  r6 y1 x$ a
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);4 w5 Q) U1 S4 Q9 \# G. L" j7 z
                capvalue = ECAPResult.cap1;) s8 Q" l: b3 q; ?3 n5 ^

$ X4 c  z% r2 ^$ O$ c+ S; |1 z                // CAPTRUE 模块 228M 时钟主频
& r. A# j) j! I; ?  u9 i, H. G                frequency  =  228000000/capvalue;/ E; b$ Y) l4 I# h8 f8 M
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);. W7 E4 ^# N  v

) u) H. P  X% Q                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);3 H1 y: J5 |" D; C+ m; R5 [
//                IntEventClear(SYS_INT_ECAP2);
# j8 X  L4 W+ z0 a1 Z- M0 M7 B        }( j+ H" u- v. j8 R! |% M& G9 m
        return frequency;( Q! _; n+ }* x- b. Z1 }
}0 L5 e5 ~( {# Y: \

作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
) O5 p- [9 }# ?! M; m8 j* w% C[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