嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家. e# d+ O6 K% X% }. W2 V  n3 q

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
, g/ ^# a( _# O/*                                                                          */2 z- e: B( {8 U
/*              宏定义                                                      */* M: Q' S+ j- ?- Q* d
/*                                                                          */. P4 m6 d& w' f7 I  X
/****************************************************************************/
/ @+ A; r- L! N1 b* I( I/ k// 软件断点0 E  ^. `* P8 Z) E4 Z9 Y: ~
#define SW_BREAKPOINT     asm(" SWBP 0 ");
, m" ?3 ~2 m: ]" z( i
3 c! U, ^! ~4 k2 X5 [// 时钟分频
* \' @) o' N2 G#define CLOCK_DIV_VAL     2287 u5 j8 p0 z$ N4 c) S* |( B! }7 ~
9 J# T# P2 i0 B; j
/****************************************************************************/
9 J) C6 a- k( h/ e- ?/*                                                                          */
3 d  z& n& E+ y2 G/ B+ W$ T& [/*              全局变量                                                    */; g; g+ V: L( i# W, {$ g3 ~6 s
/*                                                                          */5 k9 j! v3 q- P
/****************************************************************************/
- X2 Y0 X  x5 r# I3 j1 m: HECAPCONTEXT ECAPResult;7 {: R+ A) \; U. G& X
, t& t1 S& Z6 v+ q
/****************************************************************************/5 D8 ^$ x* I2 ]5 D, @/ N
/*                                                                          */
5 g- \  H3 M) e/*              函数声明                                                    */
5 T$ s, d4 a6 t; N; Q: X  ~0 S/*                                                                          */
% G* T. V6 E. |+ \5 H, B/****************************************************************************/
( s7 n3 ~/ W9 }5 X// 外设使能配置! l5 `/ V3 c7 p
void PSCInit(void);
! x# d9 F6 y. w" [9 V0 W2 \2 i
1 v, [3 y9 }5 Q- d0 X// GPIO 管脚复用配置. c$ y7 S  z& m& g3 Q% _
void GPIOBankPinMuxSet();
- x. r# ?' p5 H8 K& l, r% A# T3 ~0 B% K- K& @0 }$ S' S: H
// 产生波形; L3 D( u' d1 N6 a. B& M
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
9 \, g; W2 L- r$ {7 evoid ChopperWaveform(void);* Y- S9 y7 z* s
$ [+ x4 E0 T' @; a5 c* Y
// ECAP初始化和读函数
, i9 d/ A, l3 [% j" F& @9 I. y( }void ECAPInit(void);- }/ H( r+ L; u: T! X
unsigned int ECAPRead(void);0 t& R8 j$ A( {# J9 O

* d, [: s! j  P. I7 t9 P8 {( }//ARM 中断初始化
* W% Z! H0 a& C$ `% R4 X* `void InterruptInit(void);6 E, d/ k0 ]( e& f8 v" p1 {' F  L

8 I. h4 x& v3 |/ K' p  ]9 i// PWM 中断初始化
0 \* U* t! z3 R+ v- I# mvoid PWMInterruptInit(void);
8 S) f5 x# z9 O4 x// 中断服务函数/ U- J1 c$ Y4 U: c$ _' {) v3 w3 a+ A
// PWM 事件6 y2 O9 x" S# f, }% s' ]. u
void PWMEventIsr(void);
" Q% T( f; K" H& X' D2 [9 A# Q* T// PWM 错误控制事件
& X( r* ]2 n' g4 C; L5 s+ q5 zvoid PWMTZIsr(void);% @( x  t  u, p$ v* l! O

, y6 O4 j/ P* c/****************************************************************************/& R' ~1 _/ N8 h
/*                                                                          */" [- _' x. c. J& `1 X
/*              主函数                                                      */0 P% A- U% g- V4 Y
/*                                                                          */
; e1 l4 S9 J8 F$ T/****************************************************************************/3 n9 @- r7 v8 E5 G! }
int main(void)
- D3 A  X# U6 ]" {{
- L& p; g( R1 y  s6 y4 R        // 外设使能配置! _. e6 u' b; h; \4 L
        PSCInit();
7 |! D& x& B* t  [; ~% M& s  b7 k) _$ ?# Y5 L
        // 初始化串口终端 使用串口2- o2 k& h/ N' n6 }$ S
        UARTStdioInit();( [. J) T- d$ D& X& S
       
' R: a1 h% l1 i$ J6 ~; O$ j        // GPIO 管脚复用配置
6 x6 V" W) J! j" M; V9 Y        GPIOBankPinMuxSet();
4 k+ C! o$ d( l9 Q! F0 ~4 O/ _
2 y# ^- @+ b: h. U- L8 b3 \6 T        // ARM 中断初始化
+ h  U% H6 U6 }/ d        InterruptInit();
; z3 W' r4 z2 o% M  q$ W0 {& b; P" Z
        // PWM 中断初始化: r$ W8 M8 i. x, }4 @
        PWMInterruptInit();: {5 p' h' X+ v* K7 x3 j- _( }, D

+ ~9 k+ f% ~- x4 M, D! Q- p2 L        unsigned char i;: I: j8 H+ K! k* F% H; r
        unsigned int j;  _* z" `, G; b

) d1 i, W4 ~; H+ Y# h, N3 O! ^        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
9 q/ X; g3 l( }- z/ C        UARTPuts("------------------------------------------------------------\r\n", -1);6 Z. {8 E- i9 m" U' f: b
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);$ d* Z" L& I& F  j( E: n
        // 产生波形
0 z: P' E3 ^& ^* z% P$ U4 u        PWM1ABasic(25000,50);
% ]$ X% s5 g6 n' `: S- Z$ z7 W" D* l0 o0 T0 ]/ g2 w
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
" N1 w- d9 V1 N2 f. z+ Z        UARTPuts("------------------------------------------------------------\r\n", -1);
+ a2 K, T3 u% k1 e# w# e
9 M# O7 W$ t/ q7 y& Q6 E+ v5 a* O" o

& }' y, r* X& `+ O; v% J% Z        UARTPuts("------------------------------------------------------------\r\n", -1);' j% O5 f; s- Q* Z, d8 D
        UARTPuts("                    C6748 ECAP Test\r\n", -1);$ I' [9 u1 \& u5 p" {) f
        // ECAP 捕获初始化, E& a! b+ |  [# T" }, ^
        ECAPInit();
: [8 E& _! S( ^& S        UARTPuts("Initialize ECAP.......\r\n",-1);' C! m+ C. B" ~, }8 `! o
        for(i=0;i<5;i++)" x( P% l+ m. w  o/ X+ v/ I
        {0 y/ x) A) w- s+ v% Y" h. Z
                    for(j=0x00FFFFFF;j>0;j--);            // 延时
1 q3 [# _3 B2 ^6 `  U0 M                    ECAPRead();3 r1 k9 r9 |3 `& H& g
        }3 w/ z; L( v8 n4 ~6 s4 w7 n
        UARTPuts("\r\n",-1);
3 e! s( ~+ I+ P/ c% v% M# t        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);5 E8 R5 `* i/ X9 i; K( H! K/ X
        UARTPuts("------------------------------------------------------------\r\n", -1);
! h9 p' U6 b7 }6 L3 _; T
9 `! O0 Y; s: w5 B        // 主循环; ?9 O; r" I; [! o- i& }
        for(;;)
# i& A1 P' @# ~. u/ F: R        {% d7 g) m# d" O0 ^0 N8 i

4 A+ l" E8 R- S* I        }
' |- f9 y! @4 E/ r}, U8 T+ ~( h2 F5 e9 |6 r5 s
. U: Y) a% T3 w0 z1 l
/****************************************************************************/
9 W) Q- O6 S- r9 ]; x; E, A/*                                                                          */. E8 u6 D% T* A0 U+ i% i* C
/*              PSC 初始化                                                  */2 E( ^* I( e( ?  w
/*                                                                          */
1 @* q- |$ f5 g' g( o# x5 ~2 j/****************************************************************************/+ _; Y+ T( {' Y
void PSCInit(void)9 U) E6 d" m) b& d6 P
{
. G8 A+ O' E* Y, L        // 使能  EHRPWM 和 ECAP 模块
+ c4 `: a0 c* \6 N! M  W7 _+ d        // 对相应外设模块的使能也可以在 BootLoader 中完成
: Q* w/ L; c! h    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);4 n2 R% |) P2 Q
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
  O1 R) \, }1 k7 m& ^: \}1 F9 j' K8 t; j& ?0 B

4 Q6 ^5 b  T9 @1 q* u9 y, o5 X/****************************************************************************/' N# A" h' `- s6 @1 t! G
/*                                                                          */
3 x$ D5 T9 W' a# r; [1 O5 Z/*              GPIO 管脚复用配置                                           */' T- M7 \8 C( p4 k8 W
/*                                                                          */
1 ~7 b: i1 Q5 ?  U/****************************************************************************/* s2 S7 J( \& l, S) m
void GPIOBankPinMuxSet(void)
1 c8 [0 y5 f' X% d{+ b4 K8 y$ ^: f
        EHRPWM1PinMuxSetup();3 G+ P5 o6 ~4 l& y) F( a
- G# l; ?5 J8 W2 ^$ B
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)0 E1 u% t. D$ S: p
        // 作为捕获功能时管脚方向为输入  o% S2 N. C$ Z) A, n0 {
        // 作为辅助脉宽调制时管脚方向为输出
( q# ^4 r0 W1 ~9 G( t2 W$ r    // ECAP2 / APWM2
: Z0 m$ e/ ]3 Z+ t$ @& W        ECAPPinMuxSetup(2);0 }1 P2 }. L! l2 N3 j7 E" W1 E
0 R& H, b. P. [, H7 U0 Q
        // ECAP2 / APWM2方向设置为输入5 n  p" j1 `  _& Q
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
# T9 [/ T9 R% x0 Z) y6 J}
  r8 S' @7 N4 S% f& U1 X' y8 T: c
/****************************************************************************/
: Z! p' p0 N* e& L  F) l3 G/*                                                                          */( z5 r: Z* d: T2 W6 ~: e( {, d
/*              PWM 输出波形                                                */1 q0 I1 E2 P1 b( x" U
/*                                                                          */3 C4 F# u4 Z9 M) a5 {, A2 K9 ?% D8 p
/****************************************************************************/9 E+ {. Z8 ]& w* _* x1 T
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
1 ~$ d3 X! \- h% l. ]! s- F{1 ~5 s4 \( J; U, l
    // 时间基准配置
0 i$ U2 s) h0 d' e8 M. u- ]2 M0 D    // 时钟配置
( P( j& M! A, K/ k- B    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
! s+ G% q# I6 v+ E1 r( e
2 K) W. w( V1 I    // 配置周期
$ p/ f1 ~* ^' g  C4 o    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,% a6 g' Z/ S0 H5 r5 D
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
: e* D2 X% U: c7 J3 G
7 n, C# x" Y- g# k    // 禁用输入同步信号8 k9 a' Q$ [4 R. |% \$ [! L) |
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
2 I% V( F  q: T( C% G. H6 K% P! o8 _" i$ \; r$ f- [$ K* X
    // 禁用输出同步信号
! n' x; G' k9 i/ ^, ?    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
1 c+ _+ T3 M* k
8 u! D. j3 ?0 x2 R8 |8 g$ C- a) b  U    // 仿真(DEBUG)模式行为配置: i: p: o$ G5 w2 a3 T5 F
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
) m: E+ P# u5 v
, L3 D% t% x8 b* a* p    // 配置计数比较器子模块  G$ S! ^3 o: V1 z. N- t
    // 加载比较器 A 值+ s7 t; ~% f" _( \/ M% R
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
. s; S; g: ?  s                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);' f# i' q2 a) h, v  e/ L

3 O5 H8 r: u0 I/ ?9 q    // 加载比较器 B 值5 q% Z9 X( s! |2 Q4 M6 j
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,, O" z9 i: a( v+ v- k& L
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
# z& z8 Q; Y1 ?/ T- a6 n: E# q- B- Y/ a
    // 功能限定配置(输出引脚触发方式设定)" J6 a# _! w5 l( R, c. p
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
: E! f' }, N) L    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
- q. Z" C6 z* K+ }" c1 Y% v                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
2 S5 ~: [6 `) p7 D  t$ S$ X5 T0 s                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);2 ?2 E$ f; c% [+ R# H% o9 B

7 ^( w  X- j! \8 e2 L1 R' [9 L    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
$ L3 F) F, @- A5 ]6 c  v0 |; M    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);% d9 T) s1 M7 s( ~) `

' N; T/ m. g9 r3 F+ Q    // 禁用斩波子模块
6 n) x1 d% N9 @$ y8 e    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
1 U1 Y9 S1 X+ v# L) z" \! `( a7 F9 v
    // 禁用错误控制事件
+ @9 F1 W; k: q* a3 h+ z    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
: |% |. f0 e1 t5 o- j    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);+ I$ l5 X2 c1 i
( S( B& |% H( ^# F/ L
    // 事件触发配置2 v+ g# j/ Z& B' R, y- A  C! e0 C
    // 每三次事件发生产生中断3 B5 y- P/ G6 i* e
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);4 \/ v  f& A! e. E) K
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件) e" t: V" ^: N! j8 W  f
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);$ d. u8 t2 P: P# j* N
    // 使能中断
1 b9 e( `7 i% z$ Y5 w5 @; ~    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
5 h: J% k8 t& f, p3 v" k# h# M& H& @
    // 禁用高精度子模块6 r' m% n$ c* E( K2 o2 I
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
& d8 q& X. q0 V  D! v' I+ t3 x- {% }: ?" f3 Y/ ]; M3 `
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);  N6 r$ X' E/ ]4 q/ f
}
; `/ Z" T  W- G& J( `8 w; A, o  d& X) Z) h' m
void ChopperWaveform(void)
6 N1 I* `: x3 r0 @( Y' c{
6 p2 E( r8 C9 q4 p    // 50% 占空比* q, w; ^+ s7 n  L0 ]
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);5 [6 |( P1 P% r5 G7 G# I+ I3 N$ P
    // 4 分频. U! x0 ^/ t  \6 D+ L
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
4 \: k4 F, ^3 y* j9 W$ ?- ]    // 单个脉冲宽度
4 Z/ C3 r) l- j) c" u7 y    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
3 P/ x; S. o5 U# O5 P  L    // 使能斩波子模块2 H, @/ t+ D  z1 ]; j3 L$ N0 N
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);# d. u2 v$ ]" }: u5 }5 n
}
' Y2 `- ^" c7 Y; M% @) i( |3 V5 g1 W% K: p9 \# }9 T
/****************************************************************************/
' E% c- e/ K: D. |9 E/*                                                                          */$ U- q3 m0 H& E8 W6 j; u/ ]9 }
/*              PWM 中断初始化                                              */, q5 ~% h% K4 L# W' M
/*                                                                          */  i7 j* [% J$ v# a+ k8 B! c
/****************************************************************************/5 d0 P4 ?4 ~, Y5 @0 R. o+ U
void PWMInterruptInit(void)# L1 X8 Q8 z& P, j2 a0 \+ L
{
8 H# i+ y% V6 F' N        // 注册中断服务函数4 B0 J8 }  e; I8 V
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
1 ^2 ^7 G$ \5 f) c( {+ F5 |. o        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);" `9 \0 L) J. n. y

9 i4 {/ U% |1 Q. f+ ]        // 映射中断
# r& B% p! a0 j% h! J3 V+ E        IntChannelSet(SYS_INT_EHRPWM1, 2);5 A; Z5 o: W" L5 m0 O
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
0 Y0 }- O0 B6 g% G
/ ]/ }$ Q4 B! p) Q; U) b/ C        // 使能中断* u( R7 V6 A" j
        IntSystemEnable(SYS_INT_EHRPWM1);
! j: G6 H- M/ H0 ~8 j: N/ `        IntSystemEnable(SYS_INT_EHRPWM1TZ);2 B7 k  U( {  Z9 H& a- O
}9 s! F  t5 x0 H

6 B9 J. J7 m/ N: m/****************************************************************************/
% ~! A( P6 _' i& V- q* ^# A/*                                                                          */. V, J0 S; B: i( J
/*              ARM 中断初始化                                              */
0 m& T' c7 G% D/ W( o; \; w  F' G/*                                                                          */
; a, U& s" ?" G+ E- |% J/****************************************************************************/& b8 A) I6 q  f/ B4 g+ [" b* Q
void InterruptInit(void)
6 I4 z) _; \3 u1 I, u8 k4 p4 y: ?{" n$ _" f7 [0 a  J: d6 L$ {  Z
        // 初始化 ARM 中断控制器
, Z* ?! x8 L6 G        IntAINTCInit();) R) F( W1 e$ K: ~/ @! T- G
; e2 `7 v  U$ i6 A5 j$ b4 B; c
        // 使能 IRQ(CPSR)' `# ^: }9 K2 S! s0 k7 t- g% r# @
        IntMasterIRQEnable();
- u/ V2 ?! H, g
4 r' |) z" [5 E+ ^+ p6 O  t        // 使能中断(AINTC GER)
) h& r" X( T6 b- D: v        IntGlobalEnable();& X) T+ b2 p4 U! m3 |
) M! U8 z5 C$ o8 y9 b
        // 使能中断(AINTC HIER)
( T, ?8 g. J! A9 L        IntIRQEnable();3 I8 U& w+ M! i8 }' E
}2 c* y6 g' t3 f+ [& a7 J) N

. [5 ~, j3 F) q4 t% a4 }  ?
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/% D" I+ I0 g. ~: }/ U) y. [
/*                                                                          */
9 K/ q+ P  u4 h& F/*              中断服务函数                                                */5 g( ~& j7 R/ {" k
/*                                                                          */+ o2 N/ E0 y3 l$ s2 G" p
/****************************************************************************/
- O0 t; V5 r: [- D0 b  Evoid PWMEventIsr(void)
7 h- u3 E% {& a% `4 A- }, T: a{; D" i1 H# ~6 t% e  v
        IntSystemStatusClear(SYS_INT_EHRPWM1);& X$ a& H; m) X/ S

) G4 e, R- r* m    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
  }4 i6 y/ ?7 A6 w}
$ |; e2 t& k- a: _+ T8 _0 U( d% Z  w' O
void PWMTZIsr(void)2 W" v/ a8 ^2 C/ S% S
{
' W3 _5 q1 }7 a: O% Z1 W        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);: P% J( k" a2 E4 M0 l; g- s5 |5 N
$ h2 l! q, w  E9 N# g. ]1 m: M& Z
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);5 L, e6 _0 ^& U: @1 t! e4 Z
}  H- [- t8 C6 c4 Q6 P3 M$ v- U
& w, ]2 x6 \' C8 ~! Z
/****************************************************************************/
6 H/ p" e. a' W+ P: `1 F/*                                                                          */
5 S8 d5 _. A: H1 A6 R/*              初始化捕获模块                                              */% v; D& t0 m) @) W  W5 L
/*                                                                          */1 Y  o+ ^; Z/ o2 I* e
/****************************************************************************/
' P8 {( C4 @+ s( W+ Gvoid ECAPInit(void)2 h/ n/ C& p+ I% Z9 A
{
1 x2 ?* I2 K( z! C: ?* x, m9 p        /*-----设置 ECCTL1-----*/
( c% t% K1 H/ x/ m& T        // 使能CAP寄存器装载# G3 t- L" V3 X- T
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
* G0 w  y. @( t/ J9 x, a        // 设置预分频值.
) }) `* D4 r+ X; Q- ?, j! l, k9 t7 y        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);7 }3 @/ r7 K1 p, l9 T' D# N/ V2 d
        // 上升沿触发捕获事件
' N) y9 P9 Q! J( D        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);; F9 ?  V( K3 i: Z1 W) n
        // 输入捕获后重新装载计数器值.
" W2 i. V: [* v) r        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
- c: o9 {+ }# Z( P+ Y
1 S8 E! b- k% Z2 W$ A6 \        /*-----设置 ECCTL2-----*/' i& B8 {& e: g% a' C
        // 连续模式
3 M8 I2 q4 W) L8 T  S1 i        ECAPContinousModeConfig(SOC_ECAP_2_REGS);7 a  w8 P' n5 C; C) u
        // ECAP计数器TSCTR持续计数
) J) R' y  R0 G% \        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);7 \" A- @4 Q, E2 t; v( R+ F8 }$ Y
        // 禁用同步输出和同步输入7 e% _8 M  v) T
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);0 G4 x2 {8 Y2 }
        // 配置 ECAP 2 为 CAPTURE 模式
5 v4 f2 f% [& ^# r! s        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
) X: c6 C/ _& y  Z: q+ L. D+ O/ V1 h, {- Y! |
        // 使能中断, i% b; E* n! D& J7 z7 ~4 t7 m
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);7 @/ B) P4 K6 O# b
}
- @1 e! k7 M0 ^' T! Z
5 I: F0 x# J4 A' q2 B8 G/****************************************************************************/
. f8 _4 @' d) {( f5 g5 U- t/*                                                                          */
& o5 a1 K! L( T; _; n( B/*              取得捕获结果                                                */- G( A  s) Y8 D" u! {% _
/*                                                                          */
7 [" ~4 f' K8 K. Z5 z" s/****************************************************************************/
9 h0 O% i5 }  [8 q: Dunsigned int ECAPRead(void)! ]) e# h8 o: h5 C( _4 j
{/ A9 @9 G' x5 f4 h. j4 H
        unsigned int capvalue;# M3 L  J; ~2 ^7 b0 q3 f$ F8 a+ @
        unsigned long frequency;. ~1 T6 e* R4 }$ q: u# j2 \

  B. I+ \. u) Z        // Event1 中断标志$ O: }! i9 I) v5 m' f2 e
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))& T! d- @* M' k  U  ]4 @# i+ y
        {
- Z. R. l# D4 c$ G0 E& a, T                // 取得捕获计数/ b% L7 o; m9 B; \
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
1 }4 c, c" C3 I                capvalue = ECAPResult.cap1;' y% d, [: u% a! H. h

9 ~* K. ~8 h5 i# E! n                // CAPTRUE 模块 228M 时钟主频
: H7 P+ U: R  t, [( Q4 d2 \                frequency  =  228000000/capvalue;
; i0 y* O& y% a; R  G/ e                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
# Z! m% h7 {$ V' v6 l% I: R# _  K, \6 u- Z, i" J, D
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
: ?8 Q" b+ T# i/ o//                IntEventClear(SYS_INT_ECAP2);0 _9 T$ X' e6 f- L
        }
* E& W5 P: [/ [; ?        return frequency;+ c% m* l- q9 U) i0 P5 ^& d" z
}8 ^9 k& O+ b8 A* z3 F" X2 A  U) O

作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
. k- m$ d$ n( r8 P( Q4 Z& I+ A[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