嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家" u3 x' ^" u7 V$ P: C. {1 B! Z; M

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
3 M8 s5 B. l+ y( `# `$ `; Q/*                                                                          */
0 \) K* M, I) i4 Y" j' j- C/ D/*              宏定义                                                      */* j: S6 S- o3 S/ a  ^
/*                                                                          */7 a. o4 `4 @3 X3 z9 r2 y
/****************************************************************************/
9 \* |6 f# `! V, m9 \// 软件断点
$ A8 R: y" m6 R# L#define SW_BREAKPOINT     asm(" SWBP 0 ");) |8 n1 D; ^, L8 E
: l* x4 @# s" k3 l7 i6 w# h$ [  W
// 时钟分频
2 q. I0 q! y; q- s- _% D#define CLOCK_DIV_VAL     228( g: Z1 ~  Y( f, N
8 q& s- o+ I3 {& A& x, o
/****************************************************************************/
6 _% O, E  M# W/*                                                                          */! n, [" [- ~* Y/ ^4 @2 E1 T$ z! m
/*              全局变量                                                    */
. C4 g3 @1 i$ e/*                                                                          */
7 u  s9 {$ l0 m; l, ~6 t/****************************************************************************/3 I4 @/ I/ B2 M' m
ECAPCONTEXT ECAPResult;" B8 a+ W2 n* i: N& F( z3 R$ r) |) S

1 f1 J% B, n  \, i& H% D7 b9 N- _/****************************************************************************/$ f) q, D+ x6 P) I$ v
/*                                                                          */
6 x/ j( V9 K3 o; g4 g: p/*              函数声明                                                    */: c+ h6 N7 e9 o/ _
/*                                                                          */$ g6 i) f1 i4 u3 {5 I8 |
/****************************************************************************/
2 b2 i. L. Q- `) D/ u. s7 Z// 外设使能配置
. E2 \0 X8 s) _9 V+ e( evoid PSCInit(void);* n4 U5 ]- L/ @) ]

: o+ B; s0 C2 y- `' |3 `* ]- Z// GPIO 管脚复用配置, q- q" s/ [# w( v$ z
void GPIOBankPinMuxSet();- \7 a$ a+ H! k7 z9 h
; P  m' x5 u, D2 t+ f. `3 \& o
// 产生波形3 N  r5 I+ _! L+ f2 O
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);) D" I3 t( i. v- J
void ChopperWaveform(void);
: m6 a8 s9 Z4 j7 X& [  ~0 z" [: |+ E  X5 a: r1 x3 X1 x
// ECAP初始化和读函数% H# B0 E& z+ S5 y2 l
void ECAPInit(void);2 v. D8 @: f/ }
unsigned int ECAPRead(void);
# y, ?( j! ]5 ^( L1 j0 z5 J! ?4 E- V' L( x( ~* x$ {
//ARM 中断初始化
% D$ u: d; Q3 t7 ^) w$ W9 [void InterruptInit(void);% j) B: \2 p- g; E1 x- w
0 G$ l) I" k8 C
// PWM 中断初始化' \8 i; X' C) [+ a
void PWMInterruptInit(void);1 f; a$ ]; ^9 \+ O* H! H
// 中断服务函数
' f! P3 `5 H/ _0 j6 _. ]// PWM 事件) Z5 t  W% N, w" B) l4 J
void PWMEventIsr(void);
* G0 [- p* P# C// PWM 错误控制事件
$ F6 H6 T$ l9 u" M& H, Q% yvoid PWMTZIsr(void);& ~6 A; f  m* Y: F" V8 S9 l1 E2 |: x

  l4 `, j* l1 l3 D9 S# F/****************************************************************************/2 k! O6 [! S; q# Y. v  g  H6 Z7 p
/*                                                                          */" j6 T5 T9 j6 t7 C& B5 o3 e
/*              主函数                                                      */
7 }6 ]+ x. X" T% x7 Z/*                                                                          */
% p8 {+ Y/ J9 v2 n3 [/****************************************************************************/1 w( J/ M: a$ b8 \0 X0 D
int main(void)
* z& x. p1 {7 H/ E- ~* V% C5 @{4 ]; m1 ?) E* q4 i0 C% R' S$ ]
        // 外设使能配置. \9 F/ L* y: X4 ], L6 d6 `0 s
        PSCInit();
. x  O! c) {/ f$ v; ?- u2 }
, @+ n- X+ m8 w+ Z" s& E7 X        // 初始化串口终端 使用串口20 g, n8 D( d2 {4 c: x
        UARTStdioInit();0 y# S. N, g. B3 K
       
4 a9 X" L+ g+ Z+ c" Q; @$ k        // GPIO 管脚复用配置
- F+ d! S! \; M3 v. e+ _        GPIOBankPinMuxSet();
$ [3 t. l( m+ n* i& F% k1 s) e0 W+ P4 E6 C! m/ t  M' c* U/ F
        // ARM 中断初始化1 X/ h) _& n( ^5 X9 e
        InterruptInit();6 X. B0 {- m# O+ s/ t5 N  E  z1 o- b
- M" K9 n6 J/ p; B) u* Y
        // PWM 中断初始化
/ Z/ t$ E% z7 q; }        PWMInterruptInit();# w' W: a+ l! d( L% \

9 b% z+ b& N- j7 r$ e% a2 o# j9 G        unsigned char i;
$ O8 U: x9 M( Q( {4 Z$ ?2 I- L' ^+ A% T; O        unsigned int j;
/ \- u6 Z7 ?7 _: o6 ?- M) |9 M4 x: L$ Y# n1 X* }# O5 B
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
/ g" B3 P+ C7 ?- a% c        UARTPuts("------------------------------------------------------------\r\n", -1);0 `% R, N  T* O2 N
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
3 q  [( L2 d- c# i" N0 F! }, c        // 产生波形
. m) F# R4 B( l6 L+ @8 g1 I        PWM1ABasic(25000,50);3 ]0 \( ?& O+ H1 Q" s$ B% P# Q2 ?

1 }4 W& v& Y. P2 X) O' t        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);1 k% G# f' a: ]) ^3 N, G7 r
        UARTPuts("------------------------------------------------------------\r\n", -1);& z% U* p6 P- g2 K4 h

+ J0 ^% S3 W' y5 G& _1 s  L! J, x: c0 N# h3 u, n

7 E1 p5 E$ M8 O$ \" {        UARTPuts("------------------------------------------------------------\r\n", -1);
% m8 d, }  S, h9 U$ v        UARTPuts("                    C6748 ECAP Test\r\n", -1);
7 N5 L; m3 H! p# M        // ECAP 捕获初始化* G2 _0 o) c  }7 [7 X: g4 J
        ECAPInit();
2 @; H$ S/ W4 K# I' ^5 V$ S        UARTPuts("Initialize ECAP.......\r\n",-1);2 _0 Q4 y7 T/ Q# p
        for(i=0;i<5;i++)- d7 n2 Z$ f, Y, x; e/ w* j# g- i
        {
5 e, {, M3 e4 M                    for(j=0x00FFFFFF;j>0;j--);            // 延时# ?4 `: y( S9 Z0 A2 Z6 C' E0 V, b- @
                    ECAPRead();+ w- C1 D" c9 k) x
        }; ]2 c6 ?& T0 T$ }4 Z% @8 T1 m
        UARTPuts("\r\n",-1);6 K/ \; h9 ^$ l
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);! }' L: l$ B4 |1 q, A# L
        UARTPuts("------------------------------------------------------------\r\n", -1);4 c* t4 Q. t5 s4 j  ^9 k2 ]

% H2 E% _& }, L. h; h. Z% S        // 主循环
9 y  h$ Y+ x1 Y& M- E9 U        for(;;)6 k0 y2 ]% D9 }$ }! |
        {
3 a/ y4 D/ h; [4 O0 @9 v) R: P/ T
- ^+ p  ~2 Y/ \7 `        }( B& b! z6 }$ X- `2 Q2 Z
}
5 O! d" p; Q5 F6 H* s: V2 o& d- Y  V& b. O/ w& ?
/****************************************************************************/. Z# y0 A, x- h5 V* M$ i
/*                                                                          */
/ Z+ ^8 d. v' X9 O# L/*              PSC 初始化                                                  */
$ R6 Z) x) d5 p0 Y+ @+ w6 o/*                                                                          */
% H$ u$ [# _( Y+ ~5 p& _! n/****************************************************************************/
4 {5 H4 g& K( V/ A6 @# `void PSCInit(void)3 k% \+ P0 t* e4 q" N, v
{
/ @3 l. r3 t* b" K        // 使能  EHRPWM 和 ECAP 模块7 t9 A' s  k5 B( s$ d3 D8 t
        // 对相应外设模块的使能也可以在 BootLoader 中完成
# E; r/ U) U( a1 H/ b" Z) Q    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);6 w. f; e2 M- y7 s  S4 L5 N) ~" Z
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);* ~7 r* L3 k  r+ G4 x; l
}
1 B& F2 C/ a9 ?( o+ L% `$ i; M# Q4 K. o/ e# h, F5 K5 J5 o% |
/****************************************************************************/
  x# t" j( a% ?/*                                                                          */* y$ H( ]9 p! [  _
/*              GPIO 管脚复用配置                                           */
$ s5 n# _& J' @+ `/*                                                                          */
7 |. A) _& X0 a2 A/ m2 U8 W9 I) M/****************************************************************************/$ z7 n6 B/ ?# W1 I4 b
void GPIOBankPinMuxSet(void)
7 r  X2 G6 Z6 }! O{. l  }* [& j1 O  S  v
        EHRPWM1PinMuxSetup();
. W( l' l8 f/ i  _1 w
/ H+ {( R' x  G4 [) ]( w$ Z/ Z        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)/ W+ n: o, ^) x7 R$ k8 ~
        // 作为捕获功能时管脚方向为输入
+ t' z% L9 i" P" R, ^9 e        // 作为辅助脉宽调制时管脚方向为输出. E$ O- M" M6 A& {$ p' e
    // ECAP2 / APWM2& Z! p- L* t. y' M) Z8 M
        ECAPPinMuxSetup(2);8 {$ r& J2 M) p3 C- h; Z. o* ^

1 J. Q/ M9 d9 E: T( y        // ECAP2 / APWM2方向设置为输入2 n4 d- y) `9 S9 p1 U
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]' T9 [# D1 e$ P  U! k% S$ Y% ]* q
}8 w2 h8 R$ e& F

# [& ^' A, a( Z6 \/ d/****************************************************************************/% ?5 ~  V  I" e6 s* a2 A3 Y( c2 J2 j
/*                                                                          *// f4 ^/ k0 E$ J. Q6 t
/*              PWM 输出波形                                                */7 P  c, N9 ]& `% i
/*                                                                          */
) C  z& X3 [8 g- l; h# e/****************************************************************************/
. _- V' l2 D- H( c* Bvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)+ i0 v7 f% A0 }6 I" R+ o6 Q
{
1 T6 Z: S/ ?/ N" S( v    // 时间基准配置1 S) P  o* J; n+ O3 S/ C
    // 时钟配置, B7 e* E' T- S1 I4 e! B: Z- P- J
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);3 w/ P! }$ b, {3 K: L
8 Z# b4 [; ~; }7 `
    // 配置周期3 H5 w+ ?% g8 |2 |$ O
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,3 s6 S# X$ C1 ^5 x9 l1 G' t
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);8 L6 y, F$ r; X* {
( n/ f. e6 W5 ?4 h) l8 y
    // 禁用输入同步信号
6 n0 V9 {0 _2 S$ i9 L( `2 A    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);; o, M- q' w5 b" @6 [

8 U  i0 {  w- B* Q. R    // 禁用输出同步信号/ }% C& V1 \2 Y- V0 u+ M% x
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
$ g- T' o9 _, i. w: j- c$ i
  |% _3 o4 ]" N# V) N3 q    // 仿真(DEBUG)模式行为配置
8 L9 m/ w6 o. V2 \/ c    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);  [/ s+ U2 F( Z( S' z4 D

6 A7 X# l  }1 O4 o$ X2 c, E    // 配置计数比较器子模块
$ o5 Q* u5 f! |( m+ S    // 加载比较器 A 值
$ E0 w4 p/ ?* l6 ~& o: h6 C& j    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
2 O( s5 U5 D) {                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
3 ~/ |7 T9 Y1 h, z4 J/ t
# v) p: w: F) B8 z. `4 }: k& E$ l    // 加载比较器 B 值( _, Z8 u: p6 |# P$ {# J1 H
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
5 H1 X) t7 e5 o6 Q                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
! Z0 X2 i1 t% o
( _2 m' ?2 Z3 J' ?/ z: b" m& ]$ w    // 功能限定配置(输出引脚触发方式设定)
- i( |& {. R, j9 A  U3 D    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
% P- d: x) \5 W    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,0 u* S- k- I, d3 I
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,4 G/ B7 B. G+ l
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
# m- a$ m" m  D7 p: R
8 `- T* A: r) N5 S1 V, d* F0 S! \    // 禁用(旁路,信号直接输出到斩波子模块)死区模块4 R1 F/ ?3 w. W6 {
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);6 U8 l8 \+ ]1 Y
. o, z3 M$ R. w1 \) z; T* U6 S
    // 禁用斩波子模块( i- o  n4 L0 i( Z: l
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);6 d: Q1 [, V% I& a$ B9 \& X4 ^8 `

+ M+ p$ W5 ~1 O* u) E, q0 X    // 禁用错误控制事件
6 J6 j( G& Q5 g, q" @! F    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);4 p4 a& c) x" E' F+ j
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);/ n$ {# E9 w+ z

. d2 |+ O2 j6 Q    // 事件触发配置( S" u% k0 R' F" N4 j8 t; N4 G
    // 每三次事件发生产生中断
/ H6 [* E, t- }* b, V2 Q: t9 l    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
3 D% L$ J5 j& _6 s- u( V    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件# d! }8 M; f+ b
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);8 V; C; [+ Z, N) T* \& ~
    // 使能中断
* J. g- E2 Z: z6 M9 R    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);& l6 T/ Y% N- J8 [4 }, D, Q

3 g" O6 ]$ w* S3 W# c& H    // 禁用高精度子模块" s2 R( ~& f- ~, R* H" ~
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
7 p2 [3 {& |2 |0 h6 Z& I4 x' H. G  b4 N( f0 R" }
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
8 s; t$ R$ p" A! t}
4 I& y3 v8 L: O. ^1 J  M
8 V1 S: V' D3 l: Z* q7 Gvoid ChopperWaveform(void)9 t0 u7 L* Y, \; r" Y
{
& q" H9 {6 H$ |# T$ |    // 50% 占空比( C$ Z7 `- Y0 L  H
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
* F+ {2 |  A3 L' x& Z# N3 ~; g    // 4 分频, `8 l5 P& r5 x( Z
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);) C6 ^$ \# f4 v" Q
    // 单个脉冲宽度! S! h, C% v# b5 d& V( v
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
4 I' F; S- T4 k9 E, C( Q' r( ~    // 使能斩波子模块3 [9 o% c5 w0 P% ?6 T0 o
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);+ P* [) v! N2 N9 G
}
! u) G/ d- N0 F; o: k6 ^. L% U5 p* `1 a& o( e, V& t
/****************************************************************************// Q6 B& i1 }  a" s( h
/*                                                                          */4 _' q" E% Y6 c( f! Z3 G
/*              PWM 中断初始化                                              */
" ~( W4 F& _0 ?& }& q  ^# {, C/*                                                                          */
! m" K  @$ X6 D0 [/****************************************************************************/; `  q/ r1 V. A3 }4 i( F
void PWMInterruptInit(void)( j: B; V* ^3 w; Q
{
! `1 f/ G4 T5 \8 E4 l0 t        // 注册中断服务函数
. o- R  S! N/ S5 k7 g1 l        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
- e# s9 R; C4 X5 p4 y        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);' {8 U! V7 K* A9 c9 a8 i. }

; q* E0 I; a# Z% Z        // 映射中断& H' f' `/ Q, W3 ?: ?
        IntChannelSet(SYS_INT_EHRPWM1, 2);8 q8 r# ~5 x( S5 s" e
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
2 |! m, @3 w' z& b5 Q9 `7 _  p7 ^( p/ o8 n  x
        // 使能中断- I' w, E& z/ b  k5 x, j
        IntSystemEnable(SYS_INT_EHRPWM1);
9 H' G  g; T$ x        IntSystemEnable(SYS_INT_EHRPWM1TZ);1 z  ~  i3 v3 c5 o8 y
}
0 m' }6 F- p7 m  D
. f6 P+ F7 L7 ^+ m) S/****************************************************************************/* K9 f( h( G/ D+ K
/*                                                                          */) C1 N1 m% ]2 }- A9 T, C; f* a
/*              ARM 中断初始化                                              */
& {5 F0 l5 h* M* E) K& i; s/ `# E/*                                                                          *// B) ~( C1 b! J+ G- o
/****************************************************************************/
6 [" N. @1 f7 p$ V( J' R: Svoid InterruptInit(void)8 h3 ]1 R' c3 W1 n3 P; ^( l+ Y: ~
{# ?7 ?4 V9 q1 k9 g! Q$ w
        // 初始化 ARM 中断控制器) o9 J6 M+ W: k0 U: x
        IntAINTCInit();+ u+ G/ U4 T- p* E2 a
6 O6 A' t. F' M
        // 使能 IRQ(CPSR)
, y) a0 z% q! Q! o& J) D. S        IntMasterIRQEnable();
8 Z3 K* H5 [6 [- s
/ i! s4 F& L+ S; \, t8 }. }: I5 I        // 使能中断(AINTC GER)
  ]+ ]2 e$ x) o5 Q" l- j! F2 a9 M        IntGlobalEnable();3 d  o. }$ j/ W) u

2 A! q: b, X# Q9 t        // 使能中断(AINTC HIER)/ q$ {$ ^& e! Y
        IntIRQEnable();
0 e2 Q& C7 U, Z2 c' s. w}
9 W. H4 J% K% J0 o1 V! F+ @  x3 a  Z" j

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/0 Z! ?; l0 F2 u% y# g) d
/*                                                                          */
' e8 U$ a2 V, k1 R; b$ I: g* u+ K. L/*              中断服务函数                                                */& F. J+ v% G! i* ]; b5 P. P
/*                                                                          */
) B/ O4 j$ ~. \' _. W/****************************************************************************/4 M# ^0 J+ S! N3 t9 {
void PWMEventIsr(void)
7 O' b  H7 `7 c* o) n8 ^( Y{
8 d. v- d& C3 X9 I: `/ e4 o1 b        IntSystemStatusClear(SYS_INT_EHRPWM1);3 x" h+ M9 v" _, N

6 P2 b+ F  x3 ]/ F    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);  g& ^4 B8 v% {" o: ]
}
4 R, q6 \( \8 g/ u/ n- Z
6 V. G9 w; v, t+ n# K. jvoid PWMTZIsr(void)4 p7 k$ E  I5 _% w0 u0 K9 n
{- V$ q# u& r* V
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
4 f" `- ~6 ^, D! A: ^* o0 z. \1 e
/ X% H9 V6 b( o$ M8 ]4 V* Y    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
7 }! k0 R6 k6 w  \9 t$ q}7 C1 d+ J) l1 a9 w; i1 D( V0 t0 K# x
3 f$ k: e7 c" ?6 m# N4 n5 M
/****************************************************************************/
% ]: \, [8 e: i  p7 a5 Z8 g/*                                                                          */; {3 d1 W- \/ B" G) _, M. d
/*              初始化捕获模块                                              */
+ [4 o& E6 ]8 f% v' h' T" i5 z( I/*                                                                          */$ c# M0 N( H; H3 V- p9 x2 m
/****************************************************************************/8 i+ [4 B3 \4 G; `& V' r4 n% c
void ECAPInit(void)
) F( E. F4 e) h- t; \{! j* T2 ^5 @. D6 P+ Q- L3 _
        /*-----设置 ECCTL1-----*/: U. Y# h( Y; L# R' @1 [
        // 使能CAP寄存器装载$ K! b1 @7 p" g2 Q& y7 t
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);5 M; l6 Y9 c8 t7 |& }
        // 设置预分频值.
! B: X, @# V  B9 P5 ]        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);- K5 ]6 P% R  V( [  m. O) h
        // 上升沿触发捕获事件8 A- @9 P" s' g. w% e
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
. B# k2 ^, K1 u) H1 e0 w' p        // 输入捕获后重新装载计数器值.7 X# X' c& S: e; ~6 X$ y, O( H7 c4 a$ U
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
" r- L6 E+ B, w2 n6 _* m) s; @; u1 }$ R) Z
        /*-----设置 ECCTL2-----*/
6 A  B# Y# ]# `" ^( J5 Z        // 连续模式
9 _) J/ m. A( P- h+ d        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
1 J( o* d. z" f+ O4 j4 l        // ECAP计数器TSCTR持续计数
6 }3 z3 u2 K$ c8 h  k% A        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
. a3 [5 w" z! Z" }' A1 C# b. h: n' k; ~        // 禁用同步输出和同步输入
: O- o) \9 p- D1 ~        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
0 Z% c; P+ x5 P: Y' W        // 配置 ECAP 2 为 CAPTURE 模式
* s* Y) s+ [+ b2 v, n6 `( u        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);) l9 L5 d$ D% C) F: ]# \$ X

1 E+ `2 g% \% O        // 使能中断* |, y+ X  ?4 i+ i0 M: |
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);% y1 t, f6 N: H5 b( R& V
}
3 h2 Q* c/ ?8 e$ h, \1 {6 L& d% X% G/ P3 p8 {! t; X7 k
/****************************************************************************/1 y6 F0 Z& o6 t- J$ W. K8 o7 r' {
/*                                                                          */5 j- B+ `9 z4 W1 J
/*              取得捕获结果                                                */8 k; E0 s: N  x; j, o2 E0 ^( @
/*                                                                          */* h# B  C! e3 ]& ^: R& F  Z9 X
/****************************************************************************/
# r: e$ _0 G, h0 B, O! x, Munsigned int ECAPRead(void)
) z: @" J: A5 L( j{) U' R" ?  v1 O. ^
        unsigned int capvalue;9 k2 o2 o5 R9 B
        unsigned long frequency;7 l5 j2 r8 X' ]% D6 V4 G
4 f1 ?! \' e5 ?  f+ r
        // Event1 中断标志3 X  \4 s" W) V
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
5 Y! J; s, y4 ^/ K& U, C        {4 @# i  I# T7 A8 I; R
                // 取得捕获计数$ Q. E% Q* e2 v
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
$ q7 T8 q. u3 o                capvalue = ECAPResult.cap1;$ w# E: B+ }$ j
9 p( S5 K# F* a5 N6 u7 @
                // CAPTRUE 模块 228M 时钟主频% E) W- ]( \, ~, h5 h, }' `
                frequency  =  228000000/capvalue;3 q/ k5 u& \6 t
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
- L. K; W" S0 a1 y8 P7 k
: @* w9 f- T! U; b; [3 H3 r0 A                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
; v8 B; s" H: |) O//                IntEventClear(SYS_INT_ECAP2);1 E  z' e+ @( r& t# W& S
        }
2 ?8 O5 K& V! F        return frequency;2 K4 \, I9 r- G$ n
}
% p' G$ A0 c: G5 \$ Y% A7 ^
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
$ m: D0 c% S1 j' o9 q[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