嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家) `- @, Q( l# }7 |

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
" H5 m1 g6 t4 h  F5 y/*                                                                          */
" G2 B& N, @9 ~7 o, T0 ]8 z/*              宏定义                                                      */
  F3 x  z4 F6 e* A- Y/*                                                                          */) V3 A# r4 p5 K# C5 Z* K4 c
/****************************************************************************/, H% j& a( ^+ w" \% y. e$ O
// 软件断点( z) n) q# C+ V6 O
#define SW_BREAKPOINT     asm(" SWBP 0 ");
8 X! M* W: D8 p. e7 d
! u5 e! t* d4 P# y8 A. s! N// 时钟分频( J& V3 ?: _6 _! c3 Q+ i2 b1 ^
#define CLOCK_DIV_VAL     228) R  @' z' y- J' b/ x; B+ T

0 q0 j9 G  r) K& q/****************************************************************************/
+ Q, s  }& V' {/*                                                                          */9 Z! |9 j, E* F, }  q7 N' z
/*              全局变量                                                    */1 }$ N' B+ r# `& W" H
/*                                                                          */6 v' \/ m- p. H  Q( ~1 L
/****************************************************************************/+ J. O7 p  K/ [4 X9 q
ECAPCONTEXT ECAPResult;5 c0 G; b! |* Q8 `) z5 d1 d% L

+ M+ H) h2 _( Y, L$ O$ T! D/****************************************************************************/
2 b. P! Q9 F1 k$ [0 S% U* y: U/*                                                                          */; F, G+ ^6 p" t! b
/*              函数声明                                                    */
8 L% H& ^4 q6 Y, o$ y/*                                                                          */
4 r0 _( J$ o8 X" y4 q4 P/****************************************************************************/
0 v* }$ `+ n0 X3 b3 a( k( g// 外设使能配置
9 Y3 m7 d( F2 ^5 S3 g/ S% ~5 yvoid PSCInit(void);
  i: s  e0 N# w9 h, K' W
# O! [1 P1 f- n1 z& R' ]* r// GPIO 管脚复用配置4 N& _5 L6 L" a0 H, k8 _8 b. i$ N
void GPIOBankPinMuxSet();6 b" ?2 u6 {. r1 U; a
. S# z0 Q( @  `! D0 L5 ]9 q) H" A9 [
// 产生波形5 H" E- f0 \1 E# q
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);& F. T3 W# r. Y( h5 K
void ChopperWaveform(void);' L, O& b) [6 N' Q7 \6 e, z$ ^$ z1 p$ w

8 Q1 e3 i: s  O& Q# L// ECAP初始化和读函数& g. F' K# F. p! O4 Z' e
void ECAPInit(void);" G+ H3 {* l" ?# K
unsigned int ECAPRead(void);
: \( K$ C2 p3 U, x4 ]" g+ M8 C  |; P+ O3 K6 k# _( t6 O7 `% A
//ARM 中断初始化
# I' F; i4 \1 a( D; j2 ]( Avoid InterruptInit(void);
5 m, P5 i" ~+ Y. C) E. J
$ }6 ]  g8 j3 U// PWM 中断初始化+ x& E# v: g' K5 q# j3 D
void PWMInterruptInit(void);1 Q$ |( h3 ~0 i& F3 O
// 中断服务函数
+ v7 u" [$ s4 h' l; x: H7 q# S// PWM 事件
- p6 K' U9 m* l4 f* \% K0 jvoid PWMEventIsr(void);
! R, `8 Y' E, b) ~/ H// PWM 错误控制事件
& q8 l8 c) _/ i* @& a' evoid PWMTZIsr(void);  t2 b6 a  j9 t) p
. k4 _: Y" B' `( D4 W1 N
/****************************************************************************/2 ]9 ]$ f9 p& U& N8 M
/*                                                                          *// _+ V8 x  c# y4 g9 U
/*              主函数                                                      */
& g4 b" Z, l+ V. \  {4 C/*                                                                          */
& q! @- O3 }: p, @0 b' J0 G  ~/****************************************************************************/# U& [, \$ v" p+ N& M) g
int main(void)' C* V  ^; f0 @! y! w1 d8 d
{
2 W; _0 ?% A4 m3 J) x: q        // 外设使能配置3 x9 o, n& E, M2 }- t; u
        PSCInit();. {/ Z( }7 f3 v

0 L/ s+ f( j: w+ X        // 初始化串口终端 使用串口2
8 y/ @3 Z5 Q% p. i4 X( z. c        UARTStdioInit();$ \  G3 j* K* E5 G9 t. H
       
- r& J& f& _( X  Q. ^        // GPIO 管脚复用配置
' E2 h; v( C8 f$ `4 W+ z3 {        GPIOBankPinMuxSet();& ^1 D& R$ h3 Y9 I

9 y5 t6 o4 m: \6 J        // ARM 中断初始化3 n7 p2 @  r0 ^# v% Y
        InterruptInit();/ s* T+ C5 D3 {

: H( f# _+ U: q% q  \0 j, L        // PWM 中断初始化
8 U* {- x, T1 \3 _0 {( [, N        PWMInterruptInit();' G. ?- ~& h4 [/ c+ j

5 l# a! P& L  \" [, c        unsigned char i;5 ^2 G4 M% w# M, l8 }7 s
        unsigned int j;
& t5 w/ P3 h- g: C4 Y: f7 z# h7 m) u
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);# U3 g& m& Z  A$ z8 H0 x" _1 x2 O
        UARTPuts("------------------------------------------------------------\r\n", -1);' a8 z3 g! z) t% u3 M# p
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);# B2 [3 l- K& Z, I& t
        // 产生波形& ^2 i) g8 g$ @+ z4 q
        PWM1ABasic(25000,50);3 P, `& |9 _0 f( T7 f4 S# B
, {4 M, S+ E* X9 {$ P8 Y
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);9 P  d. U9 \0 r
        UARTPuts("------------------------------------------------------------\r\n", -1);
, q1 c' s8 _+ u- O" g' p
2 Z+ Q; e4 O) {+ ?8 N4 {, Q. F$ R* u: s$ |! q
1 B  ^0 U) j; ^2 Q
        UARTPuts("------------------------------------------------------------\r\n", -1);/ v* f! C# {$ s2 W9 X  }/ x6 t
        UARTPuts("                    C6748 ECAP Test\r\n", -1);
+ p9 _4 u/ q2 H        // ECAP 捕获初始化
( W* R; W* i* [* }9 z        ECAPInit();0 L) w* X3 @  {, M' f% c
        UARTPuts("Initialize ECAP.......\r\n",-1);
6 p, @7 ^" z- I6 i3 I1 l        for(i=0;i<5;i++)
4 P6 e/ k, {8 {: a! l' i1 H        {
5 C: K3 K$ y. K+ A  v! ~                    for(j=0x00FFFFFF;j>0;j--);            // 延时9 U4 z* I% d5 m. z9 e
                    ECAPRead();
: U) X' @2 I/ j        }
& |. l# F( n' `2 A- L/ x        UARTPuts("\r\n",-1);3 E* N. i: B  {9 K/ H+ G
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);  @1 g% S( N% j4 Z0 `6 X
        UARTPuts("------------------------------------------------------------\r\n", -1);
; A( j6 a# M  h% C( P( y
3 \! f6 X+ P6 ~( Y        // 主循环- U; R) g% A4 Y, K$ w' K
        for(;;)
! k+ i# D' h7 ]4 W2 ~0 T        {# d/ z* y6 [* Z+ G4 v2 i7 ~$ [8 @

) d" s# h  s% \1 R        }; A' @: ?: q) n3 l1 @
}
' k$ m$ p. o7 u+ k6 u1 Z8 |0 x  i+ ]9 Y5 i, d$ r8 X, p3 @: H
/****************************************************************************/" e7 A% B2 }7 L& {) E6 B
/*                                                                          */) C& O/ G2 t$ v0 [! o
/*              PSC 初始化                                                  */
' N! }5 z. x) z( y- M/*                                                                          */" Q' x4 ^# v  p7 [$ V( Q- E9 w
/****************************************************************************/, Z8 m4 @. v. Y: w
void PSCInit(void)) b. o0 }$ [8 h! p
{1 X. C9 C& ^7 G. K! D
        // 使能  EHRPWM 和 ECAP 模块$ L6 V  X9 f8 M7 g
        // 对相应外设模块的使能也可以在 BootLoader 中完成9 v5 j' h$ P6 I) |# ~- P4 a
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);1 g8 r# `, M: B9 q
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);4 P0 |. R; r+ u0 t) h# [6 @
}+ A2 D! W/ r) }1 x: x

. N. y' L. n: e$ t/****************************************************************************/
2 `# S: Q1 q( A9 K) U0 t/ |5 ?. I: c/*                                                                          */
1 q! R% S& \- z: L/*              GPIO 管脚复用配置                                           */
. N; B" h( s4 z) H4 z* R0 A9 U8 I5 ~/*                                                                          */3 Q2 C% k; M# S. C6 L
/****************************************************************************/
8 U* u* m" Q$ ^% P2 {0 Dvoid GPIOBankPinMuxSet(void). |/ D) Q3 H8 u/ t
{) m( M( i. k* Q, n% S. @- F1 F( Y
        EHRPWM1PinMuxSetup();7 n5 @3 b4 {; m; |4 D

+ p3 ]  X, `: A, I4 d: t% v( V' O        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)& @% Y6 ~: Z6 {, F( U
        // 作为捕获功能时管脚方向为输入/ B- h5 ?7 c6 H
        // 作为辅助脉宽调制时管脚方向为输出
5 _: e7 n$ v+ ?1 ~    // ECAP2 / APWM2
* O% p/ X+ `5 v# o. Q/ q) O        ECAPPinMuxSetup(2);
# k! t0 b8 }" l# s' @
& {# X* p: A" A: P        // ECAP2 / APWM2方向设置为输入7 o# v7 x- G2 e+ L2 N9 k7 ^
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
2 x: |( ~* Y7 m1 L. V; `2 d}6 Q3 J" r# @6 K5 J

$ `! U, {) m  @/****************************************************************************/" u+ b' t. l, `! P. B3 s
/*                                                                          */8 _# O" h, N( r# ~
/*              PWM 输出波形                                                *// ~. r8 a( t. G2 c) m
/*                                                                          */
& q3 I' h* z1 V/****************************************************************************/  V3 }5 {$ z2 q% {3 O
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)1 u/ Z( z3 L  a6 F
{
" a# A) E2 q! D+ g    // 时间基准配置
7 i5 M5 k* m" v7 F" y! V9 z    // 时钟配置
5 l3 ~4 u* f# D+ ]    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
/ `' {- K( e7 {; G; z( y' s9 y1 I- F. ^4 Q8 m6 s2 r1 b( A
    // 配置周期# r+ Q' Y' k6 z+ ~; o- z8 b
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,6 C( L. W# x+ p/ Y7 q3 y7 \. z% x
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);3 E- o; m, S6 A( t/ _2 o2 C/ J
7 l8 N% Z. M: ~0 z
    // 禁用输入同步信号8 D1 a! C; _: e/ y: ~8 |2 D
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);' N" j% g& W9 F7 V

; i1 H: u$ q0 B) z# Z# Z    // 禁用输出同步信号
# N# r/ Q8 K( ]  F! D1 F    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
5 M" }+ ~0 p5 L* d3 @7 m
$ e2 A, |; L5 h% A  U    // 仿真(DEBUG)模式行为配置
+ }* T' _. J9 z  i9 Y/ ^    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);# @8 t  z8 ^; z7 l+ N! x, f
# Q: @, C1 S+ E) b& v% m
    // 配置计数比较器子模块
4 ]& B: `, j, v  K: q$ q    // 加载比较器 A 值
0 m. T/ ~8 S; I$ E3 o    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,) Q$ g0 O& F9 |" A1 D
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
, K6 U1 c6 r4 O& c/ a* D! `4 K
# @6 o8 {( K5 q/ k) n2 H    // 加载比较器 B 值$ o$ M$ n2 R7 l- J* g9 F" }
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
" E( s% ~+ f+ U1 \4 d* f" j  i                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);6 Y2 K4 R" \9 h" @0 E, Y

' u: Y0 p. t, s& Z    // 功能限定配置(输出引脚触发方式设定)9 G' ]. P% L. b8 n3 g
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出  |. q. [4 V/ N4 a) w* {* U4 @
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,. a* f4 @# W, W- W$ J
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
% i: t0 v& ^! ?' o7 t; ^                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);3 ~& m: V# O6 ?8 X4 Z

3 D6 @& p/ Z2 ?" |+ i( s2 c% L8 @2 p    // 禁用(旁路,信号直接输出到斩波子模块)死区模块! Y* v9 M* S: p3 t
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);3 R& t0 E6 ~5 S
- e" |6 L3 r) z% D8 `! @) p( f
    // 禁用斩波子模块9 p) B: f+ i& w4 I6 X5 A. W
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);0 `% g  a/ p: m" s" k; }' O# {- M

! r2 A# Z; l( ^' o: j9 e( U, h+ k    // 禁用错误控制事件
. f% m* n/ Q5 b! D3 ?" q8 |    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
& R' V: u' a( M    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);* z" {1 e1 Z4 d- ]! J3 d
4 h9 J5 R0 N9 d9 B
    // 事件触发配置$ b, l. I& Y  f& s1 f
    // 每三次事件发生产生中断
8 z( c$ @( {; J6 W5 d0 o1 q8 M/ d    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);2 {  C9 Z8 x' S+ L/ _3 O
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
' f" [; O; }3 F' W0 k$ g" m- C    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
* X7 _  y: e- E. D% S* e3 v0 n" M3 i    // 使能中断
) k& l% Q  u6 ^# H' D5 Z    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);8 p* S) Z, k6 {/ L2 z; }

( c$ s4 b: U, U5 G    // 禁用高精度子模块
2 ^3 r& Q8 I6 }* T/ b    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
' o, z: `$ F5 l. O6 D, w. B  q( P4 t1 }( ~; m
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
( U4 r/ o& X% B7 }- l& f& v: ]) z}
4 o3 ]% c* E) y: s  a, X3 y9 E$ G5 l& S9 a3 ?
void ChopperWaveform(void)
) b- Q6 F6 K0 ~8 s0 Z% ]{5 E4 W. Z* x: Z$ F
    // 50% 占空比
6 Q5 }3 T/ Y6 r! f; y! D5 X6 M4 n8 y    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
2 m/ @* g$ Z1 Q3 r$ j    // 4 分频) I+ O1 m7 v2 e  w
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
+ k) @( B3 C0 E, `0 j# l; N    // 单个脉冲宽度
% ?$ Y1 R, @2 x0 w: e    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);6 J- E3 d' }- p8 C0 |$ d
    // 使能斩波子模块
+ T2 R  k  F' \$ z, M; E9 C$ O) `    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);3 j8 ?7 _, x8 r6 {
}
( p9 S& c& `/ @# u% M3 ]
! f7 V/ Q' ?8 x3 p$ _% j' H- Z/****************************************************************************/
' K1 _- G4 N6 i8 y# P: i5 d/*                                                                          */
7 @& l! l, v% }/*              PWM 中断初始化                                              */# M! i- d* V; ~- R
/*                                                                          */- P; g, U3 _/ p1 ^4 [
/****************************************************************************/: w. F0 {1 i* m* p$ O
void PWMInterruptInit(void)
% C8 O- f7 L& H% W7 [/ O: U{* s1 t  K2 ?1 Y6 C
        // 注册中断服务函数
5 e% T  I& B( X& `; ^        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);, F) |( b* W! n6 f. H4 b: a% n  O
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);" N1 C5 z" v6 D/ q

. {* S$ _2 T7 W8 V6 k5 R% K8 |        // 映射中断% x2 |. ~! T" p# R0 l
        IntChannelSet(SYS_INT_EHRPWM1, 2);
5 g$ n# s9 S6 h2 T0 {        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
+ O  e, c( Y: h3 q3 q* a  f
6 v! u( Z* |. A* n; @) M        // 使能中断
% o9 A1 d, D2 Q0 i% O        IntSystemEnable(SYS_INT_EHRPWM1);$ i2 m+ w" ?7 k* H3 k
        IntSystemEnable(SYS_INT_EHRPWM1TZ);
$ h- F" X3 z9 o" P! A}
+ ?6 t- o/ W' o7 p0 z* I0 D5 m6 z* b1 R: x: l+ h6 x" D
/****************************************************************************/- X7 U' o8 }0 e! ?" X  P
/*                                                                          */
' K8 @. S- @+ Q: k( U/*              ARM 中断初始化                                              */
( n  q6 z$ Z1 p5 \+ q/*                                                                          */
' V- I2 b4 }9 U: O) R1 ]$ @/****************************************************************************/& r( d1 K% M& {  V7 n+ L, `
void InterruptInit(void)
+ S# i' F6 \  }; k{! n# ?) q+ G1 J* {/ i4 m
        // 初始化 ARM 中断控制器0 C! l) u2 {8 ~, N# Z
        IntAINTCInit();
: S5 e. l! p: r, }7 `/ F. q: ^4 t
( F, j( H+ L' t3 {  e        // 使能 IRQ(CPSR)0 J: F% W) q, f; m- e; |2 s
        IntMasterIRQEnable();& l6 o. _3 F7 u9 {. d, |

; C4 z4 W$ j! l, h2 a: Q        // 使能中断(AINTC GER)5 ]- T3 k, o8 j+ e/ n
        IntGlobalEnable();
- O) a& z( b' w; j  \0 q" |- s" z" i; O0 w6 z8 u: i
        // 使能中断(AINTC HIER)* E  t  i6 g0 h% O1 V- N: ?) d5 E
        IntIRQEnable();
8 Y  j' c. u9 j, Y# K}+ g' w; I9 V- s
$ q3 U7 T) U! R4 n2 o: r

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************// m( L5 m# o8 A! k
/*                                                                          */
+ c% Z0 n! |% X( x0 w/*              中断服务函数                                                */0 O0 U5 l- C  V$ ?, ?
/*                                                                          */# \/ y5 y2 a, _+ ], C7 j, Z
/****************************************************************************/! F, H  K, M- C1 z6 G$ I7 P( J
void PWMEventIsr(void)3 D" F% R. L' K2 {; q5 L
{4 m& G) G6 W; U" @" w) e
        IntSystemStatusClear(SYS_INT_EHRPWM1);+ H  J* A( ?/ A6 Z, V) N! w

2 M  g$ b6 n& B) a6 h7 g1 z, E" ~8 i" S% w    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
& q" ]3 z" x8 p6 w" l! n' q( q# G% j}
  G6 W  U' }6 _7 k# ^9 C& a5 `3 o( D) O7 P# w
void PWMTZIsr(void)
2 P$ m! k! y1 y/ ^! Y! q$ w{
4 ~/ x. j- ]- O; {' v" R6 |6 ^! ]8 N        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);/ M7 f' j5 U+ b( _( p, o3 g# ~
0 _1 X4 ]) X( }; w0 c6 A- B& M. g5 j
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);/ N- f$ S! ~8 O6 G
}
2 m1 P# b; c9 X# Q2 n4 O$ E6 t8 Y! `0 b
/****************************************************************************/2 k- L  Y7 V. b" T
/*                                                                          */
) A1 k, [1 ^8 T/*              初始化捕获模块                                              */' d9 L- d2 s" H* z! Y+ U5 z' _
/*                                                                          */
. ]+ H9 o/ O/ m$ F/****************************************************************************/: s0 d' C! w, F
void ECAPInit(void)
0 _! l5 ^; \. c{, |5 q( X$ C. C( Q* ~3 U
        /*-----设置 ECCTL1-----*/
% i/ c) w' s( t) n, f7 p% H8 ^        // 使能CAP寄存器装载8 _- q# W1 N' V: P: i, ~1 q; p
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);* c; I' V8 u) L% @+ t5 o5 {
        // 设置预分频值.
* z" W# O2 C  }: i  W. B        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
6 l, e+ q5 m( C        // 上升沿触发捕获事件
: s1 z' L  U! Y' ~, X4 @8 d        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);; O+ v  |% J8 ]; H' o
        // 输入捕获后重新装载计数器值.2 q% G. }7 _- X/ T# B& z
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);9 K8 @. {/ _, m+ L

* Y# M* F8 l1 S5 K( A        /*-----设置 ECCTL2-----*/1 U2 D6 _! m) @' O  P% R
        // 连续模式- n$ ?5 v* H9 r; G. G" m
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
9 B6 Q0 l! ]+ P& R        // ECAP计数器TSCTR持续计数$ ^. l% ?- k+ M* S8 K$ r: M
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
' J  U* ?$ U8 U2 b8 U$ [( T        // 禁用同步输出和同步输入
! L1 k3 Y# S- W6 h" d        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);9 s" @- Y2 \' j+ U( e9 T  g9 a9 @9 P
        // 配置 ECAP 2 为 CAPTURE 模式8 O) U: a( R0 E5 F' a! f* p
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
7 K1 D. [+ @9 H' p
5 b, K$ I& g+ m2 k9 W/ c( h# k6 p        // 使能中断
2 C. B4 J6 J$ q+ u//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
6 ]8 W7 }, s' D$ @$ J}
6 i4 W4 P" G6 U. v2 G" A
# i% g6 r# `" i$ P$ u& M% p; M! v+ e) j/****************************************************************************/
. Y% x2 M- o) C; H$ d4 k/*                                                                          */
9 V2 S) e% a+ ~2 R/*              取得捕获结果                                                */
5 v0 L# ~( H1 b) g2 f& a8 k+ ^/*                                                                          */- M* ?0 F9 o5 r5 T- |
/****************************************************************************/; R! m% P6 e+ `* d8 W" M* D! ~
unsigned int ECAPRead(void)' q1 d7 z9 Z8 J) |
{
$ ^% G- z2 w7 N: D        unsigned int capvalue;) a! u. D) O: C5 ~2 V( S. c
        unsigned long frequency;
% R+ Y+ t6 `8 }4 U; \' C& ^1 u' J8 j6 C9 A
        // Event1 中断标志/ V. d% v+ Z+ y2 `5 J' V
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
8 b$ y4 l+ e/ ^% E- Y8 F5 x        {
9 U! B; J7 d+ ?) b* {2 ~                // 取得捕获计数! q' K: O( v' y! x$ c& i# a9 j
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);0 F  t* p3 P2 Y" C( `3 O
                capvalue = ECAPResult.cap1;% ]* l( h+ ]6 K0 |3 ?

$ l2 C& d/ b. `                // CAPTRUE 模块 228M 时钟主频: k  \2 p/ ?* t- O& A1 ]& y! O
                frequency  =  228000000/capvalue;
6 }9 k* z3 M2 ?                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
3 u* I8 ^7 _% E& B. w3 J' g0 x( P
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);& ]4 z4 o+ P* M2 J4 |
//                IntEventClear(SYS_INT_ECAP2);
* ?, \3 L2 ^+ ]5 P8 o4 n" Z        }
1 K! R7 G( O7 {0 z( l        return frequency;
, V7 p# S, x* s' H( x6 q}. L5 S8 G2 ?: q9 U/ {

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