嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家% G9 d) j, w6 R2 _, L* W

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/# N& K* R) D0 `- N& l# C
/*                                                                          */% Z/ f- K; s4 {' b
/*              宏定义                                                      */
3 T) ^! s6 E2 c1 }+ H4 S: S/*                                                                          */- K8 v# n2 Q4 h4 t
/****************************************************************************/6 [# `! s$ @* ]5 ^0 @
// 软件断点
' h$ f3 z' F5 j# f0 f+ s#define SW_BREAKPOINT     asm(" SWBP 0 ");
: v# q" h8 U& n( G" u1 O
" H& ~2 E4 w8 N7 H6 F! @: J% X// 时钟分频
$ R; C0 m' _6 D  Y( Y- t#define CLOCK_DIV_VAL     228' i: ]. G4 t4 E2 X

0 }- a( Q  ]$ A, o/****************************************************************************/1 Y% V0 T- a/ ~% F; X# S
/*                                                                          */
4 B- R1 j( l9 q( k8 _: E" ~/*              全局变量                                                    */- Q, b  S; ?$ V5 O' Y- u9 U
/*                                                                          */
* {% c& R; |! A3 x( U3 R/****************************************************************************/
- g5 ~9 w( s' q4 J3 V  j- oECAPCONTEXT ECAPResult;
9 |- r* h! f* F2 w2 x) W* x
  V1 n/ {9 @7 f/****************************************************************************/
! o; p+ F1 V5 K  C  u5 o9 {- X( j/*                                                                          */7 [' n. P; W* ]5 Y- T) U, q  J
/*              函数声明                                                    */' R2 {$ m5 ?& j) d
/*                                                                          */
9 A7 \( U2 x& g  S/****************************************************************************/
5 ]$ i4 R% [0 L( @; N- K1 O2 z% C/ n// 外设使能配置- _, D. M1 ]9 x4 u/ W& ?
void PSCInit(void);. v7 D1 A/ ^7 G  @" ]- W/ X2 D( F: o

3 {1 }% P) e- Y. c// GPIO 管脚复用配置
7 }& a6 E6 n/ L) b' U9 c: ^void GPIOBankPinMuxSet();
. J0 r/ V0 \0 y2 r0 R
! o& F6 Z5 j& s% F" f// 产生波形
( D* r0 N! l6 X% e# ]) `* Dvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);, j& ]/ i5 k7 D
void ChopperWaveform(void);
, d* y; F( e- e; y
$ i3 q$ w; \- Q9 \; S' P) a; P3 N// ECAP初始化和读函数, m) W8 I$ |8 i/ D+ z) O9 `
void ECAPInit(void);2 a; l& }9 R! B/ G/ ]
unsigned int ECAPRead(void);4 P% m' g8 R% V2 `" B
: |& D# f! `. Z7 X6 {9 P
//ARM 中断初始化
0 s6 {5 O: ~2 h: ]% _- \void InterruptInit(void);
1 U# Y. t. P7 v; Z, y# _$ c* e% `# x, z1 ]5 v; z
// PWM 中断初始化
" M$ o% @6 n* }: z% ^' ^void PWMInterruptInit(void);# r$ s/ o4 j( A) D
// 中断服务函数. N& m% p% g, h9 M1 A
// PWM 事件9 \4 g$ C" w: G; y
void PWMEventIsr(void);7 d) \/ N, _7 h
// PWM 错误控制事件2 u4 R* S8 I. v9 ?- l0 W
void PWMTZIsr(void);
0 O2 e4 n8 v9 R2 z3 ^; D$ D
/ I# `9 D: z, `8 k. _/****************************************************************************/
1 D7 a& i9 ^8 l7 {2 d) R/*                                                                          */" L( ~2 L, s) b1 J
/*              主函数                                                      */
4 \: }8 ?4 T/ ]. t2 y/*                                                                          */( \5 j) V' l* |7 r$ h# a
/****************************************************************************/% @$ F1 t) w7 T% e; h
int main(void)0 `6 n% m9 y. O  @9 O
{& t( f/ D2 H7 X$ Y# ?
        // 外设使能配置& Z2 \$ [, m3 R2 o
        PSCInit();; V1 N) K2 k9 G$ r' T( f' d0 f; l
1 d1 T7 ~' C7 U3 D' S6 U
        // 初始化串口终端 使用串口2
# S  f2 ~- l0 I- e+ f6 X7 U. y        UARTStdioInit();
5 M! {& S: B* y* k8 y2 d       
; H( {* V) m/ ?% X: ~+ ~: P% I        // GPIO 管脚复用配置
) d. G1 y% M, {  L, r, a        GPIOBankPinMuxSet();
7 Q: s! {) ?" |) o* Z0 Z
* b% q1 O  z/ w) a; w; R* E' o        // ARM 中断初始化
$ F  [+ A+ w$ q        InterruptInit();
8 n  R$ f  l/ ~# X& ^" E# z8 p
4 s2 J6 Q* n( c  x5 i        // PWM 中断初始化6 [) |0 v  m' l* _( T$ `
        PWMInterruptInit();* W9 s( _8 ?7 G; N) Z" S" o

) V1 d  h8 ?! i# E  w% s. {% b& p        unsigned char i;' \! z. y: @3 ?0 b$ E
        unsigned int j;
% Q0 }0 s- i  I/ [9 k! z. U1 @! G0 v9 p6 o% o2 P' X
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
( p; @+ f0 x: g        UARTPuts("------------------------------------------------------------\r\n", -1);
* t( u7 w: i- R# w; T# `) k        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);! c7 [4 c0 [0 g0 t% g& _: J
        // 产生波形; g( Y4 X4 H9 L) c3 b( N
        PWM1ABasic(25000,50);6 Z3 M) [# w) N; E: Q3 i

4 E1 K! z- M" o        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);9 ^" j. ~- J- q) |( S7 w" ~
        UARTPuts("------------------------------------------------------------\r\n", -1);
$ K- y% I" P+ Y5 z6 D$ S( _1 ?  }0 i# c( Q" g% p+ ~* ~

: s% @5 D4 W' s) m8 F% G7 F
  A% c# p# u# L9 p4 ]3 i        UARTPuts("------------------------------------------------------------\r\n", -1);% R" l7 o: B  e! b5 V
        UARTPuts("                    C6748 ECAP Test\r\n", -1);
$ P: q; v5 u' N5 i9 }2 k        // ECAP 捕获初始化
$ t1 V! t. v2 L% i; _2 ^- i        ECAPInit();
4 b: ^* F% [5 V% z2 E        UARTPuts("Initialize ECAP.......\r\n",-1);
4 r" ]& H" E5 a/ j        for(i=0;i<5;i++)
+ b( h* K. d  k$ Q0 j        {
" a5 g7 T% q+ d2 D                    for(j=0x00FFFFFF;j>0;j--);            // 延时
( r# \$ Q. c6 E                    ECAPRead();4 p# E  E* J! u5 J0 i3 U, d1 s4 A
        }
1 n% ~6 y) E" C' l( h# t$ b, e2 o        UARTPuts("\r\n",-1);  e  i" X4 w! T# N, }2 v
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);$ a4 y6 w( M0 u2 l- G) N
        UARTPuts("------------------------------------------------------------\r\n", -1);4 T* t1 m# |: H" q/ y. O  d
- e5 M: q8 X' [. H
        // 主循环) d" R" T9 a) X& X' _
        for(;;)
( r, C( y7 D0 K& v! U, ~        {
1 B4 |* ^8 R/ }" c5 e0 u5 U2 g) J, b; d% Q0 k$ q
        }
2 d( V# u5 ]" d8 K* Q  D7 Q}
+ w+ s: k" y6 c6 j, S3 t3 E; t! {  P1 r8 ^) U
/****************************************************************************/. ?* R) f2 t" {5 S4 z
/*                                                                          */
8 C4 U; M+ u, Z) M; i& @/*              PSC 初始化                                                  */; L9 v$ P$ C+ r% J" [
/*                                                                          */% N/ @3 D- |; [* @( x6 Z
/****************************************************************************/
6 e; T; H0 o' ]$ j1 @$ Kvoid PSCInit(void)9 k7 O1 y: w" W- r9 M
{7 d/ \5 X+ B5 C, ~7 k' I+ i0 I
        // 使能  EHRPWM 和 ECAP 模块
& Z3 H. y  A7 Y        // 对相应外设模块的使能也可以在 BootLoader 中完成" Q/ \  F  [( N
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);9 R1 B3 o" c2 R# k1 P
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);4 i  C( X6 H& J% \4 X2 Q
}. \3 Y% E) {& ^7 t" ^

$ Q6 j5 O# w# I- ?+ c" F/****************************************************************************/( k! ?4 o% M- [! m
/*                                                                          */
: |! C( t( Q5 A( E' E* g: {/*              GPIO 管脚复用配置                                           */
$ }8 i6 G; o5 F5 v7 \7 B/*                                                                          */
& w5 z) D! B5 u5 ~/****************************************************************************/
3 V. S2 ]( i+ nvoid GPIOBankPinMuxSet(void)
. r  Y) C' J8 m( \( Y{
1 W7 y% `9 @( ?) f8 {1 @0 [& t        EHRPWM1PinMuxSetup();
# t6 u- f3 Q. q" F# M2 e4 I- p" ~! D
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)+ |3 f4 G4 q; y4 s$ Z, v
        // 作为捕获功能时管脚方向为输入( D) [4 b5 i2 w2 ?' [* D
        // 作为辅助脉宽调制时管脚方向为输出4 j2 ]. n! W; ~" j
    // ECAP2 / APWM2
+ k' Z$ s  X' K4 j6 o+ N        ECAPPinMuxSetup(2);1 j/ G' x2 N; B( h" K) Z

: x# S8 L0 k! k0 Z        // ECAP2 / APWM2方向设置为输入$ l8 v3 }% R) S  T$ n
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]* N8 e7 y+ M. m! I1 `6 U$ e
}0 B! m. C" E1 \1 d

5 q/ [1 L- _3 ~1 ?4 m/****************************************************************************/
( e8 ?7 D9 m% t- r  t- d6 D/*                                                                          */8 X5 p# p6 s) J; m+ j  |
/*              PWM 输出波形                                                */) f/ g8 Z$ Q. S6 F; g
/*                                                                          */
: E! d1 l* F6 m) o/****************************************************************************/( c8 I; G1 A* L6 X! Z$ b4 H. g
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)4 ~$ H! y6 h. K# M2 G) J9 Q
{
$ @  A, M( @* Q' m" S7 W6 ?% I    // 时间基准配置" U% D5 r5 K% q
    // 时钟配置
" r3 `8 x# x/ g/ R    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
& a, C- d1 f6 M; f: n1 [& ^& I8 ?* u- m/ P
    // 配置周期
7 u# z, f  w0 q, J0 c# b    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
  d/ q+ ]2 H" F! w% H) v5 c                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);6 `, g8 v- H: U7 h
' ^3 ?/ R# R4 l: ]1 O* @! f; L8 K" T
    // 禁用输入同步信号0 W$ ?7 j6 N4 [7 C' i- y
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);( N* g# f/ Q; e' V9 ~
4 F5 k- m* Z- ^' Y
    // 禁用输出同步信号* M. @" b$ ^: A  j. s
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);, A1 Z- A5 D+ f. k9 j% ^, L
/ c% x( T2 |9 K! u
    // 仿真(DEBUG)模式行为配置. q$ G# F+ d2 J3 c+ J6 ^
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
# w% P0 }) D3 T: i0 Q: l; ~- H( C/ C3 n5 e2 D& Q! j2 p4 o
    // 配置计数比较器子模块6 e2 \; I( Z) g8 o
    // 加载比较器 A 值
5 X* I' H2 ~9 U9 R5 U4 i/ \* m    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
) f% t' _9 d3 r: f  D5 ~                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
( x* F4 Y4 h5 q! f9 T% s+ X8 w8 J# d' ~/ n! B9 r
    // 加载比较器 B 值
$ O- P8 S7 P  `9 |' s3 D7 M    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,7 z( M* s/ i% }; `8 ], K2 m- D
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);& X  W- [/ y: l9 S# c  `/ ~

, f# |, U% Q9 I    // 功能限定配置(输出引脚触发方式设定)8 A+ R8 U% {0 ^5 d6 Z& Y; T
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
. ^' b- v( t5 z; w+ D' o/ ~    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
* @- W5 V2 S- ?, V                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
5 f: j" F% a1 _1 p" z                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);4 y2 T$ [3 j' i! Q4 I7 x, E4 ?1 ]' G

) v* U. M+ H2 C$ r    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
: D: s! q1 t6 U8 T; A    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);. V3 @! |- X% m' l6 ?: b5 U

- j* U% {/ Z$ I" h' x7 k. v$ |    // 禁用斩波子模块# I% K) n% C4 s( f8 D# O, }8 `
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);, F  I0 K( @/ q

: \1 C7 ~2 i: E    // 禁用错误控制事件
* E3 V. X" W" L( `8 T6 N    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);+ f' t( K  ^7 U3 H
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
0 `) H1 N. W; G9 x% N1 k, G
1 M1 m) Q0 X" ~# Y& h    // 事件触发配置
$ |; ?7 q) N& {1 l$ Y( W, L    // 每三次事件发生产生中断
1 L( F" u! i) e0 P    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);9 d! Y" L/ S$ x0 ^9 ~: _9 F
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
/ A, E" I- k8 ]* s# f2 D+ B, ?    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);) j/ E6 L5 u+ F* p4 R- R* k
    // 使能中断( i' Y/ p2 Q& W3 c( f' f9 B
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);, g  v! P( _# q, o: A

! i+ v4 p, k; n    // 禁用高精度子模块
* o8 m' G  a0 L- r$ p    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);0 J% n7 Q. y( c5 t
! F; Q6 d* g2 j: L# d; R3 Y
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);$ p- }' G  F% r8 q% {- E# W
}
6 T. K4 e( U- Q- ]5 N9 m; a/ `9 _: o+ j- L8 \$ S
void ChopperWaveform(void)
; C0 C3 }5 x$ {4 C0 Z) d: a6 w0 `( d' t/ H{
. _" S) f3 @- a2 N; @  J    // 50% 占空比& P$ k! ]) m) B* @
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
! i. N/ X7 W. B+ Y    // 4 分频
; u6 Q9 Z: |2 P, f. ]4 Z7 Z; e( n    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
; r( J3 B' |' Q$ R* m* }4 |    // 单个脉冲宽度
5 ~' W+ I* l  V1 n: a2 S, f    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
& c' v# S3 [7 h4 R" K. G) H    // 使能斩波子模块
  Q5 K" C% x1 ~( o" M    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);: n) [* O  c. |( d0 Q2 _! A; |- \# b* y
}
1 C  l: v3 P: p
: V) N9 L" R; i/****************************************************************************/
1 H6 n. l  M' f# U7 V6 g/*                                                                          */* H: q* n7 {7 R! V
/*              PWM 中断初始化                                              */) N1 V- `7 F: X. o" ^9 x( I$ h
/*                                                                          */9 r" _) r  k+ b2 g* u8 k# m
/****************************************************************************/9 }: f2 B6 d. p$ R, q. B% R; n+ A
void PWMInterruptInit(void)
6 g# t2 F' B! b5 g9 q2 k{
5 g) W9 J+ G1 Q8 m        // 注册中断服务函数9 M2 P' i' K* _' d* ~0 @
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);+ D2 K$ l& l! B" y- ]% N! m
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
" F2 j" |' p/ e% }" A# c. s8 l0 H% a! V5 r0 N
        // 映射中断  B  b/ s2 A' Q& ^3 z- b- p9 R0 W7 K
        IntChannelSet(SYS_INT_EHRPWM1, 2);
! c' g+ \! j4 F- f; \! I, U. E        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);2 k9 `/ r% S' V, V( e/ u, _0 h# }

6 f0 {. B9 i8 i( H' K        // 使能中断
' q2 [6 K8 o# ^$ z+ [: X        IntSystemEnable(SYS_INT_EHRPWM1);
  Y. N8 p6 g7 T7 d        IntSystemEnable(SYS_INT_EHRPWM1TZ);
9 l% H' ^4 r* o& j}1 N" l' [6 w* e
- D) I  [8 {, s1 u
/****************************************************************************/9 h8 b1 q5 f4 ]; q
/*                                                                          */
! e* b7 g6 o$ y0 t/ w/*              ARM 中断初始化                                              */8 r. ~9 \# Q3 w' K" Z/ a
/*                                                                          */; Q* d% o' ]. e& K3 L6 x
/****************************************************************************/
$ r4 w' ]6 b4 [6 }5 ivoid InterruptInit(void)
+ Z/ J6 y. a- s{
- l& K0 f- m1 c  Y/ m3 t        // 初始化 ARM 中断控制器
1 y- W/ \! N' g: U5 ~        IntAINTCInit();
% u3 {: p$ G' O; L* k& Y! H" `& R, t& f6 U' F
        // 使能 IRQ(CPSR)
) P9 Q+ [6 d; v: G        IntMasterIRQEnable();
2 n! o( \. i2 w/ a* b
- G3 r1 L* Q; d* `$ G# ~        // 使能中断(AINTC GER)! }% O) U5 z: ~
        IntGlobalEnable();+ n1 c  k2 m# p3 t/ h8 s  `
% ?9 w* U3 c! H
        // 使能中断(AINTC HIER)% u) W, S6 l0 u6 H- q8 y/ f0 ]
        IntIRQEnable();
8 a: |; G5 @9 |}
5 {) N/ Q& E4 h0 J- x2 R4 C5 l0 o
3 Z2 _* U5 ?( ?) f+ b$ \1 S
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/- v; V, D1 d$ c* a* s
/*                                                                          */
; K/ {0 Y& }" a6 ]3 W: M: [/*              中断服务函数                                                */% @1 D" R" m( e+ W% A2 {
/*                                                                          */
2 |7 A& B9 {* P, o1 Y4 ^/****************************************************************************/
# \2 L0 X$ v* q# I5 ovoid PWMEventIsr(void)
5 g! ^) x$ x2 C" `{
& w  Q/ V6 o+ q6 h8 l: G$ X. ^        IntSystemStatusClear(SYS_INT_EHRPWM1);5 h. c2 [7 ]1 G& Q* M

1 `3 G; H' E4 k+ v, H, f! q6 A' C$ R    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);/ J, G6 X" u& Q9 N4 H3 I' _# L
}1 m  R, |9 n3 D4 |9 ]) D  b: o

3 g3 {' V9 u$ G- T  J# Zvoid PWMTZIsr(void)
1 l3 j( M6 ?$ q6 \{
. d1 i( J0 r2 ~1 O4 q2 f. I/ [% G        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
$ z" h- Z3 g! H& E* n( k
/ H8 T2 c$ [0 s2 S( d3 U9 S    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
2 T# l0 ]: I6 z: V5 g}2 j8 y' o% Y( p/ d5 S" A

6 ]# q9 ]9 G: w" Z3 L+ q/****************************************************************************/6 x+ t+ G' I5 E- v4 \9 W" m
/*                                                                          */5 b5 c) e7 B) D1 I8 C
/*              初始化捕获模块                                              */
  b7 H+ Z! J2 S( R& s5 n& e9 u/*                                                                          */1 I' G, ~8 I9 ?- w" f
/****************************************************************************/
4 E8 U* Z& Z! s& W: uvoid ECAPInit(void)+ I8 d' r! Q. p  Q: ]" N" J
{
" o. r0 S9 W2 H+ R5 a2 ]" a. |, {        /*-----设置 ECCTL1-----*/6 M. Q- E3 y! D6 I) l4 J8 r: o) d
        // 使能CAP寄存器装载
% O+ W' B4 M; n2 w$ `/ _" M        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
  {& B+ r/ Z; c1 [. o8 W        // 设置预分频值.6 {+ w$ k. K3 L, |" s& p
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);# V9 j& e% ]/ Y
        // 上升沿触发捕获事件. l3 ^& Y% z3 G) F6 @6 ~4 t
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
9 I5 F9 N- T) f0 Q% H6 C* K        // 输入捕获后重新装载计数器值.
2 q  k( e% ?! L        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);4 f6 ?. x0 n( [2 \
+ n! S" x& U6 V" B" r9 A, q
        /*-----设置 ECCTL2-----*/
& _5 t2 G% }. ?( C4 v' u! c" t3 H        // 连续模式
9 V1 h4 ]5 Z0 E1 q0 c        ECAPContinousModeConfig(SOC_ECAP_2_REGS);; K& A1 m, N; t8 l6 {1 `1 }
        // ECAP计数器TSCTR持续计数
: o: s; \* m: z: v5 @        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);  i) e9 K& N, ~; O. Z6 H: P8 g
        // 禁用同步输出和同步输入7 ~# s% u/ _1 @) o
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
% w7 V/ p4 o& Z, z, `. |" p2 ~        // 配置 ECAP 2 为 CAPTURE 模式
  ~+ f4 @. B3 P1 m        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
- E  i$ w( V6 r' ?& T% C& c, K. p
8 E* D  J7 G6 M( k! v        // 使能中断0 V6 i+ v1 \; C
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
! {3 h9 m) l' u0 h+ \}
1 X$ ]) L* W4 B) N! f; [0 x9 l
6 Z4 O; s$ J! c+ Q# c& }/****************************************************************************/
" u/ k% |7 t$ K2 i; M; K- }7 i/*                                                                          */2 V: O5 F, W+ q
/*              取得捕获结果                                                */3 n6 H4 W) {1 Y$ @  |
/*                                                                          */
; A1 \: k; [0 S) `) h5 e* X/****************************************************************************/
, S8 g+ `: v. kunsigned int ECAPRead(void)8 c: r  H# v' j& w
{
9 `  E. F2 O2 w" K3 ?/ K0 V        unsigned int capvalue;
% J5 ?2 s# q2 `& a8 n        unsigned long frequency;
3 N. Z, H( ~4 l) |5 \
+ s# P* ~! u" ~( o5 C* n5 J        // Event1 中断标志
( T7 J. n5 u8 C& Y0 ]        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
8 z& k: _3 k6 f3 a. R# S! y        {
. I5 V% O+ ]* M" C7 V8 P9 D                // 取得捕获计数
) p9 m8 t. B( j" X                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);. j4 k. w9 S. l$ W
                capvalue = ECAPResult.cap1;7 R/ E% G* E( Z# u# Z9 t6 Z% m3 Y
1 }! ?% K+ Z8 ~
                // CAPTRUE 模块 228M 时钟主频" E* @# N' E) t1 i
                frequency  =  228000000/capvalue;- R7 N! @/ n) p
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);5 Z8 M3 I' I5 T$ N' u8 T
: ^6 o. o( L# q/ X. ]# o
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
" \5 m& j' `" q. p; e- e1 W//                IntEventClear(SYS_INT_ECAP2);. n+ p1 q& e4 f# C, M/ g
        }
3 r; G: n+ q6 G$ @" b        return frequency;$ ]# C/ c6 M- s1 d" v- c5 L/ e
}! M2 F1 }; }. @+ C- J

作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。+ q* l! E4 @& U' d0 r
[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