嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
1 Q+ x* S/ y' T
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/  @) T( m9 |! G9 F3 O# w
/*                                                                          */
% x4 }6 c: L+ Y3 X% S: D3 b9 C! Y/*              宏定义                                                      */
3 T! Z- e/ a( m# t, a( V/*                                                                          */
0 ?) f' M7 ]4 I* X& f5 E' B/****************************************************************************/
% T( e5 X4 b& L( v4 z* d% u, Y4 Z& ~: V// 软件断点* j8 @! _+ Y& {. y
#define SW_BREAKPOINT     asm(" SWBP 0 ");
; ~- L+ ^& A7 K/ J: S1 u: _$ I2 d# @
// 时钟分频5 n' O! l, I3 V# Y5 x) |
#define CLOCK_DIV_VAL     228
  e7 d2 p* F: U0 E, M) {3 m+ k/ [! L! R9 P( P; t
/****************************************************************************/
2 a' @- _2 w5 q' X; h% k/*                                                                          */+ j& [" P" g' ]) Z. ?
/*              全局变量                                                    */; h0 p, r, r( ^5 p7 Y+ c+ ]
/*                                                                          */1 o8 t, Y: A# s& w5 x
/****************************************************************************/9 L4 C; Q7 Z# C2 s$ n2 c
ECAPCONTEXT ECAPResult;
1 V2 P% o5 N5 c* ]# p1 o1 }+ z& o% q4 t% s0 w* H# L$ ^3 p% h
/****************************************************************************/
) {  {1 T. j+ l/*                                                                          */- X; f6 W) I$ K0 [- p- w) g' W3 Y$ E
/*              函数声明                                                    */
+ e: y0 C  T9 s! Z; n/*                                                                          */6 f7 w9 ?) H4 r. C0 A; A& A4 x
/****************************************************************************/
* E; f1 y9 e6 c5 W3 q// 外设使能配置) \3 ~* M1 M2 I6 i( I6 o* K
void PSCInit(void);% g9 w8 m7 G" t- n

+ w7 a' i5 y6 \# \, e- d// GPIO 管脚复用配置
: r9 w5 l% A) @8 j) \5 h- jvoid GPIOBankPinMuxSet();* {9 V  K/ O% M. ^$ B" ^1 t9 N6 C2 x
) W+ A; Q6 T1 h
// 产生波形/ j) \+ B/ b3 s4 |0 |6 }
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
; G" k# p% o/ z' e& h# {void ChopperWaveform(void);6 ?0 Z- v, G/ {' @# l4 T: {
5 A- B3 K+ j1 G7 K1 J1 A$ I7 w
// ECAP初始化和读函数. K' |2 x& `# r' z
void ECAPInit(void);8 Y5 f7 @0 M4 p0 z0 F# y: L
unsigned int ECAPRead(void);) v0 z5 ]6 i! U+ D& t) _9 k; Z- ^
" \; V, o8 q; O6 O" |3 l
//ARM 中断初始化
( @; X* l7 R1 dvoid InterruptInit(void);
' o& h7 c4 ^; G8 U- G1 z* S+ p: I" w; D! _6 b
// PWM 中断初始化
1 X! }+ d- v& m4 |, Z3 ovoid PWMInterruptInit(void);
. _; X# C# K, |1 w/ z// 中断服务函数
2 k2 l# j) n& a1 y2 a$ I0 {" C3 V// PWM 事件
2 q& X5 y$ r6 ~' {void PWMEventIsr(void);) m; Z; Y9 G9 s' {7 v5 P# b& s" R/ s
// PWM 错误控制事件( A/ B8 ~3 j% Q
void PWMTZIsr(void);
1 r/ U7 t; g" |" C5 b# x2 m
0 c: d1 B* `: F/****************************************************************************/2 z" ?' ~, E% a+ p( o! o1 Q
/*                                                                          */
" B& w6 n: q3 e( E/*              主函数                                                      */" {: `1 v6 K8 C  Z; U2 U# q) S
/*                                                                          */1 g# B( O5 a$ L' F% A7 ^" U
/****************************************************************************/+ y! Z/ |/ p5 o$ x$ O; k
int main(void)) Q; z$ [' ]+ v, _; T* H& D
{' c& ]# B0 [/ ^7 K
        // 外设使能配置  S* t- b( x0 h& |! v: K  G* q5 M$ }- a
        PSCInit();" Q" U! x6 ?0 X! p" k: ^- w" V/ H

1 ?' [& C& o! ~5 `* w! ^        // 初始化串口终端 使用串口2
; I4 `, Q; r4 h# z7 }2 ~+ U        UARTStdioInit();
& l/ T+ s0 ?' h1 ^0 g3 l6 A       
, O% p! _) T0 \3 W. o        // GPIO 管脚复用配置
( P* m. V8 \! Q" W3 J6 b6 t8 _/ t        GPIOBankPinMuxSet();
# o! l* h7 Z2 _4 P& O
1 a. O' K& ]. L4 m- X1 u1 K        // ARM 中断初始化
- Z7 B0 [3 T& G        InterruptInit();
1 K8 Q- _/ U9 p, X
3 ~5 O8 w# d2 t& o& o% x  H, Y6 y        // PWM 中断初始化
% @( U; ]0 Z. ?) d0 v# v        PWMInterruptInit();
! s/ o* I! h" ]4 @3 p4 N1 P
% `5 t% Y# H$ ]) }1 E& ?        unsigned char i;- I& m# b% ~/ R* s
        unsigned int j;1 \2 M1 @/ Z. O/ t

# _' G+ ^) k1 L& p        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
( `8 Z" r% n$ J- Y        UARTPuts("------------------------------------------------------------\r\n", -1);
+ N# g* a+ u8 J' S$ j- z. i% t6 K        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);* a" ~2 E3 v/ B+ }+ o4 c! D+ k3 x' m
        // 产生波形
( p& j- T7 U! o) E- r" R' l9 _3 B        PWM1ABasic(25000,50);
" H( S" E& V' K) O
9 G! T' ]7 `  j% q$ z4 R        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);5 X* R- p$ h& t9 j& m1 y: p, I
        UARTPuts("------------------------------------------------------------\r\n", -1);
* p$ Y8 q) m' H5 f/ ?
- p3 a% L1 o5 i1 {  y6 C3 h! G. D
. _4 q2 i+ d) V  r9 u
4 X' q, v1 _: R# o' @  _; @        UARTPuts("------------------------------------------------------------\r\n", -1);+ G& Y+ n2 \0 M4 v- ]2 k
        UARTPuts("                    C6748 ECAP Test\r\n", -1);( {$ R( p3 o' B/ N$ Y
        // ECAP 捕获初始化
5 f- I" H4 L6 ?( _2 r4 J, o; ^% j        ECAPInit();
. C& W0 r9 L% P) Q5 N        UARTPuts("Initialize ECAP.......\r\n",-1);+ G+ D4 w) E. _2 v
        for(i=0;i<5;i++)
: u2 y- e# f* ^9 X5 K        {. c  b: T: j2 Q% A. \# F
                    for(j=0x00FFFFFF;j>0;j--);            // 延时1 Y- b. o8 Q9 E( ~2 l1 K
                    ECAPRead();
8 {0 Q: F/ G& b! A; ]9 H        }
0 g* n) I0 D* t) f        UARTPuts("\r\n",-1);% m& h: u6 s5 F
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);! Q7 z5 g/ Y5 f2 x8 I
        UARTPuts("------------------------------------------------------------\r\n", -1);
3 e' x: l4 Q, L
# {4 \; Q/ [. t5 S        // 主循环
8 ?/ Y0 k8 ^& b1 e$ j1 O) E        for(;;)* N* Q/ t' N8 a2 G- {  W! R2 Z2 u/ J+ P
        {
1 A) C) T: A5 F& h. U$ @( R+ @& u$ q5 ?3 @
        }+ j; o" X2 R5 f$ L+ Q5 ^( X8 W1 K2 i
}* F! h5 I: h9 O* Z0 i! y# A4 i

, z9 y  R2 Q1 A8 \$ S/****************************************************************************/: |9 W" R- a7 F! j' L0 Z0 d4 M, }
/*                                                                          */; A; L$ N( {, L
/*              PSC 初始化                                                  */
6 T0 |4 B- Y/ S% a, M3 C8 H1 ~+ E) M/ e/*                                                                          */
. e( t  R+ O: ~% Y4 ?- f, |/****************************************************************************/
4 e; [- r5 e) E0 ^! E: u2 zvoid PSCInit(void)/ @/ }! S1 _' e% s+ a- E
{
6 q" d; N! T/ a* v% |& _* Z, ^        // 使能  EHRPWM 和 ECAP 模块
( i$ \( T+ |5 r: l& T4 l        // 对相应外设模块的使能也可以在 BootLoader 中完成2 E! |) c- Z+ R) w
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);1 R! @% b  O6 e- D  S
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
4 Z/ c. f4 _* ^}  h( Q  c  e3 R$ m
, o& R9 ?" n; n( a" a9 o
/****************************************************************************/# J: A1 ^2 h! w. f& i
/*                                                                          */& i& h9 C9 O6 |/ q4 a6 @6 M
/*              GPIO 管脚复用配置                                           */
! d( [3 K: D" f- h, \2 p/*                                                                          */. Q! l! K+ k/ K" x3 C7 A( U
/****************************************************************************/, a9 H; ^+ w6 \, ]
void GPIOBankPinMuxSet(void)$ q( ~+ R. B+ J# `, V9 o
{
6 H% ~7 k/ R  A        EHRPWM1PinMuxSetup();
6 c6 B$ o) Y3 K# K; E+ W0 @3 C0 k3 g6 U0 I9 u
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
& R, \6 }4 L, N        // 作为捕获功能时管脚方向为输入7 }; I; j+ q$ C9 f, \5 ]
        // 作为辅助脉宽调制时管脚方向为输出; ^2 X! `. d7 E1 m9 {3 W! j
    // ECAP2 / APWM2- p6 o2 E) N4 |" x
        ECAPPinMuxSetup(2);- l7 U. x6 {/ K' _( O
2 W9 u8 a% Z& g1 u$ s* N9 ~/ T
        // ECAP2 / APWM2方向设置为输入1 v3 u$ A* Y" w5 s
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]# N! D: R" i/ n7 ]: W) j
}
- f  _2 F/ p2 _6 C5 _" u- d% W
( ]3 r0 i$ T0 Q3 u4 `/****************************************************************************/5 x3 `- B7 @. r% p
/*                                                                          */7 o' d, f4 w) R1 i$ P8 z
/*              PWM 输出波形                                                */- J# Y$ E( @3 a+ ?# Y, v3 z( ^
/*                                                                          */
# P# O4 X5 L7 T8 D( Y. h. d$ l, D/****************************************************************************/3 @* A4 M5 n1 z# e# L. r6 _
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
* i  c: A9 [5 X4 F% J{
7 _. f$ A" v( _6 O    // 时间基准配置* u5 p# D" V2 u
    // 时钟配置/ C( g$ O7 |# A
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
" ~/ p: Q6 j4 u
% P8 r/ d: A1 }" J7 `: K1 e  J" q    // 配置周期
8 \+ H- ]; O* r( x$ }    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
6 Y* }% [* A1 b2 S' m; K                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);3 F! ], z( z+ x. S) ^- F9 b

( p  O/ M* K! g) X( B    // 禁用输入同步信号5 t( H/ `& m3 l0 E+ Z- w. `
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
3 l7 f$ s* Q) P7 C. d# p0 D0 ~. B6 B( e
    // 禁用输出同步信号
) |; r4 P  T1 D) T! N4 k4 Z7 R    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
) C5 Z) |( m  B( U$ {' c* u9 z5 A
    // 仿真(DEBUG)模式行为配置7 M! o- |( J& `. l7 B/ y6 n6 [2 }# U
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);, t# C7 p. C! W" X5 V
/ {0 `& n6 q. x# v* m0 v. f( Y) x0 E
    // 配置计数比较器子模块
, A6 G  j0 `; w2 [; C    // 加载比较器 A 值
% e& G+ |, t. a; N9 U: b    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
( m* k5 l: [2 `, M3 J' Z                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);. z7 s- ^' l4 H# o+ d

- _0 h1 @1 Z0 L: U, v# W: ^    // 加载比较器 B 值
( F9 O6 Y2 Z, }/ Z7 f9 H    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,8 e. X& e( }3 Z7 f# n! G9 i
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);2 R  q# |" {. F( R) S. k4 M

# G) g1 m% ~$ B1 B  z$ u9 T  X$ m    // 功能限定配置(输出引脚触发方式设定)
( c* F$ `4 q5 W; L    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
" K* c' D8 n. f+ V8 J8 w! y+ z. o  T5 N    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
# q7 X. a0 {5 t* E  f                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
* j( e/ h! N4 c6 _; M$ n                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);: @8 W$ I; Q& j0 ^) `7 t( T: c
4 e9 E8 a6 ~4 T, O* K) U0 _" R
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
; o- ]; M" R. x- k' K' c/ y    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);/ B$ s( x, G; {* O
6 R( [" y6 G9 p0 a
    // 禁用斩波子模块7 H1 u: g/ D# q
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);) H8 C$ T/ C0 R

6 l& M  K6 Y$ O. p* [2 k    // 禁用错误控制事件( I; j5 C5 @, }9 |4 g
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
7 {# J+ d" U5 C" k8 H7 a% p1 y    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);# ^( ~; w( l  |# M! q' |# N6 F' t) P

6 s/ E( s: g- C    // 事件触发配置8 v- o3 d  X4 ]  }' V  I0 K
    // 每三次事件发生产生中断
2 q, \# o- y9 E    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
% r# R8 Q1 @1 F7 S0 w- Y2 m, m7 v    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件( Q- t7 A+ c, S3 S" e7 A  u
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
$ i; X4 N+ J# q; b    // 使能中断
& \% l0 O: O8 |7 S4 n$ S    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
! X: B% m7 w5 @) j4 Q; [
! M& z: F. C! ^5 _    // 禁用高精度子模块: Z; u8 ]' T) I0 b
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
/ a& o# x8 @) K, ]
* }( d3 I% q$ M" i% Y: |    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);* p# u4 s$ z9 L4 s9 j$ Z
}
3 B- ]" Z/ f$ W4 K9 p& _$ O3 B% S8 N1 a( p/ ?
void ChopperWaveform(void). y# v% B' r, ?" Z9 {9 i' {
{
3 ]  D- R* c0 |( Y7 X+ s    // 50% 占空比$ F* j' _" `. F3 p- f3 Q/ U+ E( `
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
" x0 q* R4 d0 U% N    // 4 分频) Z  E2 N, ^7 }. P! }; s, A3 Q
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
& W0 B( x2 }* Q4 J% e5 D9 @    // 单个脉冲宽度
. K0 U2 c. w' I( M) f1 K: X. V' M    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);) s% g4 D. k" h7 z/ ^$ T3 h
    // 使能斩波子模块4 b& u+ u+ M+ z! l
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
& o6 a5 @0 I; M* [( E}" y0 g, Z1 M  q8 ?8 F9 X( x+ Z8 J

3 D5 [: |$ I& E7 e, z, \- a/****************************************************************************/7 a4 S, ~/ R& V$ Y9 t8 y
/*                                                                          */
9 i( E% P0 M/ D( i* E, J+ h/*              PWM 中断初始化                                              */
; y" d. P# k; k& F/*                                                                          */
- G$ N5 x$ ^8 e% e/****************************************************************************/4 x" T9 E2 Z% @8 E% A6 ~- H
void PWMInterruptInit(void)6 u0 n* g  X+ z( q& g( \
{
3 Y+ a1 Z. J% v) _) L        // 注册中断服务函数
" X4 @, v* ]# l" V; @        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
1 @- \, O4 e3 C/ u2 t: ^        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);/ r* E' v! t& \+ U0 h6 \2 }" H# x

  r$ x! B3 k2 [* [        // 映射中断
1 V! V0 z  ?6 J9 _( p+ M- M        IntChannelSet(SYS_INT_EHRPWM1, 2);& y: l. w: t. N! K- I9 {! O. ]
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
" H& b8 P! y" W8 |
- |, c: i; z  x* \; ~) [/ o        // 使能中断
, `- G% ?. s$ _. H        IntSystemEnable(SYS_INT_EHRPWM1);
5 D* ?+ k4 |. n0 U* A1 |        IntSystemEnable(SYS_INT_EHRPWM1TZ);3 B# w/ x- `" }  t
}
0 o1 Z, }# F: L8 d
" r  R0 i' ~! j- ?& v/****************************************************************************/2 o) k# T0 G3 B4 T3 x6 u
/*                                                                          */
$ t, i; H( y* F& c6 J8 G/*              ARM 中断初始化                                              */
" I$ v2 J6 Z/ @4 a/*                                                                          */
; t# q2 d# y. r8 q3 v, H/****************************************************************************/; {2 A; y/ s: v3 x
void InterruptInit(void)
" k, y+ v$ b2 ?9 |{
' U; S- e6 [" o0 V( c2 x" `        // 初始化 ARM 中断控制器
5 s. M7 t$ a2 d0 {        IntAINTCInit();
5 a/ I" `- p+ d- ?/ B5 K: D+ k7 S
        // 使能 IRQ(CPSR)+ R& J9 s6 }- f
        IntMasterIRQEnable();1 j: J" N( I* a, ]6 |9 U+ R
5 _% e! H0 V5 p5 q
        // 使能中断(AINTC GER)9 V& Q* w1 ~! E5 Q/ [0 o
        IntGlobalEnable();0 b7 G6 M7 I4 C; V" @9 s/ Q
9 Q# H+ r% W, ]9 V
        // 使能中断(AINTC HIER)
/ C+ T- v. c* s7 V        IntIRQEnable();2 E+ X% c  k2 F6 q9 j
}3 ~: U% L1 W. ?0 S
0 ^" M: v( x% x6 X. U' F5 \6 G

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/
  A0 w1 [4 ?3 N$ Y- m( }& O/*                                                                          */; C, M: o( U/ t3 k
/*              中断服务函数                                                */
7 `! p; g3 V. M2 A: \. Y+ A8 o/*                                                                          */
8 g+ y4 G$ }& p- n) K3 w/ m# ^/****************************************************************************/, L7 D, g# p2 @/ t) ~( ]2 T
void PWMEventIsr(void)
/ y% w; }9 z+ Z- q& ^{
/ U3 |3 N# f6 O0 _7 V        IntSystemStatusClear(SYS_INT_EHRPWM1);
. @) ?+ n) p& [! S* Z3 y# J" u- f" Y, E: G9 J  G
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);/ ?4 K/ }/ A: E9 ^7 {
}# E" {* t9 p5 a! m: f
5 J# ?1 @( S* w* e! O9 H/ c" g& S
void PWMTZIsr(void)4 V- z- T) Q1 |* M3 M3 g
{7 D, V( t3 y& L, e# K8 _
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
% r+ k7 }9 n) S. u# L, ^% G0 r' o
6 T9 x, ^- x- `* O    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);. M: M* p6 P$ Y8 e2 w- \! @
}2 \! E* o! O7 n- j( [1 b1 |/ q

; f$ G' h6 Z& m8 L; T$ T4 W( B/****************************************************************************/& a2 ?0 b4 ^5 u5 t/ }  [
/*                                                                          */! m, |& W# b& o% J% I7 y8 ?2 `
/*              初始化捕获模块                                              */; U& c& g7 j1 ?/ U" z
/*                                                                          */3 f' {/ ]* K( m; p# @) h; ?$ t
/****************************************************************************/; i/ B9 t' `) I! ]
void ECAPInit(void)2 Q, O, m* m! `6 X/ I
{2 I0 p, X/ l+ B( k9 Z5 p" _
        /*-----设置 ECCTL1-----*/* N# }3 Y6 o: {
        // 使能CAP寄存器装载
9 |! U2 Q5 u$ I  Q) q. }        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);6 K$ I: S. a1 m8 s' a; L
        // 设置预分频值.4 L/ P* J4 H* S  v3 F
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
; D1 E! a& L. I        // 上升沿触发捕获事件
; W  N0 k* h) A$ Y0 a$ M: l        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);+ k4 z+ K5 y% T* d# L8 b
        // 输入捕获后重新装载计数器值.
7 i. a( D! x0 f9 q8 \3 X# e8 m+ E5 [! T        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);# G% u/ v* \6 R+ n0 w  |
& A# V" O* h( V+ f
        /*-----设置 ECCTL2-----*/
6 O. C; S/ S# q0 f1 ^& E2 c        // 连续模式
* I$ s: E1 P( Q6 X3 K- U% p4 k6 K0 e        ECAPContinousModeConfig(SOC_ECAP_2_REGS);* n# x/ |. C* a7 M0 l4 O" s/ s7 C5 H
        // ECAP计数器TSCTR持续计数
+ M7 v/ Y4 S& `) A        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);7 o% U! ?6 T" M2 j
        // 禁用同步输出和同步输入
6 @+ x8 c0 ~& e0 p- b& d        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);* d/ @# q1 X$ D
        // 配置 ECAP 2 为 CAPTURE 模式" g7 F! g3 o2 T! r$ d- L$ `
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
) E& s3 {0 q' T( R5 d8 M) y* t. X6 v# ?8 L. E! ]
        // 使能中断
, r! W4 K2 X5 S  i1 S1 e//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
! @/ o% e  I5 W4 N; H' \}
/ o6 [; L: \' h5 \  v! N# U
% h, o* _: y0 o6 {  ?/****************************************************************************/1 ]0 `5 L! o6 U' \6 i' G4 w* F$ q. [
/*                                                                          */
8 Z  {* K2 v, e" Z" Z/*              取得捕获结果                                                */
* ^. f$ _( p5 e+ K% E) N/ \/*                                                                          */
7 G* o- k8 {7 w$ N3 }/ m/****************************************************************************/
. C+ P( ?( ?8 h+ Q( q* Aunsigned int ECAPRead(void)- G1 {" j: k. q/ J" a7 `
{1 K/ N9 a2 k+ g" i2 g, `. D! _; W
        unsigned int capvalue;
' o1 K( x$ T0 N0 z1 \7 M        unsigned long frequency;
/ V+ C: }+ L/ k' t. S, ], `& x
0 J" W3 R* z) l5 `1 U4 \* T        // Event1 中断标志
6 }$ K8 z3 @/ z# I( g        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
4 L" S  W4 h  X        {
1 r, P, X& q% e2 q/ v0 g% T                // 取得捕获计数
3 U1 B$ A- A4 q" ?9 X  O# h7 L                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
* V/ O* G2 u/ j# T2 t, w                capvalue = ECAPResult.cap1;: Q1 G0 t; t5 S* W. N6 [

, ~- J" D) U/ A, X: ?                // CAPTRUE 模块 228M 时钟主频
; S3 O- a/ D, r$ T/ A( {- t                frequency  =  228000000/capvalue;
( e2 C  J2 {' Y6 S$ e                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
5 K8 d1 a5 C# G3 O& I3 A
+ r& i( i' H0 n7 |+ x7 i$ q+ W                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);$ b( F4 Z( A/ c" n. ]
//                IntEventClear(SYS_INT_ECAP2);3 ~+ I+ P+ @  M! ]3 K
        }! |, I+ H& c7 V* i( d
        return frequency;7 Y& _# s% |3 Y( x2 u
}
. I  Q! Z( a; x! Y+ w$ ~' E) G7 Q
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
; ]' |" F: y, R# [5 k[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