嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
4 M& _& s5 Y8 k4 e  d- b8 e6 A
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/& x# B; _7 K. L) o7 E! ]
/*                                                                          */
0 [) T% ~, E4 s* S6 T: L/*              宏定义                                                      */3 c& X9 ]  k5 L# d2 Q
/*                                                                          */7 W2 q2 I2 o3 r* Z7 l/ @. ^
/****************************************************************************/
" z3 q) d0 U% k/ m: o// 软件断点8 O; M; ~! m4 Y8 c1 o
#define SW_BREAKPOINT     asm(" SWBP 0 ");( ~! q' y5 l! v: P7 w8 g3 f5 Y

# h  ~7 \8 }3 e- e% `0 w' ~1 K! ^: k// 时钟分频
) F! y$ p. ?+ I2 m# r#define CLOCK_DIV_VAL     228
% O) E/ e+ M1 t6 m1 ]$ ~; C/ ?5 M) D! Z4 U) F2 }
/****************************************************************************/
( M  S! b$ v* {/ l/*                                                                          */
; A3 \9 n& V3 g0 v4 s/*              全局变量                                                    */
% z' Z% I1 o" V$ C$ C- N3 F/*                                                                          */  n* `4 i. a# y2 p! J
/****************************************************************************/
( o) m2 o, }. z1 j$ }ECAPCONTEXT ECAPResult;  C! c$ H  d3 g

  H) j2 h) P9 Z, x! j/****************************************************************************/
# h; ^( `: D. O0 k+ B/*                                                                          */' c$ n; N$ b6 p& C8 L+ w- A; [1 V
/*              函数声明                                                    */
- u' S% C/ [# G) a2 g/*                                                                          */
, L( U" ^7 A1 Z( t% t3 u/****************************************************************************/
; {4 F! u8 z) }1 K) C/ Q9 r// 外设使能配置& b" L$ ^% W/ U$ \5 B$ D- \- l8 Y
void PSCInit(void);" d* [, R3 R6 r( ^, w
& X8 \9 {/ q. U8 p5 _
// GPIO 管脚复用配置+ Z. r0 R7 `# \. Q4 `( ]5 h
void GPIOBankPinMuxSet();
0 c( a+ C& _2 p% L. f6 E& g, j1 F7 B+ f2 Y1 m- [
// 产生波形5 O/ y; A7 Y  x
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
$ P5 X6 d& R6 u. D2 ~6 \+ N  evoid ChopperWaveform(void);+ k2 r) y2 ]5 e* m- L6 O* Z

  m' e4 L9 d9 m// ECAP初始化和读函数) o/ @8 ?/ J2 E1 s! i9 W* D1 P
void ECAPInit(void);
# e. z6 C8 b" Punsigned int ECAPRead(void);  K. u! n' s. p/ G( y! Q
1 k5 Q$ @- t2 E
//ARM 中断初始化
5 \7 n; O0 E- f0 z1 _void InterruptInit(void);
  d" m; Y  v, g# C4 o3 E/ S9 w- g8 m1 U. h! Z# g( s! }
// PWM 中断初始化
1 Q) N8 L! i7 q2 ?* T/ r0 nvoid PWMInterruptInit(void);
$ A% O* y% y4 T5 N1 Y1 Z$ T/ B// 中断服务函数" E' f- u/ @2 p- s6 G2 @9 Z8 z
// PWM 事件) n3 Y7 J! [" \
void PWMEventIsr(void);6 K. X( l7 U& m. W9 P9 L" O' k
// PWM 错误控制事件; d& K8 C4 e+ k! ?
void PWMTZIsr(void);
# ?. O6 ]+ q# T2 C  c1 @' Y8 Z+ E- ]+ H3 c  r5 I
/****************************************************************************/
/ U& k9 E: j' K6 ]! B. l% O/*                                                                          */5 p4 z4 m$ [4 M, l" y5 n* t
/*              主函数                                                      */
3 G5 p$ ~5 ]- o* p: X/*                                                                          */
5 Z& Q# V8 J6 m, f4 O9 n( c/****************************************************************************/
0 h$ k7 E$ I# f6 f4 F+ L7 yint main(void)2 W; r& X( h1 b* M2 d& i
{- P0 D' i+ M1 |
        // 外设使能配置
# r- y5 b$ N+ ~: ]; g& ~        PSCInit();6 H" @3 }) j+ J* u, N
  A0 J2 n2 e+ f; P
        // 初始化串口终端 使用串口22 |1 W1 e5 f: I% I1 G: x
        UARTStdioInit();7 f6 S( D$ `+ K9 L3 S
       
% f* e" W- a0 w; ~6 j        // GPIO 管脚复用配置5 r/ {# J2 |9 V' g- `3 a
        GPIOBankPinMuxSet();
% J# u$ F! b- h% a( K0 i& s) B' r
        // ARM 中断初始化% R, U% h1 e: r, [8 k
        InterruptInit();
' d+ U0 Y3 t; e& \; ?( [/ @. z
; _8 W7 A5 z2 D& ~% _1 J        // PWM 中断初始化
& s. a/ s8 x4 |7 d9 F        PWMInterruptInit();
' I" t/ ?( i" F" R3 |  r0 A$ z' M, b& ~
        unsigned char i;6 N& H& D9 Q, J$ l
        unsigned int j;
4 y) ~1 [0 B7 H& {+ _6 \
; H5 \7 d; T# O6 K: p: t        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);1 F; B3 k% i& W9 k/ I
        UARTPuts("------------------------------------------------------------\r\n", -1);4 L  `1 T, O0 K) |6 R
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);( h0 \  K& d& T8 z9 Z
        // 产生波形
$ R+ |. y! K  c& a' g        PWM1ABasic(25000,50);
) |& n! Y  X1 ~+ e1 ?$ Q3 t9 @4 G* G' \
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
! r5 l1 X1 \/ ~2 Y+ F  e        UARTPuts("------------------------------------------------------------\r\n", -1);) R/ y* w# r* M! {1 a

: ~: N, z* ^' l5 c6 \/ b
% c3 o- [( `8 X2 G
$ V4 \; y3 Q! c# [: x0 }/ Z        UARTPuts("------------------------------------------------------------\r\n", -1);
2 k5 T4 K* T( v" J; {        UARTPuts("                    C6748 ECAP Test\r\n", -1);5 {1 ^5 m# y. b. _9 `: L( x
        // ECAP 捕获初始化
. s5 ]( X* U. }( t7 M/ x# W! n' O        ECAPInit();6 v* j1 y9 X# O' F
        UARTPuts("Initialize ECAP.......\r\n",-1);
' f7 B+ E( N& S+ N8 O        for(i=0;i<5;i++)# D9 L  L" o" v/ a4 v4 i
        {$ \$ A# J5 l) P) F# ~
                    for(j=0x00FFFFFF;j>0;j--);            // 延时5 t0 C  t9 ?5 L6 a
                    ECAPRead();6 N, D9 E9 Q; p0 V( ^
        }
- {  U" K/ W7 A4 F2 o        UARTPuts("\r\n",-1);* @% a' Z9 ?" z# o# }& F
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
$ V) e. c  U) n% \, S1 }! s9 _        UARTPuts("------------------------------------------------------------\r\n", -1);
' g8 {1 i- n  X3 x  X
# r4 E; G2 j( S        // 主循环3 P" e) ?* G7 I' `+ m
        for(;;)$ x) Z5 F7 ^7 i% H  `
        {
6 ^) S; z! \- j, Q
5 ]/ k% C/ f  Z. v1 F# X1 y        }# G8 g. ?' D; a0 t
}- q+ s! D( T( t

+ x6 c0 U9 S0 m. C+ w/****************************************************************************/; E- f( B$ |. ?2 Q
/*                                                                          */
: M" g2 Y! Z; Q/*              PSC 初始化                                                  */
+ H5 O2 O+ t6 B) M/*                                                                          */
) l$ z8 K' d4 ]* l* _# s! V% u/****************************************************************************/
: F9 u# d8 Z4 r5 T* o+ rvoid PSCInit(void)0 m  ~/ J% d( a4 G; f
{# C  A( w: R/ P* \$ r; A. y  g" |
        // 使能  EHRPWM 和 ECAP 模块, y- V7 q8 X% W: O* k
        // 对相应外设模块的使能也可以在 BootLoader 中完成
" `( M: V9 R8 _9 l/ K    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
# D$ j+ h( t) w# E) N2 b; u- Z# L    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);: O+ ~2 c6 j! l$ _( W
}/ U7 z" K. X0 i2 N7 R. V+ d

0 @& I% K) C+ h6 w! R/****************************************************************************/: P0 A; z/ Y5 g
/*                                                                          */0 L1 c3 s3 x' B2 D2 U6 [, B4 ]
/*              GPIO 管脚复用配置                                           *// {5 b# `9 i& F. @
/*                                                                          */* C% E  Y- g- M! H
/****************************************************************************/
  s2 M' s# j1 c! j/ {void GPIOBankPinMuxSet(void)
: X& r3 c2 \" R4 t2 r* ^{' `7 j8 N* ]. t; }4 V
        EHRPWM1PinMuxSetup();0 E3 Z9 @7 Y& t* }! V

& `& |" B7 g7 i$ d        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)9 s7 v) j* f; R: o+ D6 Z  ]; G3 v
        // 作为捕获功能时管脚方向为输入
) z* \, m4 p8 C+ c        // 作为辅助脉宽调制时管脚方向为输出6 l/ |5 I  K: K" ^" x
    // ECAP2 / APWM2
5 q" Z+ J* u& ^% z. v- m        ECAPPinMuxSetup(2);6 \- h# Y  q( C' Y, x
9 z6 i8 G, }2 k  Y5 [& o
        // ECAP2 / APWM2方向设置为输入
4 e0 X4 x0 V- f) [7 e- C        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
( h8 e/ q. J7 b( }+ ~# M0 a}; }& R, I5 M, ^2 e

: S$ M: Q/ u, F4 {# V8 m/****************************************************************************/
, e: r0 m5 s& k* |$ C  c/*                                                                          */. C% z7 z; b, e  o
/*              PWM 输出波形                                                */  p3 p( \2 j; G
/*                                                                          */
1 i9 I1 }) j1 l& M/****************************************************************************/
8 O- O: o" x$ q# `void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)9 O) E3 Z9 G# Y5 L4 J6 U  R
{
8 t. ]+ u' O) L* S! O  z: R    // 时间基准配置: n( x+ N3 n7 F; h
    // 时钟配置
7 k! `0 C6 |! p0 m/ F8 {- T. T    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);. z! O5 z: H- u3 G

; V! K/ i7 l- B' _/ k    // 配置周期- d2 x9 W6 T( h: m4 b
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,8 S, i' I1 m+ O( r' b
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
' d6 v; c% _, u/ N. o% F# L" H- x( j) J4 ~; c1 I/ V
    // 禁用输入同步信号
% Y/ {8 T' l3 E4 @5 e    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
7 j1 q) V- X+ r8 i" a* D6 b6 S
2 {# v# d, s9 R% ]% {    // 禁用输出同步信号
5 F  z( J! `  T# J( ]    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);3 o: K- @7 u2 i

) O- a& {6 q2 x" q    // 仿真(DEBUG)模式行为配置. j6 V  |# w5 S; {* i5 [2 o6 L
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
" _" A% J: C# N2 M: ]- X9 y& q2 V# ~* k6 b+ ^6 c
    // 配置计数比较器子模块1 Q! n. v" |3 v: {. E
    // 加载比较器 A 值5 ^, f& ^1 ]) p, G- R
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
% p2 W: g, ]; t                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
3 o1 M) e; }, M  R' H7 B( h; {( A8 P; B; Z* E7 D* c
    // 加载比较器 B 值9 e1 ?2 O7 q" E; g% b! I, w
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
" a' M- s# |0 M+ g% h) L/ A7 W# A                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
% g$ ]! ]! e' g3 b8 W# Y
' w3 S3 w0 s1 @$ m! w+ b5 Z    // 功能限定配置(输出引脚触发方式设定); x9 b% A/ e! d" b
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
6 ]( ?4 M# k6 T0 O' a    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
; l6 `2 i7 u, \8 p" o                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
7 v  h8 f* T1 Z7 U" ^                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
! I6 z" H- W  n$ g. ~' H9 O( F' r, R7 P' k/ ?7 B2 `  j1 K
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块& R0 Z% x6 i2 O- |. c
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);0 s! A  O" f% p8 O) R
( ~" E% l; O, Q' h+ W4 R
    // 禁用斩波子模块
% [0 @2 Q! S' E3 V/ @9 t- A    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
& j; l: G, g5 M+ Y# _
. T) s9 D, l) E    // 禁用错误控制事件: B7 t5 j4 _+ u- ]% v- E
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
7 e2 b1 _3 `/ N  f5 e    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);: N' r2 |. S# ^7 }7 M, I+ e3 ~

$ j; [( G7 i/ ~0 v2 G    // 事件触发配置, ^& M- f$ A* r& ]5 U
    // 每三次事件发生产生中断
! V8 ?! B; p' W# K$ H    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
1 S( A2 ?; |' h( z4 j    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
" w* Q' Z- l) [0 e2 p7 c    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
; e* O( [8 F7 M1 Q2 s' ~2 D    // 使能中断- L& ~# x$ P2 d3 b8 K
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);& {* m8 E+ u' n0 W& |! `# s

" a- |+ T* a! d8 X* ^    // 禁用高精度子模块
& U& R, l" i7 V4 ]    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
% H% P4 r' S4 s5 o4 f' j3 _! c
" q  i  X* `/ Q& [; `4 B    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);6 P& T( X4 w7 U/ ?5 i" E
}
0 X) f& X& u1 {* X( b; R  {; \9 c: t6 u, I( {  J6 ~! }+ \
void ChopperWaveform(void)# U/ x& O/ O6 g9 x. c* W: S6 N9 i8 S+ `) p
{5 g# x: g3 |  e) l9 Y" C2 O9 a
    // 50% 占空比
8 J4 u) T. T1 c$ z5 Y6 L    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
1 _" Y6 @5 g8 G- L    // 4 分频$ Q, g. q' Y* W0 l
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
9 S) w8 b4 C5 w2 y; i3 L3 r& Y    // 单个脉冲宽度
+ h* `) F5 q1 A1 p6 B: Z    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);( Y3 _0 }# L( q
    // 使能斩波子模块
1 K5 b- p1 |6 u5 f    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
5 f2 U8 I# O" {* P$ ~}7 r8 X" ~  h2 r# @  I( i

) ^4 n% W& M  s. I! B# J, ]/****************************************************************************/" P% a! c# h: B! W) m
/*                                                                          */
# ~% ^- m; m8 {- k* \3 a/*              PWM 中断初始化                                              */; G9 D! p6 k7 C( ?& B5 i# T9 ^) H
/*                                                                          */0 m8 ^3 `, b3 v7 F. j8 ^, x& q
/****************************************************************************/6 w3 O. a- h8 b: o" u. d& Q
void PWMInterruptInit(void)
+ I: t$ [5 o, W: k" l# C  _& P{2 {( m$ w7 b( `  z
        // 注册中断服务函数8 a2 x. Y4 ]% k( o0 i
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);$ T4 [, L$ M! l  Q8 B5 M- O* Z6 Q
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
; N, ]4 b' a1 [$ r. ~5 E6 K+ J! R+ h! c5 G1 D& _* b
        // 映射中断
5 D: m1 s3 p& ?6 X; k9 u/ s        IntChannelSet(SYS_INT_EHRPWM1, 2);
# |7 O0 L+ Q1 F8 ?- H2 o5 w$ B0 Q) L9 y        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
& ]" v- h" P5 s: p
: M# I1 n2 d# z# d5 j; X        // 使能中断- r) O4 k' e7 ^3 Z/ R
        IntSystemEnable(SYS_INT_EHRPWM1);4 K$ a: ?9 H0 V! ]1 k9 x7 W
        IntSystemEnable(SYS_INT_EHRPWM1TZ);
' L% D& N1 e( |2 M}
: a+ a0 j( c4 ~/ s* t" t; \3 a  a8 J" }5 L/ f& p: f: \& ^2 b+ ~
/****************************************************************************/, q' j" z; ~  x( W1 Y' f7 n
/*                                                                          */
, V/ Z6 F( y& P% r& _& U+ O/*              ARM 中断初始化                                              */
( s; _& a8 {- J; c) \9 g/*                                                                          */
" P7 L/ ]. S! W/****************************************************************************/
5 B( j/ p, @, Yvoid InterruptInit(void)
( {' e  m1 z2 {3 l! X{
" d& Z) z& D, I  |/ b( G        // 初始化 ARM 中断控制器  P% j, k6 v% u0 B7 f
        IntAINTCInit();/ @. G  T3 f- J0 t# ?

: f& i: V- _. }5 |) x7 ^$ U        // 使能 IRQ(CPSR)% m: ]( G1 _" Q' x
        IntMasterIRQEnable();
: h* h6 n& |) [$ Y$ k5 _& [% b4 M. R% u$ ^4 y, d
        // 使能中断(AINTC GER)
! \; {' m! `% @8 x) C7 \        IntGlobalEnable();
; o9 A7 Z. h7 q! ]4 T/ h+ s9 n
9 g/ |5 R% O1 f) x% |6 t; R- y        // 使能中断(AINTC HIER)
3 X' c. j! q) |        IntIRQEnable();" m1 D( q8 J( q# t
}
8 O, h3 }8 m9 j
7 W( j" h. x/ R& R4 t
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/
) r+ ~( i! l6 ~5 m/*                                                                          */
- |0 ^& w6 W, O) K9 K' {/*              中断服务函数                                                */" o# X4 ~* k. z& {* r! I) y0 a
/*                                                                          */8 w( _5 L) t8 E! d4 G
/****************************************************************************/; m0 c9 d8 F3 |8 I& T% O+ h
void PWMEventIsr(void)
9 E  O% n6 B' ~. t) n' @{
8 ?9 p) z; {% H; l$ U3 M3 ~) L        IntSystemStatusClear(SYS_INT_EHRPWM1);# ?# V* V# |+ a* V$ X
6 [/ i% [6 ~8 Z0 }1 i. f
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);1 ?+ V4 B% I7 X# |. a: Y1 Y0 c
}
% }$ ~! D+ |7 ~7 `, S8 r$ ^' ?1 Q' P) E: _) b& f: A
void PWMTZIsr(void)0 N# E% w; \5 V9 n* J, h6 K
{
0 s8 e" C/ c; h6 \0 x        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);6 I) |5 v8 [$ H+ H

( J; Y% \2 S) [; Z1 M* Q5 ]" D5 z    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
; d3 P+ Q8 @+ r}) }$ O. S/ G- u9 y5 r2 }0 P' ?
1 T& C; h4 l2 @0 c9 H
/****************************************************************************/
/ R1 ]; b7 c& }) |$ C/*                                                                          */
0 N) y2 u" S4 D8 L2 w/*              初始化捕获模块                                              */
* m% B- l8 j5 h* @/ l/*                                                                          */
. `8 E: Q( ~9 N4 o% H) t. M/****************************************************************************/
/ q& B0 V% j$ V# @1 M/ dvoid ECAPInit(void)
3 k6 `. I: ]# s3 E/ i' b# B* A; M{
7 @& z3 A* k  s  }: j- p. }        /*-----设置 ECCTL1-----*/2 d. _7 m7 s- D9 Q  H( D
        // 使能CAP寄存器装载
( X6 v0 C: S' u, {9 N) t        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);7 M, g& U7 t% P; J
        // 设置预分频值.
* J) h) V& [8 X; `        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
4 m, e. ?9 w0 O+ G        // 上升沿触发捕获事件
9 D- A; m$ [9 o8 g: Y        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);) y2 I3 E; ]4 `) }
        // 输入捕获后重新装载计数器值.9 s5 y4 s% `, y; ^
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);$ i, R# v* J9 I3 A' o
6 A* Q; V  L; N$ ~) [
        /*-----设置 ECCTL2-----*/
. v5 R" F- o& s, w3 D+ B        // 连续模式, R; D$ u) L. ]; j8 }4 d
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
9 J' M+ Z# n0 P" g9 M; l        // ECAP计数器TSCTR持续计数) r  l8 a8 O& Q; ~2 l& t2 r( r  [
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
. N- v3 n/ w0 a: M5 Z! R        // 禁用同步输出和同步输入
% P; c& J' z+ W# {/ k/ _3 d5 M6 q        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);9 \. a5 H7 w  h/ g! S7 |
        // 配置 ECAP 2 为 CAPTURE 模式
1 \  B, `2 K7 R* r7 W) l        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
( ]/ u0 ?2 h$ M* _! S; B: A+ ~2 o1 @& _1 d) l$ `
        // 使能中断
1 f6 @0 O1 O( @( s7 a- x# b//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
" ^' ]7 W7 |3 K4 O: l' K5 Y+ f}6 o/ h- u7 h1 Z) z% Q

5 W3 k7 z8 ]4 P% V( G) X/****************************************************************************/
, C; b+ ^# M5 n: ~1 A3 d: L/*                                                                          */( t9 e( e0 l7 W
/*              取得捕获结果                                                */
" X9 Z9 P9 O. j; w# F1 E) O: s7 c, c) K/*                                                                          */
$ J. q1 z' x. y( I/****************************************************************************/3 z9 S. k/ L' x
unsigned int ECAPRead(void)& f& R  N3 t# w# A
{
7 M/ [( d! [; ^) C        unsigned int capvalue;
/ j8 G* f. s- x7 _- a% `: d        unsigned long frequency;
& Q1 }5 a) G9 u9 {
# u* V4 a3 y7 ~- m        // Event1 中断标志: F( f% _* m; [8 \+ j" m/ R6 v
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))% o- E; t; Y! a0 o
        {
9 `$ ?& C% f) W! J- z                // 取得捕获计数
! M* R+ J, c) E2 V) N                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
# G- L' I9 j" i5 B( j2 N$ p( n" r                capvalue = ECAPResult.cap1;" X7 d) r2 L3 G/ R6 {# z: `

: w& H- H6 B. C* z9 H                // CAPTRUE 模块 228M 时钟主频9 _: i- y- R1 E6 b: u6 G' d
                frequency  =  228000000/capvalue;
9 z4 u* R' k5 U' G                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);- ~& d4 {- @# q
6 C4 P+ f# S" h+ I
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);6 X+ \% T( j* ]0 r1 j& P
//                IntEventClear(SYS_INT_ECAP2);
3 \/ k; Y/ ]4 A% @        }
2 C( ?6 s" _) y+ E, Z8 ~% y        return frequency;8 k) y4 V  e/ C+ h
}
- g9 x" D  Z& @
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
- {7 d* i+ ^8 i. X/ m5 z; {[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