嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
; Q, w9 x& W. Y- k* j' i
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
9 m* V' ?; w! i  N) h; k/*                                                                          *// ]5 F& w* c  h9 X: W; F. H
/*              宏定义                                                      */
- V# z  s( e% M+ k! M& t2 K0 u/*                                                                          */
, T: k; L4 z8 p5 @2 q/****************************************************************************/  x" h+ P- D  V3 M. k
// 软件断点
- v- n: E7 B  n9 D; M0 O#define SW_BREAKPOINT     asm(" SWBP 0 ");
4 g. v$ r2 G( \1 y$ \/ G6 l/ e. s! Q  @( g5 e3 ~9 a3 U- z' i
// 时钟分频7 Z3 u, k1 @) h- |* A, ~$ s
#define CLOCK_DIV_VAL     228
* l7 A' I5 M1 n
, J+ e" t# K4 f8 }  L  n; U! @/****************************************************************************/7 a8 p# g# O) ^0 @9 r. w5 q
/*                                                                          */
* ~0 j, i0 G4 Q, V/*              全局变量                                                    */) a. _1 J) ~8 ]" c, F! a
/*                                                                          */
2 W. N$ r6 ]7 n/****************************************************************************/7 A+ `  Q9 \7 L& g; o+ L
ECAPCONTEXT ECAPResult;
9 Z2 v8 F0 n4 c2 ]7 X# e' B* J9 T5 J( y
/****************************************************************************/
/ x. Q1 U9 P- `9 G/*                                                                          */1 p4 R+ [: }6 {. S5 E2 z
/*              函数声明                                                    */
; _3 c  Y8 G/ {' ?4 }& s/*                                                                          */
) C! J! E" D+ z% {4 ?9 d8 z/****************************************************************************/
6 A2 y( {7 E2 y9 C; ?* ~// 外设使能配置
% h" e- _0 Q# o; Y. Avoid PSCInit(void);/ O2 _8 O* ~8 L! x. C% G

& R" Q5 v3 r# k9 K$ T) H  Q: f8 \// GPIO 管脚复用配置
% l4 a. b' _6 \* ]( {void GPIOBankPinMuxSet();6 N/ U3 R8 G+ W) U. ?
! x5 i2 J1 q2 ?4 o) Z
// 产生波形) X5 w4 i" x3 G0 N1 s0 Y9 }8 [
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);& |) E- s, ~' j
void ChopperWaveform(void);
2 z, d9 p: v4 J5 c4 B
! |" a9 G2 Q  w- I1 x; Q- b// ECAP初始化和读函数( @1 H( r$ K4 t0 r! l$ u0 I: ]
void ECAPInit(void);& w+ i7 ~8 _( q
unsigned int ECAPRead(void);! `! }; @8 o# ~: m

1 T7 V' T+ h/ o7 p+ y5 ~//ARM 中断初始化. `% \, n( i8 I1 [% W6 y) s
void InterruptInit(void);4 `: m7 T5 d! ?! V, Z8 u
$ C+ B# N& V& J# D8 c2 p$ N) a, M
// PWM 中断初始化. f6 ^9 M* q; \4 H  V: }9 U5 V( ]
void PWMInterruptInit(void);
5 S- g+ ?$ K, F( A: [0 y// 中断服务函数, O! J# v6 \- \* Z2 o- V
// PWM 事件4 F5 a. W3 ^6 d- s; }" W
void PWMEventIsr(void);
6 s# }* |% }9 J// PWM 错误控制事件
/ J( M0 C# K, l) @" Vvoid PWMTZIsr(void);
, c# _. X/ Y; @/ g
- w7 |! V* f9 `; P- x" J/****************************************************************************/
+ g6 ?' h% s2 B/*                                                                          */
' M- @, d2 ^+ S5 F) k6 Z  A( I/*              主函数                                                      */
' N- Z: N! h- C6 J# E/*                                                                          */! m/ m. T. x! u5 N# H$ f# v8 m
/****************************************************************************/
2 H: u$ x! _0 n& Rint main(void); e1 b) t& E4 M0 I! K) H5 |
{
: Q0 J# M8 Y# a! z  s% ]        // 外设使能配置
5 a4 X" l8 D! b: \8 Z        PSCInit();
4 i- `2 w4 c9 V  Z" s% u
6 x. Y' e. y/ X1 y( c        // 初始化串口终端 使用串口2, K" x$ p6 @% s4 t
        UARTStdioInit();5 L" S6 N+ R0 I- }1 A2 \
        ' W/ o, l6 r7 q# T, [
        // GPIO 管脚复用配置
" H# L. f  m! \" K& Q# @- _/ m' j        GPIOBankPinMuxSet();
  Q9 K2 h4 b  n0 J% O3 C3 N* Z6 u3 g- u7 d$ J2 a9 H; C0 Y1 T
        // ARM 中断初始化
6 u3 s, \5 f: W        InterruptInit();
% ]# @* c- c% x+ |$ X. |
5 n/ e1 |, G& G% m) d) [        // PWM 中断初始化3 m0 R, e9 ]1 L$ K6 e4 h$ C
        PWMInterruptInit();7 V5 U4 A: V3 e8 v$ Z7 e( h
/ f# O  H8 {* F* S, t- `
        unsigned char i;
( u# g1 U5 e$ L% X" s: q/ e        unsigned int j;) z5 c+ E% e: T' d# r

0 u5 y$ a+ o. V4 U* F& E/ f1 [        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
1 q, }$ O3 U! b+ D- y/ U        UARTPuts("------------------------------------------------------------\r\n", -1);* Z( [4 I" U6 F! D4 ^
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);6 d( R, J, g, g' |, ]) z2 X- |
        // 产生波形# ]6 e9 G! ^9 f% v1 z
        PWM1ABasic(25000,50);
. ~# k- r* \4 k# c4 V
, }% D1 g+ H3 C) }& z3 ^7 z        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);( a% j. }$ G0 A) g( y: p9 Z/ N' Y
        UARTPuts("------------------------------------------------------------\r\n", -1);9 A# `! ^! ~8 r% h

3 _0 G+ D) g( b/ Z0 N8 O1 J2 {7 ?% j  z
  C' }9 C7 {4 h/ U- |$ e) [/ D% P7 Z- i
        UARTPuts("------------------------------------------------------------\r\n", -1);) u  F6 O" Z$ |+ c) E- S
        UARTPuts("                    C6748 ECAP Test\r\n", -1);
! O& l& p# \: d% ^( H+ a, K9 Y        // ECAP 捕获初始化
( Q8 I, E) w( B# |$ R& o        ECAPInit();5 s' B+ F9 m+ ^' f$ s$ r& P
        UARTPuts("Initialize ECAP.......\r\n",-1);
; D" \$ Q- X" _% @        for(i=0;i<5;i++)/ q& V! g+ {6 w, k- M
        {) w( _' r3 w! T: u2 P, k# L9 a
                    for(j=0x00FFFFFF;j>0;j--);            // 延时$ j2 Z7 _3 S. E
                    ECAPRead();9 x" ?4 q; T) ^  D0 c* Q  u5 p
        }
' B" u5 `2 k) g- W# Q        UARTPuts("\r\n",-1);$ R4 L7 P: q$ o  ?, q" L1 W
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
- x5 z7 H, }% J5 ^+ `: }4 K        UARTPuts("------------------------------------------------------------\r\n", -1);! I) v+ J8 l: z$ T1 f

8 }& P6 J  A0 c- `/ Z  n        // 主循环/ }8 v  B! d4 S& L2 v
        for(;;)
0 _# [* c/ o# L6 z1 @        {
, R( l% f* j# e
* l5 \% I! g! {7 A        }
* ]4 ?" L, I8 }: V  k' e: E0 q$ t( L2 |}6 F6 M  N. r. `' J3 G
' {" D: v/ K  R5 w* b4 I6 |
/****************************************************************************/
( p! p+ V% K+ `8 F, q" [! {  M/*                                                                          */; ^( w' D/ U  e* L# W
/*              PSC 初始化                                                  */  x& A' n. o5 `) W. D9 G3 x
/*                                                                          */2 J( ^. n* O  H) G6 n
/****************************************************************************/2 T) i7 J  S4 c
void PSCInit(void)
& ?- L- ]6 b7 t+ f{" L( l: s+ N; ^
        // 使能  EHRPWM 和 ECAP 模块( x& h% W. y# I
        // 对相应外设模块的使能也可以在 BootLoader 中完成3 y1 v5 A) g$ K- l7 i  n
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
/ V, G& O. y2 P5 I! u: P    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
8 ]" ~! g# j1 Z5 }: p  K* S; s}
. W1 Z% j8 o2 v# q
  q& t, I$ R# J" W' `) l/****************************************************************************/
  B* U$ t& |1 P% C; u, A% u- c/*                                                                          */3 ^5 h' S+ F7 D! d* m" j
/*              GPIO 管脚复用配置                                           */' M7 J9 W$ G# M" {5 l
/*                                                                          */# a( Z% v# {2 J& @
/****************************************************************************/+ _; [  ~' [( ?
void GPIOBankPinMuxSet(void)8 o0 Y% I' v  i. g3 H! E
{$ q4 Y- {4 C. M1 e! X6 C
        EHRPWM1PinMuxSetup();
" K- F) J2 G0 X- O$ \, `7 a: V! |1 q6 c
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
' j( K5 [# K! e7 J% b( Y! q        // 作为捕获功能时管脚方向为输入* b7 q- c4 q2 U1 ?
        // 作为辅助脉宽调制时管脚方向为输出
* j' i* k2 M9 ?    // ECAP2 / APWM2* C8 M% x8 h7 U( v) z2 I
        ECAPPinMuxSetup(2);& d8 b6 j0 K. E$ f9 o
- z7 y; P: C) n8 v
        // ECAP2 / APWM2方向设置为输入
) K' K4 Q- j8 A; i- L        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]4 W5 ]% C  T+ C' o, u! w1 f0 O5 ^" o/ n" M  u
}
9 n7 ~) U6 P0 }1 ^
( Y! u& E/ G$ w  S/****************************************************************************/* E7 ^$ K  E/ E
/*                                                                          */
, F, f% e; S3 K/ U" v8 y2 p/*              PWM 输出波形                                                */
3 i3 }4 |( ~  f! G  B( |# s/*                                                                          */" m$ n2 S' ?. S9 M0 M& U! r
/****************************************************************************/5 A7 _  N& Q7 O3 b, i
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
: }, z# z+ j& l& E: r8 o{+ S3 ^6 E4 r& ^& i# i
    // 时间基准配置
" O6 V4 I, ~  Q& e  i# T  [    // 时钟配置
. U2 {8 U( K* R8 f6 V4 C; N    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);/ ^/ C" ~3 R1 `. ~7 E
0 V0 X  {' r6 G# F7 ], L
    // 配置周期
' `" f5 P2 Y% G/ A# j    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,9 s1 Q7 X% Z/ C/ _& t% j
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
* r. d! o4 ^/ [
$ Q4 l; B  ?  r. q    // 禁用输入同步信号- u' ?4 Q9 }! N) d
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
1 ~; ^+ [# Y$ f0 \: B8 f7 k; d* w* g  L/ N* |7 X
    // 禁用输出同步信号
( ~- M/ _! s( J    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);& J; E8 f( o, Q% ^

6 \" z6 q8 N9 v$ r$ x* l" V    // 仿真(DEBUG)模式行为配置
" ^* I0 S: B3 U- q8 g' g    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);) u- s  O- |" N% r
1 X. z6 |: X& j
    // 配置计数比较器子模块
2 I/ h. @1 M  v, Z  Z, B    // 加载比较器 A 值
1 Q: \, h  r3 Y. p+ i    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
4 u. F  l% ?) q- k8 p# u& |' G4 D7 q                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);9 L, c1 N; M5 x- U; W6 |" a
3 e' v* {- O4 z  ~6 b8 T2 d
    // 加载比较器 B 值% K" [* Q* z8 l) ]9 E
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,. S7 K2 s' p9 |; }4 V' e7 o
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
* x* N& x2 ]4 z. k" E2 h! p. n0 @) y3 O: U7 J
    // 功能限定配置(输出引脚触发方式设定)& d6 W! c0 a! C0 S, h4 M. }% h
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出5 _" n* ^" z# B8 d2 Y) `
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,( [7 y  W0 e% L# Q  m$ o
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,8 n4 a; W( w5 T: e* Q) D0 r) _' |$ ?
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
+ C$ ^5 ]9 r  B, t1 I% Q9 t/ o! P, w8 h8 k* D* o
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
% y% l3 w/ _0 D1 f$ l; L( c    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
7 M, ]. p. o# T% @$ z% `; I* z0 Q2 _& z! e4 ]% y# q& ?
    // 禁用斩波子模块
1 c- y5 \: a; N# x* E3 `2 L' }  q    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
3 C# Y, r# T) M) M
3 x7 v# N! C, j    // 禁用错误控制事件
0 ?" T' w1 i4 ~$ l* Q    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);  T; z* L3 K3 B+ H* s" b
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
4 t& a, |, C  A% n' n* N9 ^0 n  k7 j( K' a# E% Q  g4 {
    // 事件触发配置3 T: v9 V5 m) e# P' B
    // 每三次事件发生产生中断
9 X& _0 k0 U+ u- n' Q    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
, X4 b  M4 U3 H* t( x    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
  z/ I! L% o3 Y- Z& X    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
% {; X% K' A' Y    // 使能中断$ O$ r7 U0 s6 Q, |3 I- o
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
$ c) ?) z$ Y) g  Y- }: P/ O5 l7 ~4 S4 v& H7 x
    // 禁用高精度子模块
+ b+ ]$ I/ u1 j) O1 I    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
! H$ J1 n, m( V9 r0 C6 I; {  ~( K$ J* I: I) U' r
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
3 ~% o. D4 t  Z3 @8 F2 s% f% P- A}! V( a& j0 B4 [$ N$ [
$ |: }1 }& K  P3 B
void ChopperWaveform(void), o; P' Q7 G) Z4 T8 o! g
{, Y  P: G+ Q9 `8 N) _+ W
    // 50% 占空比
3 {& h, l" P9 h4 r    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);. ?* F# T7 \6 D9 A0 {* x2 t
    // 4 分频! d6 r6 ?4 T; a0 |. P! @
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);* K0 E1 N1 U! x, a- O
    // 单个脉冲宽度
0 p0 M) W6 x( e    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
, L2 b/ F% `0 D% D& D; h    // 使能斩波子模块* R& e" Q% k+ `. X% f9 |% h5 M
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
4 r# C1 ]0 q; \0 U& d( g* b8 b! R}
% W, r' B- r2 N6 V% l: Y' a
- M! Y) l0 f, ~! K/****************************************************************************/4 Z/ ?, M) B7 X/ l
/*                                                                          */7 w& K- N0 [3 E2 w0 I
/*              PWM 中断初始化                                              *// f2 \2 ~+ Y& N7 A$ F3 Z" W' E: |3 b
/*                                                                          */
/ a% G3 z6 }. E9 j, }/****************************************************************************/5 ?" W' D9 [3 F+ Y2 k4 Z! T) e
void PWMInterruptInit(void)
8 ?7 v8 k1 J1 L! i{
9 \2 s$ _; f9 l) v! N3 d        // 注册中断服务函数  h5 q  W+ S$ Q3 ]6 j# R
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
: H; G9 \! A0 n6 n$ |/ ~3 U        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);- y# F" c1 G. E, |9 W- M
6 R9 T2 {; m3 F; o5 g8 O, Y! I
        // 映射中断0 t0 d; q8 U& `" x8 p+ w& u
        IntChannelSet(SYS_INT_EHRPWM1, 2);
. K! I3 C: a2 N2 T" y6 E        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);4 {; T" l2 n4 ~* M. f
+ j6 n7 j7 Y' s# a
        // 使能中断3 T6 s( u# z1 T7 t! I5 h. O) C
        IntSystemEnable(SYS_INT_EHRPWM1);
) z, Q4 L& u% r, y7 E* s        IntSystemEnable(SYS_INT_EHRPWM1TZ);
8 d9 A1 `5 l4 f6 ~# p}; o3 l, G$ \/ o1 J

$ v1 N2 Z6 w/ m* ~. w* s( z; Q/****************************************************************************/
/ Q% y+ ^3 o6 @( s/*                                                                          */
! X, `# b3 R3 ~; [: r5 x/*              ARM 中断初始化                                              */
8 Y$ T6 {+ N* M+ b, b) @7 r7 ?/*                                                                          */
% o6 H9 i' [0 i# g6 K/****************************************************************************/" h8 ^% }! e& o
void InterruptInit(void)
% t) V: G% i- h; U' y- ~3 q9 i{" M) t5 i) L6 j& h/ |; z
        // 初始化 ARM 中断控制器
) {8 ]  l. O( K4 I        IntAINTCInit();
6 |, }8 p% I  S: r: b6 m: T1 i7 x) y% ?" h
        // 使能 IRQ(CPSR)
9 T9 }- U- k. H# {  S6 Q1 F        IntMasterIRQEnable();6 H, G0 Z: c1 n+ A( p) k* t$ c( K

& q. @$ g) R/ F9 j1 w! \& o        // 使能中断(AINTC GER)
( \1 _( u6 B+ e  t        IntGlobalEnable();
7 L- W7 S7 s0 P( D- g
1 d7 I8 P( p" j: r# G3 r$ U        // 使能中断(AINTC HIER)
1 [- s, L" d  }& ]6 ]        IntIRQEnable();+ K! C, d0 f4 h* i* P; n7 K) Y
}0 J1 k, Z  H+ {: N
: f& B" x- _3 @# E

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/, B! V% C8 ^9 L: m- j: i5 X; l& h
/*                                                                          */# b1 S5 t( d4 |! l3 ^- R4 }
/*              中断服务函数                                                */
1 o* z1 ~$ F8 ^/*                                                                          */
$ z' ?; @$ `" [2 s8 g/****************************************************************************/3 ]1 G0 t3 ?6 c( h! j. g7 m
void PWMEventIsr(void)
& `0 n7 U* w) V& H{7 h4 Q& Y; ^, y6 {' t3 R8 y
        IntSystemStatusClear(SYS_INT_EHRPWM1);
2 ~" W; R, @, @. n
! Q/ H" Y8 _! q8 R1 l2 u    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);3 T  |# k7 y+ b& I
}
, f, n, R+ V' b* [& b, D& w
$ b+ H9 v: E5 w' B1 ?5 M2 wvoid PWMTZIsr(void)8 |; U$ f3 W" c6 s
{$ q+ H# n3 o5 T; G2 ~% v6 e
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);4 k% \  k; _2 s3 @5 [; r; U% m' F
" r. R9 I, D; w0 G: F
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
6 ~0 S  n# z% V}% O6 `4 q; {  O1 H

* m7 X) D! ~1 M& y/****************************************************************************/
* b9 v7 t! y0 b0 h/*                                                                          */
  L7 i2 ?/ P! W, q) K/*              初始化捕获模块                                              */; D& @0 y$ |; H0 Z$ B% f) C& L# Y( w. z# d
/*                                                                          */7 m; r  A  |* a1 I+ r
/****************************************************************************/
) g' l- @( i0 ~; b& m9 L, Mvoid ECAPInit(void)
* u% X+ r, _$ p# R. u{
. X* r3 [8 ?# S1 f8 Q/ \# S7 P        /*-----设置 ECCTL1-----*/  p" I! E3 m, f- V: r# ]* `+ C
        // 使能CAP寄存器装载
, m2 `. O' s) c* a) B        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);! D( p4 [1 E4 e3 t' f) e9 ^3 t
        // 设置预分频值.8 m; p/ n+ ]4 R7 a& q8 Z" Q
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
- M/ v8 K' W# b) v8 i        // 上升沿触发捕获事件. B2 C9 [. t8 s$ D/ K
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
% L/ r/ z0 H6 g3 R4 O        // 输入捕获后重新装载计数器值.
  M9 n# i( N% r( J, i2 o        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);1 E9 h! t1 n5 k& q1 W, V' \

3 Y& p. H( A: `+ x5 S0 y        /*-----设置 ECCTL2-----*/
% n! _" w! D# ?        // 连续模式+ T: q0 R5 |. @: Z1 I
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);) P7 [- d; F# |: z% e
        // ECAP计数器TSCTR持续计数5 d  W& I7 p0 C2 l0 [+ s* z
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
9 z* [  _- n+ S4 [* K        // 禁用同步输出和同步输入! ?7 `+ H- ]  ~5 `( e0 Z5 q* T2 Q/ n
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
: Y9 E' @/ }+ I7 D        // 配置 ECAP 2 为 CAPTURE 模式9 J- X, r" P; x
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
5 `5 U; @" C& x+ o: v/ ^* Z& n2 o- H. X; b+ h. a2 }/ U
        // 使能中断
: V$ b3 w" |. l, P; W9 _//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);% w7 Z9 K# A  E) F. i( \
}+ C7 u, V+ N% |7 n; E! s5 ~
6 R3 J0 ^0 a. i5 P! s& I
/****************************************************************************/
7 E) M2 P' l" z/ M$ e, t1 L! d/*                                                                          */
% `8 x$ ]( x7 m" G, q+ b/*              取得捕获结果                                                */
5 U& T$ s5 p! F9 j6 O" O9 ]/*                                                                          */9 x  g7 H# h+ F- k1 x/ r: j
/****************************************************************************/
* M% w; _' U, b8 r- N/ o5 nunsigned int ECAPRead(void)+ ^& N5 T2 g- S% l3 m) a, B
{
. E, j9 L2 j9 Y: r, C% g        unsigned int capvalue;% z, q1 _6 G, d! S
        unsigned long frequency;
' L% K0 v4 {8 I- M. c/ c0 {* b8 `
        // Event1 中断标志
, w9 j  N+ G& X* N3 \  g        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
8 k3 R+ L' M6 |4 D9 x        {: ]8 }1 B8 N/ Z# O) v
                // 取得捕获计数
! p2 V' ^) s* \# @/ @                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);$ W( p" S0 M: f! P# r
                capvalue = ECAPResult.cap1;0 [, h  H- q: K  e! p. A

7 U* ^: a  p! [% q# f                // CAPTRUE 模块 228M 时钟主频: W) B! w7 Y3 J
                frequency  =  228000000/capvalue;* i! v6 w7 r4 V
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
2 ^* R$ a: d& F% W- q$ u3 r) Q8 F. b* i) ]2 E
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
' ~% V& R. z( q1 [5 l//                IntEventClear(SYS_INT_ECAP2);7 L% V! I" ^8 n6 N6 y
        }
1 i" p- O) l# Q( q6 W9 |. N        return frequency;& @# n& y' H5 P: d+ m2 E2 T4 L4 e
}
# F/ L4 P- m- X9 G5 y/ \  [
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
6 a9 M. O2 w, \6 N/ O1 y[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