嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
* Q4 H" Z  I* }( c9 k5 j4 }% L
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/  z2 J! A) e' r
/*                                                                          */( L9 q) y0 R3 Y+ ]% b! s' i- C# D
/*              宏定义                                                      */9 P' Q. G" Y  G5 y
/*                                                                          */) h5 v/ R3 n' [4 E: u. @# D, v
/****************************************************************************/" ?8 i7 e, r# Q2 |0 u' b* R" a/ K( G" g
// 软件断点
0 f8 p5 m' w! F7 d#define SW_BREAKPOINT     asm(" SWBP 0 ");. e: q+ E4 X6 `. F+ [7 O7 V: p
; ~& h3 x0 f6 V; N- B
// 时钟分频& I9 e) ^- c7 h0 B( d3 o
#define CLOCK_DIV_VAL     228
' S, i: j5 o9 }( t+ X( D. p/ m6 W
/****************************************************************************/6 g4 Q2 }6 K1 F3 c8 }5 E
/*                                                                          */
: b3 r- V. u3 _* Y5 b/*              全局变量                                                    */1 J" |2 B- ]  x% I* c: S
/*                                                                          */
; m% S$ S: Q4 P' L1 ~/****************************************************************************/
5 s9 H$ L* z) gECAPCONTEXT ECAPResult;2 S, n6 g/ P0 `1 {
! L/ ?) E( D! O' n( u% ^# j
/****************************************************************************/. V% ]. C) S3 `
/*                                                                          */$ g1 M5 C0 o9 n" B% V5 S" q
/*              函数声明                                                    */5 j, ?. x! ~% k5 K/ B/ s
/*                                                                          */) ~! P  N5 D& N  C  I5 M: D( r
/****************************************************************************/
' x7 ?) ]% K  U// 外设使能配置3 H* _9 F: m; ]2 L# T
void PSCInit(void);
5 @7 E6 A: n0 w$ j3 g0 G
+ _4 j& x2 s5 W$ c  p# [9 w// GPIO 管脚复用配置
2 S3 r0 \- k' o6 v3 Nvoid GPIOBankPinMuxSet();
& S) h6 F3 m2 s8 f+ C! Y6 E
  j) i, Q0 \: P& A; }. w: [& z// 产生波形$ p- E4 A0 [3 d' [/ v5 o3 F
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);: w7 G3 C* @9 @1 C* W
void ChopperWaveform(void);6 \8 Y$ u0 w+ @2 g+ L

" g) d/ N/ g* [. J9 Y// ECAP初始化和读函数" X3 Q; \, o+ J! X  f0 l. D' @
void ECAPInit(void);8 F* n# N( H, Y* v. z
unsigned int ECAPRead(void);* q9 F# o  I. n, z$ p& o
) q- _: J& |% C% O$ F, o) E3 A
//ARM 中断初始化
/ G$ X0 K. h) E) X6 nvoid InterruptInit(void);  b. g) p5 e1 N$ ^$ n' V

1 O! {% e. U7 k// PWM 中断初始化
/ o0 h1 L# x( z, b  m! avoid PWMInterruptInit(void);
& P4 \7 |/ h7 M" t. o7 C, s// 中断服务函数+ p. W  L8 `2 f! s/ M8 Q
// PWM 事件1 T! Y) c0 J; T
void PWMEventIsr(void);
) f. @! C0 v4 [3 D$ G' A// PWM 错误控制事件6 m' l* U. B) |7 ?, q9 D
void PWMTZIsr(void);
1 @7 ~4 f$ g+ N5 z# \* `5 k2 H' F. m3 ~
/****************************************************************************/$ {8 o; r$ R, X
/*                                                                          */* X8 `2 ]  e% J, h- l
/*              主函数                                                      *// M1 o7 I" u* B5 ?% @
/*                                                                          */
& C# N/ y0 Y, G+ g, s/****************************************************************************/
1 I+ O( O( q# O* }; s4 Wint main(void)7 H( ~, `2 m6 u+ d" E7 k1 K
{
( {4 j9 c! c' o* W7 G4 Y        // 外设使能配置
" M1 v; N, N. P6 S        PSCInit();- j* [' s; E+ N; F. J, Y2 h6 }9 W
9 h# {! s+ z7 e  F; ?/ _
        // 初始化串口终端 使用串口2$ E4 J& s2 Z! z8 X6 r/ ?
        UARTStdioInit();" e* P, ]" b6 ]
          {$ |' Q0 A& s0 k/ j/ J
        // GPIO 管脚复用配置8 A. M: V; @) j: X
        GPIOBankPinMuxSet();
$ \& ]' l' {- z/ Y
/ m% @: k1 y5 j2 L( ?        // ARM 中断初始化
( b, Z; `. f( s: n        InterruptInit();5 O) Q5 Y% R' I) ~8 {
& @9 |* \" e( Z
        // PWM 中断初始化
- N# \. A3 H( N8 A        PWMInterruptInit();
( s6 w  ?7 u& x4 s1 v0 f
. R2 K5 F6 |- H( k7 d        unsigned char i;5 M: U$ D  r* f& d
        unsigned int j;: u1 N6 R: T8 d3 s

; |: J) n2 u; X        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
" u6 I$ ?8 r% A9 a4 u        UARTPuts("------------------------------------------------------------\r\n", -1);& S; R# O& h$ d
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
1 r" `$ p+ b7 X$ x9 ?        // 产生波形$ }2 s: U$ u, j5 z' `0 I0 ?* G
        PWM1ABasic(25000,50);5 m  R- ^' z: w4 l, k& E
2 ?9 \% Q+ Z+ K2 O+ r
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);" M& i" m* T  {' ?/ z! q: U
        UARTPuts("------------------------------------------------------------\r\n", -1);
. g0 ]4 I  h- U* }. B; t: k" I( z# t) \: T  Y/ Q

0 z* P- v% [4 ^6 C. I  U& K( F# t- b; T: N7 Z" T% B
        UARTPuts("------------------------------------------------------------\r\n", -1);5 f. Q/ A0 a* C$ Z/ l
        UARTPuts("                    C6748 ECAP Test\r\n", -1);+ h# X1 M! Z9 u- {% I5 t
        // ECAP 捕获初始化7 D, P) r" [2 R
        ECAPInit();
: C/ a2 t, E- X; \! J, c+ F) e$ z9 m1 q5 D        UARTPuts("Initialize ECAP.......\r\n",-1);: q9 d! g/ b5 ?$ o, v* x
        for(i=0;i<5;i++)+ i9 }2 q) i' G/ w2 w  U
        {
+ k' T2 g7 N. K                    for(j=0x00FFFFFF;j>0;j--);            // 延时
, e) N. I4 Y4 N! v                    ECAPRead();7 [8 a' B5 C7 g  H( Y  _) i4 Y9 K
        }
6 d0 ^6 ?0 D1 |- y3 F$ `" o        UARTPuts("\r\n",-1);9 ?: Y9 q% s# H' d# J/ C! I+ I
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
% \8 q/ q% G1 _        UARTPuts("------------------------------------------------------------\r\n", -1);
/ b# M1 C; L5 h
$ U# M( `$ u* B5 A3 J! T' i        // 主循环
- e; V7 d4 x+ ?& C' B7 b, q        for(;;)4 o' t7 \+ s- o6 l& X
        {
- b7 z* U" P9 ~+ E2 I
' R1 B$ M# R" ]/ C        }
1 H8 Y7 i5 Z# c" {4 J}
2 U# D, Z) l! B! R  K/ g) ]2 }, X: P6 k- A
/****************************************************************************/
7 {1 X" L8 O& U! G% I! o, `; |/*                                                                          */! P1 w+ d. c& A
/*              PSC 初始化                                                  */* ~  H9 o% q$ P; V2 Y/ @' x; l8 L; w! d
/*                                                                          */
  |, ?( q4 y. D/****************************************************************************/% D+ M6 Y  M/ u* s8 s2 l7 D; `
void PSCInit(void)
& n6 m0 a' Q8 Q( i{3 t) ]5 [) g9 w8 [3 n
        // 使能  EHRPWM 和 ECAP 模块
8 _$ t# v) N3 v/ R        // 对相应外设模块的使能也可以在 BootLoader 中完成
' i7 v0 }; e1 \% j8 W& g    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);. P$ S$ @( J4 R: t0 g9 t
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
" |: Z$ @9 Y) B4 F}, Y$ e& Y( |7 q3 u& a4 ~+ T

: u8 u, ^( r' E/****************************************************************************/# W$ E1 f! ~# ?6 W
/*                                                                          */# `5 E; h" b# f0 j; p$ Q# `  o! N3 h
/*              GPIO 管脚复用配置                                           */: L5 t" l) b1 o& W$ U$ b
/*                                                                          */. K3 Q: T, e0 i7 u
/****************************************************************************/
' b' v2 }) m1 l0 y3 E/ H7 Xvoid GPIOBankPinMuxSet(void)
" Y& U5 ~& H; x' z5 V8 ?; K{2 x/ n/ `! |- `+ O, U( N2 @% E
        EHRPWM1PinMuxSetup();
7 B3 g# f: c3 Q1 l# A' N: c" d0 q$ z4 \  Z; q) ~
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
' K5 k$ f( \6 _8 s        // 作为捕获功能时管脚方向为输入$ p2 ?3 M+ u; ^& I
        // 作为辅助脉宽调制时管脚方向为输出4 ]  z4 }: @( Y& c7 O
    // ECAP2 / APWM2
* L) p& [5 ], `9 l7 I1 B* Y$ ^& h        ECAPPinMuxSetup(2);: D% _. ~: w: a4 e7 P

, {7 U4 E2 w1 F3 s- `; H        // ECAP2 / APWM2方向设置为输入& y8 {6 k  V8 A3 i- C
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
  G$ U4 K, O- X% E}
' `- H( j, o6 l" i. t, I# ]% F
/****************************************************************************/
; u/ E: T. {9 G5 B/*                                                                          */" V" f2 ?, m: i. B
/*              PWM 输出波形                                                */$ ?0 x( Y. h; _
/*                                                                          */7 {7 H, h' w% {# M1 s% O3 J
/****************************************************************************/5 l$ d, f  P, }% R9 V5 d
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
: J1 c+ X9 @1 [9 ?/ @3 ~- z{3 j/ q. l- G, G0 @
    // 时间基准配置. W! @3 J/ R1 Z( @5 r$ P' g
    // 时钟配置' W$ K( x* F1 T. z8 M4 ~5 H6 o
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
4 {. j4 G4 i) u6 j8 [
, e& o# T8 q, t6 y# s$ t    // 配置周期- A; S; N* |0 O: Y
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,0 q. |1 X* e' Z, e  Y
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);7 Y5 c  |# T7 p1 {" d

0 B8 m. I! b; z' ^    // 禁用输入同步信号/ E. B  D% A& R' M3 ~& O
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);9 R* P" C$ R$ c5 X* ]4 ?4 r( p
5 b1 [/ j- m( @; e2 t! o
    // 禁用输出同步信号- X. H2 W7 s( u2 K/ ?7 U. f
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
( f0 T/ K) T, S, ]6 C# j
' {+ k: p4 n9 D; F/ R" S    // 仿真(DEBUG)模式行为配置& a& H) L/ H8 w; z+ S( q
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);+ J  ^, I! I1 ^! k. R

* ~$ ?  `% X; R4 [- R    // 配置计数比较器子模块) q1 J0 F3 G! Q7 h. W1 a* M
    // 加载比较器 A 值- x/ \$ f  \6 F! \" E1 |5 l8 `& Z
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,; ?# o4 \6 _) e; H4 ^# D
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
1 W: l$ j" k4 l& ]; G& ~8 c
3 Y% u/ W1 E7 A9 V) n. j) C    // 加载比较器 B 值
) `5 `6 o4 ~3 J/ o  F    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,* ~  \* W' z& Q1 B+ O( k2 Z. d/ f8 z
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);: ^! B% Y: n* C

/ z/ ?/ T1 i2 K) Y8 X    // 功能限定配置(输出引脚触发方式设定)
$ i: W% L1 g, G: ^5 ]  [    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出3 l+ r( j; h4 ?
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,. C# k* g# |* x" w
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
3 Z0 S6 A5 n. M" h                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);& l! i7 r# ~& d( q8 g) X

7 S" C, b) Y) S7 F1 X, I- x& Q    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
2 e& @8 v+ y5 ?- c    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
! m& h- D  E$ u5 ]  N' J
6 T# h  j7 |: y7 i    // 禁用斩波子模块
9 j3 C1 r$ ]) K) H! {* D    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
6 ]; F: @/ C2 Y  n$ s( b/ N6 n* {. ?9 N. }& r2 x6 o+ n
    // 禁用错误控制事件
& f( g4 _; L5 D2 m) j    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
1 H1 {% \- o6 u5 S# p$ t) ~    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
% I/ U" |$ S& q
& |4 t! c+ Y# ]% T    // 事件触发配置
6 z! Y2 j3 u7 G$ P  f7 a    // 每三次事件发生产生中断; C  a$ }! A2 s3 c1 }
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);2 G0 s" H+ ~. I3 ^6 m# J
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
7 q* u: @& e1 g) E8 C    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
' x- a/ y, ^4 [; s    // 使能中断
+ B1 \' ]( n0 F4 B" M    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);5 q3 I4 Z& {! S8 d1 X# [9 @

8 s: }2 z' |0 H) T7 l) R9 R3 W    // 禁用高精度子模块8 |) V2 e: a7 Q. w% }) d9 i
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
+ k$ `8 e5 N* {1 [, z2 w' A' k7 d" R, k; R: d3 e3 k: W: C
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
  m/ N9 u3 I1 C}) P* }2 d$ t, I$ S; u  [

$ h( B7 x, t! a  l! X7 S( S, Lvoid ChopperWaveform(void)% p' Z+ g/ e4 H* b1 V* n) m
{
$ o1 l+ u$ [0 k/ P7 f' c    // 50% 占空比
# \, ]4 ~4 z! |" R1 Z! q8 V    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);0 {  j+ D1 y* a/ ^  D, [6 `
    // 4 分频
+ l3 X" b+ W7 v( U2 y7 V    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);- L$ r  {6 i2 a% J
    // 单个脉冲宽度0 S/ s, s$ a6 X7 X9 C  \. j
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
% U7 I, W; _$ a0 P4 V" h+ {    // 使能斩波子模块
0 o8 _9 f" t) U' c# U% g8 f    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
# u! ]1 j2 n! H2 J  r8 N}* c/ ~; x: E: T; w1 n
1 f! r! F4 P5 }* ~! C
/****************************************************************************/6 x" t, Q: X. o3 X% e% p* K
/*                                                                          */
/ P7 Y: o' Y6 [% u/*              PWM 中断初始化                                              */" _5 O  v0 Z/ A  K+ D3 a+ c* h
/*                                                                          */
4 |3 }& O4 k% @/ s/ U& p9 c/****************************************************************************/; S8 q; _  D! X* P( ?, F0 f
void PWMInterruptInit(void)
  i- |4 G: \5 ]$ ?% j$ _! M, p( c" s{7 T9 D* o: Z/ f$ y
        // 注册中断服务函数
8 S& ^; V9 Y1 u* O3 t        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
* z" @' I8 Z& r        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);6 L: ?0 ?: W- y7 ~3 P5 }( }
' ]' l) i0 W3 b& f( F7 r
        // 映射中断
$ @- K9 N" ?$ A1 d6 j' R        IntChannelSet(SYS_INT_EHRPWM1, 2);
( d2 E* J( [- C& Y/ Z2 ~        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
" m; L3 r. k* |- H5 |8 i- i, b1 u
- A3 j* x2 @6 L7 X        // 使能中断. E: C3 M+ t2 |. x0 D1 Q
        IntSystemEnable(SYS_INT_EHRPWM1);. x! z4 m6 u0 E* p
        IntSystemEnable(SYS_INT_EHRPWM1TZ);7 i* @; \2 d! x1 G1 _5 H
}8 @+ S8 e8 ~& D
6 V+ y' l7 ]$ Z7 W* L4 V( \
/****************************************************************************/+ c3 K$ p4 s# L: D% T
/*                                                                          */  U2 K! R! f3 w9 H7 p, U
/*              ARM 中断初始化                                              */% c6 B6 P- ]' D7 C1 u. `$ V
/*                                                                          */2 L1 Q# b/ e+ J2 s/ Q7 S
/****************************************************************************/6 Q! ~" L) W1 ~" l. L  E/ O* ~0 l
void InterruptInit(void)
0 X% j) E) j1 x' }{9 q/ W! G3 \$ R! g: E# a9 U7 I
        // 初始化 ARM 中断控制器( Z) S+ u. u; ]0 J$ y% |
        IntAINTCInit();
, B# F! `3 E) I, Z3 h; v$ E5 A2 F1 C( ~" J& w+ L( F
        // 使能 IRQ(CPSR)
& x, G2 |( m/ A6 n0 A- G+ a        IntMasterIRQEnable();
3 v# w6 k# Y: {2 l( W% m4 r, k" x  }3 o1 P7 P, c/ U' M. k
        // 使能中断(AINTC GER)! c& [" x; r/ u  N$ [* F' y5 a
        IntGlobalEnable();
0 J! c) b) Y1 d$ }& h/ ?. o- l5 t( c! s; n% `! e3 j! e! \! B
        // 使能中断(AINTC HIER)
; v) n* ?/ Y4 R- {+ U5 I: A        IntIRQEnable();
, U( n" b) Q* d7 F}
; W, e7 o% ^3 I! ^# E5 X& l4 a) \  \
! }( g  }1 z% N# S* i0 m2 H, d- [
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/  y+ S  o8 A! _& Q
/*                                                                          */
" \4 ], l: O+ O: D- D/*              中断服务函数                                                */
. R  k! r( ]: w3 w/*                                                                          */+ l3 T, R6 J( l: Y
/****************************************************************************/
3 o* t$ T6 r) m2 d) \4 n! _void PWMEventIsr(void)4 l6 g! Y3 ~/ M  b/ w
{1 |; w/ |" s# Z3 n& w" w% N9 C. Y
        IntSystemStatusClear(SYS_INT_EHRPWM1);
* Y0 h2 f  f# i5 X' a$ H, J  H# D8 A: G: ?7 C# }: @' K+ t5 z
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
, Q5 x3 D4 t+ n' p; s+ R}  y1 M( w/ M9 i3 \1 Z

* L. C- h. @( b5 Z3 Y) g7 w6 Rvoid PWMTZIsr(void)
0 Y6 F4 Q# C5 b9 O{
$ Q, e& c3 ]9 t        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);- p' ]) g9 ]! H; k* {# {/ [4 S+ S

/ U" |3 f! q% U4 H; `" v/ P    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);, G" I. @. x1 A, y
}
8 l0 [) a8 X; T5 G9 N+ V) o' m8 ~1 t
/****************************************************************************/
2 s# b! T, M' d2 P/*                                                                          */
# A3 `# p& D6 s8 g. b( s/*              初始化捕获模块                                              */
- l: M* T& K0 a6 x# f) D/*                                                                          */
) }! v) c8 N9 V/****************************************************************************/
  Q& U! e  n: ivoid ECAPInit(void)# I9 b- @8 Y* I3 G
{0 M  H% K& z" ~4 [# `# s9 _: W' _
        /*-----设置 ECCTL1-----*/
: V0 k  A! E% [8 ^- M$ u        // 使能CAP寄存器装载' C' u9 [# Y' b9 [! B3 D* i
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);5 u: _3 x% s: K% k8 e
        // 设置预分频值.
: F$ v* ?; ?1 v        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);0 G; n( L0 i+ F  Z
        // 上升沿触发捕获事件( ~/ o* w( A  g! a
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
/ S5 x8 f) s) B- k! F        // 输入捕获后重新装载计数器值.: s2 j% y( Q* L: e4 v8 F
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);. r5 t& C0 F6 O

3 c# h& G" V% q, F        /*-----设置 ECCTL2-----*/7 G5 A3 \- ?5 x
        // 连续模式
2 b: q& [- ^& j' J  i! V        ECAPContinousModeConfig(SOC_ECAP_2_REGS);/ X+ K6 p# C2 a( k8 O
        // ECAP计数器TSCTR持续计数2 r( \5 R8 L$ W& q
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);" d/ F$ E* T7 }. }% r- C* p
        // 禁用同步输出和同步输入
# K7 O! W$ X) C0 @  A        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);' O) W' M+ ~9 x
        // 配置 ECAP 2 为 CAPTURE 模式
, T% e! f5 n. q        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);3 ?) S) o, Y) f; e9 e

  l0 \# v3 B. k" y; [        // 使能中断1 ^2 f8 n0 m" ^9 c+ r0 ?* g
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
. D& G/ C9 w: A2 x- f: g}" S7 L" [8 R# m, d# d3 J/ j1 s
6 s1 E8 Y0 r. V
/****************************************************************************/9 {: Z8 A6 U7 U' S
/*                                                                          */
% W1 E. p/ \" Q& k% P/*              取得捕获结果                                                */  D) \! H% A, ~' I/ Q- F
/*                                                                          */
' X" C- B5 b6 L, }/****************************************************************************/
# ^+ b1 N! j1 E$ `unsigned int ECAPRead(void)
1 u3 [5 j1 D# K; Y- T) N{
0 u' ?. l* J# A' y9 v7 m        unsigned int capvalue;
4 [& u1 y/ [' ~! t) r        unsigned long frequency;
, R3 s6 \9 J# Y$ Y# v! X) e9 l7 g: z3 h: o
        // Event1 中断标志' z# `( _( Z  G0 M0 H8 o9 Z
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
/ |, U* A5 V7 L2 W# S        {  T  N2 H! X& |  o& I! g( ^+ G
                // 取得捕获计数7 L' F5 u; @  W9 Y1 I% \' D
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
5 R3 q, t0 k. w. q: g, q4 x! U                capvalue = ECAPResult.cap1;# A3 i& I: ?) c
8 ]. P  V+ {8 w6 a; c3 G7 e
                // CAPTRUE 模块 228M 时钟主频
& ]) Y: C, R* o1 z* k! C+ q* H                frequency  =  228000000/capvalue;
4 T% {# d# `  a- Q                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
" h$ h' _; A2 k- [: t" n. e, F0 w# x! x3 Q9 ]) m* m
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
0 F0 w0 S! l) a* R* d$ {& J//                IntEventClear(SYS_INT_ECAP2);; d3 G$ O1 h1 k. H4 X& w
        }& |# u( m% f0 W3 Y+ m: s- j
        return frequency;
' x$ G- \* |7 q5 q$ \}
/ ^' W. ], F% m+ `' b$ u
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
1 d2 V' D. w. H9 k[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