嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家( I2 e' t. y- A- G# V, O/ ]

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
: X0 R; j! H9 N/*                                                                          */
+ P, h* [; Q8 |6 H3 }5 Y; @* n& o/*              宏定义                                                      *// H3 W- j+ c. F+ X; b: v: ^
/*                                                                          */
: M1 x% J9 X( t: z. N/****************************************************************************/- \! M7 W' ?& B3 G
// 软件断点) g7 w/ B) O: d$ j, ], \7 Y. ^
#define SW_BREAKPOINT     asm(" SWBP 0 ");
4 w# ~" x- K4 X: m: [" R" f4 Y  q
// 时钟分频8 _0 n! j: M. j, f5 r6 g8 Y5 n
#define CLOCK_DIV_VAL     228! \- N, k" \5 U( U# M- O
. [. p6 z/ f( \- b& Y
/****************************************************************************/$ _4 @! s' i8 }; \* p
/*                                                                          */* S5 Q9 J0 e) q8 K' ~) x0 ~
/*              全局变量                                                    */
3 D& l8 ^, m: g+ N/*                                                                          */) W) Q4 o; k3 Q2 X
/****************************************************************************/+ w' J; F  h( M; u8 K* b- X' J
ECAPCONTEXT ECAPResult;! i/ O9 H/ k3 U
! O3 m- R4 Q1 F$ y# [' `' y
/****************************************************************************/% n: {2 _6 _: G2 ?# J
/*                                                                          */
, t  J* _$ i+ z/*              函数声明                                                    */
2 ?5 ]+ G" G" I" Z# b4 P! \: u% z/*                                                                          */
% H% N) q0 M9 m) P/****************************************************************************/
! R( D7 X$ p1 |4 P1 f2 F// 外设使能配置
7 z; D2 b9 a5 s7 Wvoid PSCInit(void);
1 o. C+ M: {" V& F! q- |$ y/ a0 D, {! V  e
// GPIO 管脚复用配置
% M5 z$ R- o2 ]void GPIOBankPinMuxSet();* p% ]  K. A% M6 l4 y
' |0 H. J3 E( i, w' T7 N0 m( k5 e
// 产生波形0 p0 o3 y0 g* E3 b( ^& }
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
2 {' e- m) w! g" m$ o0 V/ ?void ChopperWaveform(void);
# T; R  y# Z! G( K0 A4 j9 ]/ j2 T; h% _
// ECAP初始化和读函数
, V+ [3 [6 `% E- d" |void ECAPInit(void);' d  r4 t' B0 U0 v2 w  d
unsigned int ECAPRead(void);
, ^3 `3 Z4 }& o7 ~6 i: R3 S
+ m0 D  O* l! {8 T' _6 l' C! z# ]( V//ARM 中断初始化
5 _9 ?; i( \" D( `: |7 Dvoid InterruptInit(void);
* \% x+ J. A* ?$ \8 L# s
/ y; v! u. L7 n. C// PWM 中断初始化
* \3 F4 b5 ]# R- l# F2 C3 n% Nvoid PWMInterruptInit(void);3 U& _) e5 z6 n& W9 `
// 中断服务函数% {3 y& @( W$ X" B, Y5 v
// PWM 事件9 C5 Z' C4 y" G/ z# Z
void PWMEventIsr(void);8 i6 c3 R2 N0 m2 }; |! W5 \+ G" a0 U1 I. q
// PWM 错误控制事件
# d- \/ [( C( Pvoid PWMTZIsr(void);
! z: T7 h6 m( I8 F; T4 d  w3 O8 G- u+ h  ]! _
/****************************************************************************/5 Q4 t1 u2 e; K+ E
/*                                                                          */
# X# n. U# e' }; r5 S5 D/*              主函数                                                      */* ]& T6 N; Y7 `6 @. a4 A  E7 [
/*                                                                          */2 O: O5 j$ j1 q- s, M. K
/****************************************************************************/
* O" X( e/ t# }/ ~: S4 a9 hint main(void)+ S5 B: V5 k+ Y6 z
{4 B/ }  ^% X, F0 g- n# f
        // 外设使能配置
6 F* H4 a7 O# \        PSCInit();
6 R' H5 v0 j. R; M9 V" S0 V) Z5 g) V% y1 E& k0 ~% Z& S
        // 初始化串口终端 使用串口25 s! u* z; T% i8 n" x9 w2 o1 w- Y
        UARTStdioInit();
$ V6 d- W8 m7 n( T( Y       
5 H" K' p' e; O4 {" K( C$ L( V        // GPIO 管脚复用配置3 p$ M; n9 z: O& h7 N& D8 E
        GPIOBankPinMuxSet();
3 W0 j) w# Y- S6 d+ a1 j- O& J" Z1 e8 d
        // ARM 中断初始化3 f1 Q% ?6 T$ l0 E
        InterruptInit();% N0 W6 ?5 C: H1 n! m/ B

& r0 B2 b* Y1 B6 Y: k+ `6 ?+ o        // PWM 中断初始化
7 p: n2 ~) T/ k6 M        PWMInterruptInit();
/ I! L+ M$ I$ X* {. {
& x7 c' U% D7 P6 u6 d2 ]        unsigned char i;
* N- o1 P2 Z+ T        unsigned int j;
' ?0 s+ p0 x5 |& \; }6 R1 c) C* n
3 _3 Z* b. d* i: v( I        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
6 R" B+ @) z' k/ l! Q        UARTPuts("------------------------------------------------------------\r\n", -1);# Y# A! y% B5 A# F5 x
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);/ k( ~0 ^/ L8 S5 r, `/ L9 C
        // 产生波形3 y0 v$ J  x& s2 e! l
        PWM1ABasic(25000,50);, G3 p2 I* i5 |) V4 z
7 _3 s7 l6 R! Z9 W! s0 ]
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
+ Y8 d. A' a. h' z) [+ l3 g9 T        UARTPuts("------------------------------------------------------------\r\n", -1);5 A9 O3 d2 o: w' q; ?6 z8 d. |
( t% Y! y/ W- S+ F- i4 S

/ h# {+ g1 J# X" r/ V3 m% }
, q  N6 [4 X, e1 ~+ H        UARTPuts("------------------------------------------------------------\r\n", -1);
4 H  \3 g' k' p% n  Y; w        UARTPuts("                    C6748 ECAP Test\r\n", -1);; Y6 e: u) P8 ^9 Y4 D4 |8 D9 s. Y4 M
        // ECAP 捕获初始化
1 R4 p  l8 A- [        ECAPInit();& a) K# h0 |. n" Q% y; ?; W
        UARTPuts("Initialize ECAP.......\r\n",-1);
& ]% T, m, `' V% x        for(i=0;i<5;i++)
( @2 m; T  }& i; W. y5 j        {# i. f5 j, L: k) J1 C% x5 I- i3 T  V
                    for(j=0x00FFFFFF;j>0;j--);            // 延时  ]0 |, h; i* t
                    ECAPRead();
/ x/ i! n& b. G        }
% t- D, a" B  @* x2 k        UARTPuts("\r\n",-1);6 w, V9 O5 `1 q& O
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
4 V$ F0 q6 }9 C4 u" O) r        UARTPuts("------------------------------------------------------------\r\n", -1);: g& N' Z1 h# z5 N2 u
- ^0 S0 }0 C. ]  S
        // 主循环( H7 U9 |3 }& P; z) g2 r  x+ P
        for(;;)
7 H: r: Q  U  Y! E* F& a! e# b        {
# A) ]3 ~/ h5 r5 p
) ]$ L7 `$ e* u+ t+ M# d        }: q8 C! X# D7 ~, q. z
}' g) g( \9 z4 k9 y
# d5 |) U3 q9 n% x9 Q
/****************************************************************************/
5 ?, x9 ~) b( ~  H" n/*                                                                          */& @! l4 k( J1 t4 w! D. u7 }
/*              PSC 初始化                                                  */% d8 G4 R8 E; V0 z5 {
/*                                                                          */
  H, h0 }; s# W! ^/****************************************************************************/4 e3 k+ J: W7 E# w) g6 O7 w) t
void PSCInit(void): `' r- g, Q& v5 Z
{
3 ~$ ?! F, C& N4 f: A9 U8 f        // 使能  EHRPWM 和 ECAP 模块
2 R  s5 x1 `; Y! B4 R        // 对相应外设模块的使能也可以在 BootLoader 中完成
! p. L* I- E( \1 W    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
; `! T: m( m8 Y9 h: g    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
& M0 ]" q& Y  O) `' i- s7 R/ l}- l( L! A( t6 P9 ?' t: e6 e1 Z$ n

; v9 ~& w  X# i( p: p- v8 ~/****************************************************************************// q+ u' U# t, Q4 {* c
/*                                                                          */
) n# P5 r0 g: h6 E% s7 \7 x9 }/*              GPIO 管脚复用配置                                           */
2 M' n- v. m* i( o8 Z/*                                                                          */. {- r+ \, \# c0 S- {: A* p
/****************************************************************************/3 l+ h, s! O; r9 f+ a/ a3 ~' p
void GPIOBankPinMuxSet(void)
) [, L* G5 `; P' h3 {{( P* T9 d2 Z' o/ {! r
        EHRPWM1PinMuxSetup();
1 T) D+ {& L+ i. E0 \/ O, F- |+ X+ r' s4 _
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
( t2 ~# i* A, `# K        // 作为捕获功能时管脚方向为输入  Q' z! Y1 |. ]- ?, k
        // 作为辅助脉宽调制时管脚方向为输出& F* y3 w+ J% ^+ ^8 {
    // ECAP2 / APWM2  Q2 h  G8 L' v6 ^$ V3 o. Z' l
        ECAPPinMuxSetup(2);
9 e7 e' s2 R9 i. A! }5 t' E
. n, j0 ?- W* V2 Z6 w        // ECAP2 / APWM2方向设置为输入
/ W  A. Q& k6 U6 h  Z! `        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]: Z0 {' ?8 S1 _$ M/ c% j5 P# f, I
}2 s8 v( h, ^/ K$ m4 S2 \/ i
3 J% G: C' Y1 L$ r, v
/****************************************************************************/
( G/ l9 ^' {0 Q6 s/*                                                                          */  \' C, c3 v5 H4 l7 b# z) x
/*              PWM 输出波形                                                */0 j1 t4 W% o/ |7 D
/*                                                                          */1 _2 ^9 u3 w2 k2 a& \
/****************************************************************************/
; [- Q$ v) y9 V/ z6 F3 j* Zvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
* I9 @3 C0 F$ P7 [. Z) q{6 _* @. |8 g, k5 d. X
    // 时间基准配置6 E$ G2 t' F0 n0 z6 M8 t5 h
    // 时钟配置7 t- `+ @* h" A* F# `
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);- ^. d( b7 S9 E2 P9 j  ~3 x* d1 Z
1 j2 p5 q; U9 q& {/ G) _
    // 配置周期' F4 `4 p7 Q9 A5 j
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
, j8 m/ t+ G; c2 q0 J                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
: f! H- x/ v% @. `# h4 U1 j& A2 B* z. [4 b. O
    // 禁用输入同步信号
7 |9 F1 A7 C6 q+ I& S$ |' E    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
8 x9 {( g+ R/ b& V, {8 q3 ~. P' Q6 ?: j& R0 F
    // 禁用输出同步信号
/ S. J+ @. R, W# F- M9 H+ A    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
4 x6 b* A$ J  V7 a# W
; _* e3 L6 P% Q+ g! u, h    // 仿真(DEBUG)模式行为配置  Z0 k. K0 }2 E- J% D
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);- a) m  \- z! g0 k

  @) o- Q) A4 A; D7 a    // 配置计数比较器子模块
; y0 a. z8 P8 t7 L# M9 l* ]" N    // 加载比较器 A 值  w7 e7 i, a7 u6 ^' c/ |% @
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
7 f% ^" w6 X7 `- H; Y% }                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);+ b; _$ F5 Y7 U2 P' m& u7 ^
/ o$ p2 }% @  q: J2 S8 E: U
    // 加载比较器 B 值
# j7 a2 J# [1 j* V/ W    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,+ ]5 @2 r1 q4 y& z! f
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
2 }1 B  M0 T& m6 O! y% S$ v8 |2 b1 Y- d6 e4 \
    // 功能限定配置(输出引脚触发方式设定)
% k8 v$ g! q4 |! c    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出0 m' {2 p% S" s
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,! x/ Z7 D7 k6 s) R/ S6 h+ @' Z
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
7 M+ S/ u. @4 J( a: _0 N" R                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
: g& m! e3 y( d% G
5 x% G; ?8 [! c+ c# @    // 禁用(旁路,信号直接输出到斩波子模块)死区模块+ ?" v  S0 z5 M) ^3 h3 j" i
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
9 a6 i" s8 [- t' b+ h3 u- K" U. j2 X5 i1 n; k# O" J4 ?! }  [8 ~- g8 [2 s  k
    // 禁用斩波子模块) s  T9 n4 r% u* H' s; U
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
' j/ V% R/ a$ w+ P3 d' K
2 ^% u1 [; I) A/ S& ^    // 禁用错误控制事件
6 Y) ?+ A3 O& B- Z    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
! T9 {: `. }9 q" p; N* ?    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);4 J* A/ n9 p' h& g; l% l- _% V
' S4 H. |" t4 _1 U" P
    // 事件触发配置8 p. b2 c1 A, x
    // 每三次事件发生产生中断
8 u, t2 c" k6 {5 a0 A    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);$ V( e1 h( N, f/ V5 _2 l+ ?
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
0 r: v! _/ p" z    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);6 {; r& W! G! x
    // 使能中断" [9 T" \% t3 d4 C2 e5 `: n
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);  `7 O# I4 T. d- e
1 M* }$ O% S( w* R+ @- S: q
    // 禁用高精度子模块- C6 u2 h$ |& y8 t/ w
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
- O/ l! U# q$ K' V( I2 u; j( B: [% c- k% Z6 s. B
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
- M% n  p; x9 e$ U; }' k}
8 _# i6 D) L1 ]  Z  ~: E; \; n. V5 {0 m' e2 z
void ChopperWaveform(void)" r# T* M5 E* f& X6 r" ^+ {
{
# H6 ?  J( X1 p% b: r/ ~, p" M  d    // 50% 占空比% J, Q$ w! C8 @5 v% [
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
" q$ S$ s- X, p+ u2 F+ h    // 4 分频
  D5 A. }: Q  z8 w5 b    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
& {, @$ E) Z6 ]    // 单个脉冲宽度
7 o8 x( q: i& b/ V  C$ r    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
4 M0 W3 c, _9 w9 M5 ~    // 使能斩波子模块/ P1 H9 o. X! D' V5 Q+ `0 ~+ J6 R: b
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
8 W& G5 B. m! D$ N7 F$ P0 F}
4 P' T1 W# I/ r5 J8 a$ E& U# c( x; }1 d
/****************************************************************************/
: t- Y3 }3 b6 C  u! A) o" {, V' E/*                                                                          */
, v: h( T- j3 c# x: c  Q# R4 S/*              PWM 中断初始化                                              */8 J: |9 l5 V* X( u# t2 J
/*                                                                          */9 S8 G  X$ u0 j" C3 h4 E
/****************************************************************************/' u2 V% A" u. {3 o# i
void PWMInterruptInit(void)" Y' B# v! F- F
{
3 g. y1 u$ T9 Q* V        // 注册中断服务函数
+ g) n" l& R  L! ?# R7 d( U        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
8 N9 ]% _5 R) V0 Z* J2 `# K$ z        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
" Y5 m0 @0 a& i9 z7 y, f! Q" Y- H
% U& ~& h- {  J( n        // 映射中断7 C7 p7 X6 S9 E0 S% T# W5 A
        IntChannelSet(SYS_INT_EHRPWM1, 2);( A) _: W* A3 f
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);- j0 b; E- V0 m0 w+ S

9 O* b8 o- K9 |, G        // 使能中断/ z# l3 {/ k1 _2 x% ~
        IntSystemEnable(SYS_INT_EHRPWM1);4 _8 Y0 }5 C6 f6 C) \0 K
        IntSystemEnable(SYS_INT_EHRPWM1TZ);4 K' ], d" O* m* q
}
% Z1 e  c2 B& w/ n  M) f% B( B& V& ?! \" v3 N5 A: T4 a# ^
/****************************************************************************/
+ T/ C- T& x" s7 V! r/*                                                                          */
1 n, e8 ]. f; l' b4 j& \8 c/*              ARM 中断初始化                                              */1 L" x6 i  D$ a; c# v; R. F% b
/*                                                                          */
! C( u$ ^7 Y9 H  u/****************************************************************************/7 J, G1 C* d) S: A9 L! \9 e  \' z& q
void InterruptInit(void)
- H* n* _( f) _# ^' p/ j& W{' u8 x9 f9 |! |2 m# w" I
        // 初始化 ARM 中断控制器8 ?# B, G! t% M$ B
        IntAINTCInit();
" H0 A8 y% k7 I/ y; n5 C/ }& l- _* M: |1 m! b: p  S
        // 使能 IRQ(CPSR)& j% I8 d6 n( N" W2 Q6 Q
        IntMasterIRQEnable();- t0 X& M, w' d% w
! S  |; x+ |, w* j8 n4 R
        // 使能中断(AINTC GER)
( c/ i9 G6 h; d: w        IntGlobalEnable();4 u# R/ G& P' }6 c# m5 t

5 i2 J7 {' M) s  V# [2 R0 o        // 使能中断(AINTC HIER): G+ U4 Q8 q/ o& b- h* ^" U
        IntIRQEnable();
) G1 _# `. |& R$ A* h' T$ ], M1 i5 B}" D/ C4 d4 v" w, O
8 H5 W  f7 p8 v

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/" o& T3 O% [% A
/*                                                                          */
1 i4 s8 Q5 z  `# n$ o/*              中断服务函数                                                */7 Z  X1 q7 e" y6 U8 H( ^! ?9 m+ R3 X# f+ j
/*                                                                          */& `+ ]+ o$ P% |: p+ \$ E; e
/****************************************************************************/
" L  c, g' c% {' j2 o/ l9 C- yvoid PWMEventIsr(void)
( a  y8 i2 s" C; I8 y/ B, K5 ^{+ d6 i2 S, \: h/ c+ d' p! a1 b6 r
        IntSystemStatusClear(SYS_INT_EHRPWM1);5 r. B6 Y) C9 A% s

% t' `: z# I9 a    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
" W) Q7 a* s# R- Z+ l}# O/ }1 |' ~( P
2 M+ S7 j, v0 P+ o# o$ C3 Y7 H
void PWMTZIsr(void)
9 u* J1 B5 G- M5 r$ c: g. v& @{& H9 F8 |& S0 K# b* t: l$ W: c
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
5 I" |9 N6 e) k* ^0 ~8 g: c& ^/ v$ l; {! s, s6 M
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
; H/ ]& B! I% c}
2 x+ j0 y/ j8 J3 Z
6 f; o$ P# L" }* t* h/****************************************************************************/7 W- W" T- ]8 G% h8 z$ q
/*                                                                          */+ m' w! }" ~& q/ [# f& u( A
/*              初始化捕获模块                                              */
/ M% j  D5 |( |& w- M, n. r/*                                                                          */# A2 |1 s: R6 ?# ^# r
/****************************************************************************/; c) X# A% `, D# j  e3 L
void ECAPInit(void)3 S# T! o' M$ R3 v- O& R( g' e
{
( J/ G5 D* Z: o8 z        /*-----设置 ECCTL1-----*/5 W3 W2 D9 V7 G3 s' F
        // 使能CAP寄存器装载9 ]" u' U: D, o" b3 L" m
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);& F- ~5 W4 H+ l$ k8 u7 s# t( ]8 L5 [
        // 设置预分频值.' E9 j9 M/ d4 e+ Q2 d8 E
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
  K! v+ F; {* q* S        // 上升沿触发捕获事件
9 e0 P+ J7 z' m7 @) d1 q        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
% M7 x* Z  r, b% _4 Z        // 输入捕获后重新装载计数器值.
+ Y8 j9 n; s$ [! u# s7 V. W( K        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);# \  s; Y$ ^+ D& g% w

% p# x; u( W/ C        /*-----设置 ECCTL2-----*// n/ _) S4 @9 {4 A
        // 连续模式
1 r% S2 ?% m4 R+ w* s$ k        ECAPContinousModeConfig(SOC_ECAP_2_REGS);, E  u5 t1 Z. }& n' `. y
        // ECAP计数器TSCTR持续计数$ d, y/ X- _- d  x" d) l
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
6 d6 S) ~' R8 n. C' [3 k' v* _/ {        // 禁用同步输出和同步输入
; P7 _  k% D& @1 W        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
# U& U1 q1 z5 C3 d        // 配置 ECAP 2 为 CAPTURE 模式  O/ B3 J5 D" M- E- \( w# P
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
+ h6 Y1 J; I* i6 k  H2 i4 k8 |. W* [- K/ a0 l- O
        // 使能中断- E7 \% o) M4 C, g+ h6 D/ \
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
$ f3 _+ `6 o/ ^3 j/ z: r6 R" I}
9 C7 n0 V& Y: q) W$ x0 V8 ]6 W% u% @) `- Q1 t5 i& l3 I8 z
/****************************************************************************/
  K3 S( [$ x+ V/*                                                                          */- {: {: ]* H4 }1 _% h  c# u9 }& H
/*              取得捕获结果                                                */2 B& V' H" G% Y7 z+ D4 x5 H
/*                                                                          */
# G8 Z* \* B1 ~& C/****************************************************************************/
, o1 y2 A" N, A! p0 |# T8 P% r* k! V' Lunsigned int ECAPRead(void)% s' i, h4 z- }) Z9 X
{
. S4 g- U  h; o8 o, a5 |        unsigned int capvalue;2 m; m0 m; u% A' Z* v/ d: Y
        unsigned long frequency;. ]  D% B  k6 ]: J- n

5 G# E$ k6 E) K" b5 w  r$ y        // Event1 中断标志2 L. q2 z/ h5 B1 i! K
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
  l' P* s3 t3 Q' T        {/ b6 l& D  n3 M8 I
                // 取得捕获计数7 u$ z, J  G/ ]! ]. I% Z
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);3 K; S* {- w% r+ X  E* p- O
                capvalue = ECAPResult.cap1;
! T; |; H$ T1 h7 V8 p4 c) T, r# H) e3 Q
                // CAPTRUE 模块 228M 时钟主频
9 Y5 A7 Y# l$ o' _2 m: V) b8 g                frequency  =  228000000/capvalue;; A1 t% e1 R# o
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);7 M% E2 C5 o! R( w  u

6 G# O: R+ i$ y& T, l, }: O2 M2 x' c                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
; M/ O4 C  Z8 C$ k' j. o* I, s3 F//                IntEventClear(SYS_INT_ECAP2);
- f6 k! d7 U! N3 j7 x: m4 L' i        }' {3 Y& a7 B1 @' J
        return frequency;( n, V, Q' p2 c) {3 q0 \- }$ E
}
5 q/ Z7 o; V* D8 F+ C8 d& a+ j2 p$ C: _
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。4 X- Q- q1 |! S) V  u" J6 R; {) D
[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