嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
1 x; k, l. U5 G- K4 T, p
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/& @, m' }. N1 t
/*                                                                          */$ I2 I, i; c: {% b4 b% j
/*              宏定义                                                      */6 k4 o8 r# K2 [
/*                                                                          */
% ?3 Z. _: w" ~5 E7 I9 Z% r/****************************************************************************/6 z& c$ X6 u: i3 P
// 软件断点/ y: _4 F3 K9 N; A- [; C* Q
#define SW_BREAKPOINT     asm(" SWBP 0 ");
9 z9 ?' r8 v# C* f& j3 F- M3 [* y5 s7 ?2 ]; M) h- V. H0 S
// 时钟分频! \$ y  i. o6 y* o3 y
#define CLOCK_DIV_VAL     228
1 {- h5 c) q% j' v: E1 f4 p
% O. t3 p9 k/ V9 k/****************************************************************************/
$ d" g1 z7 q3 ^0 A7 R" V5 S. M/*                                                                          */1 t, E6 J& e7 A) Q2 R5 Z' y
/*              全局变量                                                    */
) m! |; [* E7 M7 j5 |9 B, o6 H/*                                                                          */. `. d- U, h/ I; t
/****************************************************************************/
8 e* Z. f' e0 E7 F# ]- `$ kECAPCONTEXT ECAPResult;. v  o- ^$ o( Y3 L
1 j3 q, @- ]3 R3 w- W" O
/****************************************************************************/1 K8 m3 r9 }: Y
/*                                                                          */1 n, Y0 @' H9 _# f5 z6 J
/*              函数声明                                                    */
5 M+ Q. P) e! E' u  z/ J/ W$ l* }0 n/*                                                                          */
% e7 C* d6 x3 ^9 _) S4 r2 \' h  B/****************************************************************************/! R- T6 s; h7 L) W- z) I
// 外设使能配置
( l3 v1 i$ W4 Tvoid PSCInit(void);
: _. Y6 L. l( p$ ~; ^$ j, v
: {- V% _1 K+ k. K// GPIO 管脚复用配置0 _) O; T# }2 g9 k
void GPIOBankPinMuxSet();
) F( Z, Z& g) v: x; K, H; m9 X( M. t7 {
// 产生波形2 o. j0 a8 P$ u+ N& u
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
: {) l  V3 |. H" A6 I: g' Lvoid ChopperWaveform(void);) m5 G4 r5 k" o3 W
/ K% z2 r4 w  c. ]3 e, k
// ECAP初始化和读函数$ w: O1 |: ]* }
void ECAPInit(void);
$ `0 _; ?( S$ X- w4 Dunsigned int ECAPRead(void);: W  J- c. A2 p! _
- R* o) f8 t5 a& N+ I
//ARM 中断初始化* ^1 n$ k0 ]8 ]
void InterruptInit(void);
7 r& P$ z4 K3 [8 n; m
8 [" ?- u) V* n- v5 v// PWM 中断初始化" z. ^  j; F% b. G: g8 S5 c+ I) m
void PWMInterruptInit(void);* C0 J* F; m6 b& b
// 中断服务函数' y" b* z, w! a3 X  M8 a0 n$ ?
// PWM 事件1 M3 D: S' V/ K6 t; I
void PWMEventIsr(void);
' g3 {$ }+ {3 q// PWM 错误控制事件
+ C9 ^; }3 F' B$ ~+ r4 J" u: }$ Qvoid PWMTZIsr(void);
% a& q8 c9 E( M" C* @9 f0 }" |& \6 m- u8 N8 f6 G7 j
/****************************************************************************/
( a! @* Y; J. F6 ~6 n& M0 e! O/*                                                                          */
* i+ ?" ?# M+ T% D, w/*              主函数                                                      */, ]$ Y$ A9 e& q' P/ t& G; w
/*                                                                          */2 B' p" k9 }& k) V* l! R
/****************************************************************************/
6 w) H! T6 z1 V( t* y' f9 cint main(void)
5 U& @+ p) A& e{
% r1 b4 f5 G0 i0 d) H- w        // 外设使能配置
, H6 R( z  z+ O* t' @' X. q        PSCInit();
3 H" _+ S+ `% @# V! L0 W$ I7 G& m& @6 a
        // 初始化串口终端 使用串口2
; }+ g; \" j# o1 a7 Q3 F        UARTStdioInit();
: D3 E0 z8 V1 v) y7 [       
5 T# F2 U( K4 t4 F7 p% c        // GPIO 管脚复用配置
1 B: {- z; }! U1 c: y( t        GPIOBankPinMuxSet();- [& [6 i7 d* S5 S" z

/ ?1 R3 H7 s. E4 |        // ARM 中断初始化2 u1 I; E4 d$ g
        InterruptInit();
3 e* g4 Y# X7 C1 F; s
  z) `6 V" Q! z& g) z# H6 l        // PWM 中断初始化0 Z. r5 j6 U2 q. d
        PWMInterruptInit();
7 G+ j. d/ m1 k! t, i+ A! E6 f4 N- u1 r
        unsigned char i;
0 A/ r. B7 G- u3 C5 `4 J* q* a        unsigned int j;4 A  E3 S7 M) m; z: S

: h1 Y" |1 C% Z5 p        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
  _+ G6 G2 ~/ Q1 z        UARTPuts("------------------------------------------------------------\r\n", -1);
# z% l0 L3 a+ E/ B& a        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);- s; ]' o3 x6 P
        // 产生波形) g; b( _( a1 c& _8 V; ~! u
        PWM1ABasic(25000,50);
/ g! a; b/ u! J7 G# F  M& \& I4 b8 q- K7 `, ^
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);5 k% h7 R) @8 v  W
        UARTPuts("------------------------------------------------------------\r\n", -1);
- N5 P" R( m/ h8 D5 ]1 _# ?! I- I: o) z; E1 q$ q$ R

5 \3 R; o7 K; ?% \+ U. B& }
3 X. Q) z1 q/ s( I        UARTPuts("------------------------------------------------------------\r\n", -1);# E& }% u2 i$ k4 p
        UARTPuts("                    C6748 ECAP Test\r\n", -1);5 \4 P3 y: p: e' f; {
        // ECAP 捕获初始化7 W+ \/ b# ^& s) }* ]
        ECAPInit();
( x! b5 P- P9 v/ g4 \7 o        UARTPuts("Initialize ECAP.......\r\n",-1);, C2 |/ J4 i* q
        for(i=0;i<5;i++)1 b: |4 ^' c( P, P& w7 q) r
        {/ a+ E4 F& t/ {! [
                    for(j=0x00FFFFFF;j>0;j--);            // 延时6 u' U. J; K3 R+ l8 }- t
                    ECAPRead();
: z$ n. X+ w5 g# e/ k2 h* E        }
4 X9 N" H% x( S4 ], E- Q4 ^; B        UARTPuts("\r\n",-1);6 R1 v3 b: C) w, g
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);' w' x* D! R5 W( i: n" E2 W) @
        UARTPuts("------------------------------------------------------------\r\n", -1);) d- t# G7 j8 _, f) B# v. d6 e
' p6 g& C- v5 Y4 \
        // 主循环
5 J+ w  X' R& J/ m/ v2 U- p        for(;;)4 m9 b6 o1 q+ x* f+ f8 A2 }
        {0 l+ ~2 F( ?( j( L: m# P# o
+ |5 y% o. q- a& b$ i
        }
# X% N0 g; h' `- o+ M* f$ @8 c}
  @5 i7 o( q- z9 |; T, e2 a
0 M  t" q* L( |; g1 E0 E/****************************************************************************/1 i# R8 ^3 b8 b2 _, X: C) ^
/*                                                                          */! R: q3 W' l2 w4 S( O' `6 k8 H7 O
/*              PSC 初始化                                                  */
% I8 w* V6 C: E1 B& ^. C/ U% L. w8 k/*                                                                          */
; P2 F( Q7 `& W7 A9 L/ B4 u0 i/****************************************************************************/
" W8 b' x) A! J9 B" Avoid PSCInit(void)
- S, e4 V/ ~5 Y" R3 ^{" J1 E# ~% p& J& e) o6 X
        // 使能  EHRPWM 和 ECAP 模块
7 U8 G; }! |. E  t# C+ H( h, d        // 对相应外设模块的使能也可以在 BootLoader 中完成2 P. R0 n) O/ g4 ?& a0 e3 s
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);" V. h) W7 @1 g/ X
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
$ i& X8 O$ k+ g8 G6 l, ^7 {}! v; H- \" T0 n% \0 O

( J: Q4 G2 d1 w2 Z4 p+ \' f/ u/****************************************************************************// }4 @  O; C8 g
/*                                                                          */
( i7 |) [- C7 q- V/*              GPIO 管脚复用配置                                           */
" G0 k/ [' I. U/*                                                                          */  @+ T% z3 g' G; M+ E$ I: _" N* a
/****************************************************************************/
2 k" V9 g8 s  T' N3 c, z3 o0 svoid GPIOBankPinMuxSet(void)
+ K- c% t( j1 V% _  `( C0 J{
. \1 }, V; F: I  A        EHRPWM1PinMuxSetup();
" [* }2 \4 i: a  N/ i
6 m+ Q, Z% E1 T        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
' e( Q4 J0 G# D, Z; `4 {        // 作为捕获功能时管脚方向为输入' {* d9 h2 m' D& C! L" _- ~  K" j
        // 作为辅助脉宽调制时管脚方向为输出
0 S7 C1 w8 H! j! \; N+ |) ]    // ECAP2 / APWM2
- T* Z1 |* a3 y, K, |; k        ECAPPinMuxSetup(2);
3 t& U  C; p% s7 T4 y1 r: V& e8 n% n: M) H2 b' h
        // ECAP2 / APWM2方向设置为输入
/ D; E2 A  V. B% P) j" h6 k        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
" R3 N% q# [' r, t$ a" d}
9 X* Z' F% D7 s/ w7 }( K( m* r! I1 z5 C
/****************************************************************************/8 ?' L: {8 A6 B9 v8 n: j( ?$ C# w
/*                                                                          */$ Z  r6 p! ~" c7 f
/*              PWM 输出波形                                                */  g' I/ s; J4 C1 z4 _
/*                                                                          */( f, q* S4 l) j2 _$ k
/****************************************************************************/
! p7 A# s2 d$ A- nvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
9 C5 Y5 s0 {( |{, }2 ~3 r4 _" a- U6 H* u0 a% ]" z
    // 时间基准配置* D! [. a  z( g0 g
    // 时钟配置
6 M; w" m* H& t; m3 d1 D7 l3 z    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
6 r6 T" \' e7 R) v5 D7 ]+ @  Z+ v! T5 e. s! P" p
    // 配置周期
* P0 l, I: b4 g1 j+ E  Z8 N    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
  A: J- v3 t9 `, u                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);- t* M+ {; S% r: d: \1 H0 A
. c, W2 s* O8 k* h/ A4 f
    // 禁用输入同步信号
3 V6 p* k! n. U/ J, a    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
8 I0 P# P& d* v; ?$ M1 E' s: x- z) u0 [+ L
    // 禁用输出同步信号% j0 U0 D5 D0 s0 E9 K7 ~. ]" S1 }
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
; x3 h' H' s+ ~# v4 u
8 O4 e& R8 L* N+ m    // 仿真(DEBUG)模式行为配置5 D4 G8 F) v9 V
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);" O' J8 @" L0 b' B% O5 c$ S5 `

6 R* T, K7 ~( s/ I    // 配置计数比较器子模块  z+ ]  d; Q( ]" [* p! C" @6 a
    // 加载比较器 A 值$ @: q; \+ a5 g2 w
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,; c6 j: I# \8 t! A8 `; V# U
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);9 B: z3 L' [3 }1 R2 S8 d

  j5 m% Q8 ^2 H& x    // 加载比较器 B 值% M( N( H7 i/ C  I% K
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,3 s# m) t' S6 _2 b- ]6 c
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
6 S; a! f1 T) j  U: h. X6 N9 Q' V9 z) l0 n* I" Q7 L" d# v1 R$ e6 z
    // 功能限定配置(输出引脚触发方式设定)
: `6 ^" d; R& j7 }% Z+ w+ ~; ^7 P    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
' E" f7 u8 e% i% k- Y& E9 B    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,% j* y$ G# M& V9 S
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,7 t, T' G, d7 O6 h9 t! Z1 Z/ F9 ^" ~
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);0 O% V! T: c0 y, a0 x$ j

3 n0 o2 S" M6 m( U( m& Q# O    // 禁用(旁路,信号直接输出到斩波子模块)死区模块! H9 e3 n$ U! L' U7 e6 x. F
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
  }0 t( o4 {" T/ Y8 j$ A& [7 G- F( |- S( N. Q% g: f6 y
    // 禁用斩波子模块
5 k* z" p8 _4 f0 V, d! F$ @    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);/ A  x3 `+ y) S" Q
; C3 z) x9 `& _
    // 禁用错误控制事件
' p- Z! r3 S9 T/ x" u5 Q: t    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
  u9 ^( n0 D) E/ Y    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);, v1 R6 v6 s! G% K1 b
+ n7 B6 a/ w$ m' g) Y5 F1 E
    // 事件触发配置
! J2 }* k1 a& a$ y0 f* a6 O  q    // 每三次事件发生产生中断
! h1 a; m, _) Z6 H# Y    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);5 ^, D5 m- U  U# X2 r. i
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件* m6 y& A! U7 @$ o0 F3 j
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
$ a! v# m, L* I7 [    // 使能中断
8 b/ P4 e& @3 M1 p1 S; M    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);% I8 G9 d% k3 N" J

& ^$ L* ~* \; L  _6 j    // 禁用高精度子模块
  @  ]9 w* V/ U    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);' ]" x# @; ?4 [/ s8 X% C  i

+ P0 y4 d4 O  k* Z0 l! Q    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
- G/ w4 Y4 C7 Z( q6 D( n}
" d& E1 H; `( C
2 O: t* F& r/ m' Yvoid ChopperWaveform(void)
. T" a( n' [# D) U{
* S8 _' X( B/ t% E% N    // 50% 占空比+ D3 X. C7 q) M5 V* D! `! w" f
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);: _/ m/ u7 e9 V1 t' l* u8 X: i
    // 4 分频+ }* F) D' Y6 }& U2 O* k& ?6 n
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
1 k; G- [6 H6 V6 H    // 单个脉冲宽度/ ]$ A0 z- E- i# U7 y. ]. p8 s- W( S/ C
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);6 x1 a/ M8 h1 @) y& t- R- \5 f
    // 使能斩波子模块& z7 \1 ]& F& L( v
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
& o; J$ O" W5 y% Y) D: ^' Q}
7 O' X" e3 v" W+ F* N2 w
2 @" ]: ]+ P) ~& T/****************************************************************************/
2 D8 O0 V7 ?  d7 ?/*                                                                          *// T: H2 ?) y" _# s2 b8 ~' _, Z
/*              PWM 中断初始化                                              */
3 b  H  X0 r  a/*                                                                          */
% i/ j+ s0 p6 E$ `; ~1 T  {0 _/****************************************************************************/
( W) I9 J* Y' U. t1 rvoid PWMInterruptInit(void)
' y$ O% ~0 r& i+ Q{2 x4 S3 p1 e2 x& i; f9 P
        // 注册中断服务函数
3 B/ ^- {- y- d7 z2 k" D5 ?        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);4 H7 Y' u, n; ~! E# ~
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
  Y. Z. H. a6 S# a' j/ J3 u; T4 e/ ~3 i4 V  Y
        // 映射中断
3 `, k6 D" }% v3 e4 X        IntChannelSet(SYS_INT_EHRPWM1, 2);* @8 Y6 [7 P# S
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);6 n' o! ^! G6 _6 w
9 ~/ h0 t! F# z! d) ?" \" x, X
        // 使能中断' u/ t- D: O6 J
        IntSystemEnable(SYS_INT_EHRPWM1);
* h, D6 l& i0 V$ J        IntSystemEnable(SYS_INT_EHRPWM1TZ);3 L% y8 k8 \) j1 ~
}
0 Q( X: ^: z$ S: u$ C6 C) {* \9 ^. B) U7 u# l
/****************************************************************************/
( ]# t" A- l1 F; A/*                                                                          */" k! E* k' H- D( p3 u" ?, E1 A4 d
/*              ARM 中断初始化                                              */1 ?0 `2 d& I# y) b* a
/*                                                                          */6 ~2 U  l% A, h' V
/****************************************************************************/
% i* h; T' P7 bvoid InterruptInit(void)6 w* W% f* V7 y3 c0 y1 E
{, T6 G+ {2 }) }% V  u$ l. T
        // 初始化 ARM 中断控制器0 @5 _( H8 L' l$ A6 |7 l3 H: Y
        IntAINTCInit();
" _/ ~( N0 g1 S) a( Q
+ k4 O4 i3 Y1 A$ q& I9 z        // 使能 IRQ(CPSR)5 K  q. ?; G( ^/ S# `. Y( q( U
        IntMasterIRQEnable();
% y1 ~  v( f3 X$ \' I5 Q7 E/ n
. Q+ d5 Z' L6 ^) l: h  ?9 c" }        // 使能中断(AINTC GER)
6 ~, G$ j0 c& e( O" {1 P        IntGlobalEnable();
; f- ^- o& g: L, x/ ?$ l/ j( Y& V; H% F5 n# |( r
        // 使能中断(AINTC HIER)
% s) O- ]$ i2 g5 o  Z4 H        IntIRQEnable();6 }2 @1 {" Q2 y/ M, h( Y: D
}
' n8 r. c/ \+ ~
# y5 U  C, M5 i: U; ~+ j& n/ }  X+ b
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/. p( ?0 X0 a) U7 v
/*                                                                          */2 ]1 X" M; @7 D" O. W
/*              中断服务函数                                                */4 d' j/ z& t! `0 a; C
/*                                                                          */) Y& T4 w3 o7 i! }: p* W" N
/****************************************************************************/
2 R0 `3 T* W0 Tvoid PWMEventIsr(void)
) t+ O/ t8 F: F, m7 ~{
% J4 [. R+ s! m* c        IntSystemStatusClear(SYS_INT_EHRPWM1);* H) E! g# a  A  j8 B0 p+ g7 q0 g

' [; W1 \. V( W: e$ w    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);8 M' G8 l9 j6 m7 G: u# V3 ?2 Z" W
}
- x0 v0 d0 ]: t* p* y5 J& D
9 Q% t( g& s1 l' V4 O! o4 n- ~void PWMTZIsr(void)
- z4 h  f' R- S1 N{
8 z+ w' v. D- V( `        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
7 v# O6 F7 ?* S: e  R0 i1 v; S' S/ D& B; @. ]2 b9 C) c( V
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);9 j- K, v1 V9 w
}
+ P2 _  \0 Q6 ?( E
% j. k, r# k9 E# V* }2 \  S/****************************************************************************/
- [: k; E% }$ [+ P) ^7 X/*                                                                          */
9 X* n" N6 o/ W+ O  N/*              初始化捕获模块                                              */  C7 X6 ]$ N  c( _9 v' \
/*                                                                          */
( i0 \: X  |* C1 n! S1 O+ K/****************************************************************************/
$ ?$ a# F2 @9 @. s* e) [void ECAPInit(void)
5 g& u8 S) c/ D# ]7 K{% z! o! X$ I9 _6 L
        /*-----设置 ECCTL1-----*/
7 [1 J, E7 B5 C( F        // 使能CAP寄存器装载  E8 L1 c1 e7 M2 P( H5 u5 W( y
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
3 G' Y4 D9 L3 w$ I& F        // 设置预分频值.4 D- P* M0 |" }) Z% F9 [. W% a) a7 V
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);# f( X& J# H" m9 A# f( t. l; J
        // 上升沿触发捕获事件
$ ]) C" X; g  `9 e1 p7 x        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);9 M- |1 L" i. _( z+ i
        // 输入捕获后重新装载计数器值.' f$ k7 r& i' }' t: Q
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);: E7 f& L& t0 [
( P3 P# r9 i; h
        /*-----设置 ECCTL2-----*/
  o0 r( Q$ {1 E  w( Q1 |' q        // 连续模式* ~9 o4 J3 w, j6 g7 C3 \- I7 n
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);! W* w# s6 l* b! @
        // ECAP计数器TSCTR持续计数7 e) y0 K5 Z8 Z# y  @! u
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);) J6 Y9 k8 f) B7 T% _- Y/ a6 W
        // 禁用同步输出和同步输入+ M* i2 u. n" A* x/ @0 I1 T
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);2 T9 r# J& f! X4 c3 w
        // 配置 ECAP 2 为 CAPTURE 模式
& g: l6 ~9 C2 t" c5 Y  Y" v        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
3 Q$ V- V) c4 [0 e" v
3 A+ M# Z7 ?; S        // 使能中断  ~2 _/ d/ ^: e2 G0 [
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
0 C  W7 g5 U/ m) ]6 J) O; C0 _% c5 V; ?}" H3 ^0 a9 T5 T1 a3 ~
$ j9 K) o4 Y7 J8 c
/****************************************************************************/, {* Z! B! H% A8 O' g
/*                                                                          */
# t: r( \5 O$ C  l0 q& V* G/*              取得捕获结果                                                */
1 W3 N( t7 T! G+ }- I4 z: Y/ B/*                                                                          */7 I  s9 f; N5 i# s% D
/****************************************************************************/
4 F) q3 }9 e. D6 y" h4 @unsigned int ECAPRead(void)' m' U: h" j. f, b" h9 [
{
, U5 a2 x5 s) c' b; B' J) a9 m/ a        unsigned int capvalue;
6 s, ^1 [* }+ `        unsigned long frequency;; s; U, Q! x. T' B$ W( q% D5 h
0 R# k, b9 s: r9 U
        // Event1 中断标志2 z/ f3 }7 H9 Z1 F
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
4 p, o+ v! T0 f9 h! T# h  w1 @        {
& G  b9 [3 V. X) d                // 取得捕获计数
. j1 ^, p5 ~% r6 y4 f                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
+ |% }. V  Q# w- f0 e                capvalue = ECAPResult.cap1;
5 a* _3 P0 g: |1 i" g6 d( g* [: Y4 v* j8 E  [0 Q
                // CAPTRUE 模块 228M 时钟主频' F, {! L/ d; l5 k* [, G* ], H( Q
                frequency  =  228000000/capvalue;
- [( E# j, j, D: y0 S                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
5 @8 L/ ^8 N, w! n/ y8 I# q, X( H& O! R( ~% L/ G/ Q
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);$ F: L' y+ q4 C6 D
//                IntEventClear(SYS_INT_ECAP2);
) W% W  S8 t# x, R) e8 i: c        }
6 A. k6 H( B) T+ X0 r: J        return frequency;
6 Y$ n9 t- ]4 w. ]# |}0 K9 m, ?7 a' J: T& Y# Z

作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。1 }$ D! y. S9 ^  [. d4 z  s
[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