嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
- \  G: U1 r3 X$ L4 p  n
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/8 t1 k+ E' i$ ?, b7 ]: @5 b
/*                                                                          */5 K5 V# M4 }9 c9 \; j, V1 c! y
/*              宏定义                                                      */
: @+ g9 s4 q! G* l3 u! t/*                                                                          */# b% O1 a. I) t7 P$ }6 ~+ R& J
/****************************************************************************/0 J, c, ?$ |  y' L2 w) ?9 b
// 软件断点# `5 W8 X! J6 Q( b; }- I' }
#define SW_BREAKPOINT     asm(" SWBP 0 ");
1 k8 R6 ?" H  n/ d
  [5 i9 ~! X* z8 P# s' B// 时钟分频
& m0 s; n% g$ V#define CLOCK_DIV_VAL     228
  f! J7 G* y, J1 r  `
2 L3 o9 }( H4 }3 z1 G* s/****************************************************************************/8 F, y2 ]5 B% n# s( g4 ^" y# O
/*                                                                          */, v8 r" S9 d& d) n. @2 B
/*              全局变量                                                    */
% v6 E! |! V) C/*                                                                          */; L  r7 s$ q& e! C' B' ?" G) i
/****************************************************************************/; O) k3 [8 P2 W! ~
ECAPCONTEXT ECAPResult;: ?' p1 y% ~; J8 @- r
& {' e9 R- M; W$ s
/****************************************************************************/
/ P, ?0 ]1 L% c- q" w! s/*                                                                          */; _) D8 H/ ~5 a1 J
/*              函数声明                                                    */0 O0 P/ \+ Z, d+ {- r) l
/*                                                                          */% k3 n5 }: ^/ Z# M( e8 L
/****************************************************************************/9 j4 |  N5 W6 G! s4 B4 k. L
// 外设使能配置
0 \9 V% `+ p$ U% w9 b$ Q6 Wvoid PSCInit(void);; X' }; v8 A. o: b0 k, `
. a, W7 D2 E( Y3 m/ M' ?5 ~
// GPIO 管脚复用配置7 t7 |! Q; V8 H$ C! ~" T
void GPIOBankPinMuxSet();
4 M. Y4 i1 V) r. l" ]& x
* t3 o, t4 o7 c7 ~+ i: I" [// 产生波形
4 t% H8 e# W1 U" {( ~' Y8 Lvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);( a5 X6 n6 N5 B8 I& o9 `3 K$ t
void ChopperWaveform(void);
, ?, `$ p4 X7 S- K7 a3 Z$ @- w( O+ n) K: L' y* H" _' p
// ECAP初始化和读函数1 y% y; Q7 h4 Z/ x; ~/ E3 v$ R
void ECAPInit(void);
; V' t* k3 N0 f; D. k2 yunsigned int ECAPRead(void);# c' h! T2 @* r& {) C( h
" F) \1 u& r3 X- C# A/ @& X
//ARM 中断初始化
* M# R8 ~; f( Kvoid InterruptInit(void);4 E# f5 G2 r8 X4 j

" E6 q1 n" K+ H! }+ O5 q// PWM 中断初始化8 r6 v! C  |% C
void PWMInterruptInit(void);4 W  o  l# w. U8 R3 f/ D  f
// 中断服务函数
# y. M6 i% n5 p1 n  L) }. U2 D// PWM 事件
6 a6 x: K; u4 G0 j' T5 y* C  uvoid PWMEventIsr(void);" d/ b5 t8 U  `
// PWM 错误控制事件
6 w3 i! K2 u* K+ Avoid PWMTZIsr(void);! O7 c' z8 Q* Q( ?, g; }) l/ T& e

! w+ h  `2 {0 q, L0 W: F/ [/****************************************************************************/
9 |3 B4 g2 ?9 q. f1 o/*                                                                          */# G+ w1 N  x$ Z6 t6 O
/*              主函数                                                      */
; t  S& p* m& S: x( ~5 [/*                                                                          */3 c8 W8 I7 h2 O% Z' `& f" u
/****************************************************************************/& o" s  t5 c8 h( ?' [# u- l5 d1 T
int main(void)  P! [. E6 I, @
{
( \: a. L0 u8 Y) U        // 外设使能配置
7 `) X5 n6 l+ m        PSCInit();
* n- A4 a1 K1 G" s) L4 N, O+ V  Q+ A! k; U5 p
        // 初始化串口终端 使用串口27 G$ g9 H, C& ]- C/ ~
        UARTStdioInit();0 y- B& @3 `7 A
        - B3 E% K0 H9 }0 q
        // GPIO 管脚复用配置$ o7 Y) e% X% q8 a/ [
        GPIOBankPinMuxSet();
) a' O+ C3 |  r" D$ F) T* Q. m. }
        // ARM 中断初始化# C0 c* u% ]  z6 X6 ]! m
        InterruptInit();
; J# f+ r& o" Y  N! v% \3 _7 n
% V1 M5 K9 [/ j3 o" R: f        // PWM 中断初始化0 D+ P. \9 [! K( q1 |$ c
        PWMInterruptInit();
; `* `4 p# ~4 p& ~
5 B" f9 @" t% ~  i2 `        unsigned char i;
9 b' C9 h" X& t0 ]2 J        unsigned int j;
/ c3 U; ]  A9 Y* f! P$ ^4 n5 r
3 z8 y$ R. g: e9 t0 C        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
4 E9 N$ l) U3 X- G        UARTPuts("------------------------------------------------------------\r\n", -1);
- s% g6 u0 G1 I: _$ r, Z+ L3 q2 Y        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);( J$ e+ S$ U6 l2 c. f7 z" g
        // 产生波形
0 Z+ ~* p% r* W. o        PWM1ABasic(25000,50);
4 X0 Z: l2 ^5 C, X- B! L- O$ u# f  {+ g& D) B) a
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);! C8 T2 U4 Q" |0 c0 |2 V
        UARTPuts("------------------------------------------------------------\r\n", -1);
! u( C5 D& C  h% q! U. T5 f( i# i9 I

$ H: E0 `0 T$ Q9 I  v3 H! X/ t  T$ z! o
        UARTPuts("------------------------------------------------------------\r\n", -1);8 x8 {" `) g/ B
        UARTPuts("                    C6748 ECAP Test\r\n", -1);
" D$ t% H6 U% T& }3 W7 I/ Q        // ECAP 捕获初始化
: z2 U: t/ g' W        ECAPInit();
* t1 a8 [& t- j: Q( K: w! H        UARTPuts("Initialize ECAP.......\r\n",-1);* K$ O& E% H! }; ]  a
        for(i=0;i<5;i++)5 R1 L( ~2 [' {# I% V
        {
* z6 X) Z& c2 N9 [* p5 l1 L  v                    for(j=0x00FFFFFF;j>0;j--);            // 延时
0 r% p' U. G7 i                    ECAPRead();
' C1 H% O9 r# u5 p        }$ Y1 M$ K! O3 F# b/ Y
        UARTPuts("\r\n",-1);4 M! s( n( r: q$ Y
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);$ f5 ?  J! w# u$ s
        UARTPuts("------------------------------------------------------------\r\n", -1);4 A  S: M' c" E8 k) S# b
. w& }( t  d. j4 s: \* t1 R
        // 主循环6 u6 Z3 M- I/ ?" ~0 d$ _. B
        for(;;)
* V" v: t: _3 ^" V/ j  F        {
1 Q" U3 I8 d( B& e  v$ ~6 ~0 u, T# M% P: L4 U: P9 v# ?
        }2 G" l- q9 w5 g4 M* q
}
  `' `# F6 ~( O. t$ m& ?  x
0 l# u1 g( v* `: A4 A/****************************************************************************/
' U8 A' B  y% B) W4 q" d/*                                                                          */
$ E' d7 O5 h; r1 C& O% ?/ _7 B/*              PSC 初始化                                                  */# S  S8 P  b( i) N( D
/*                                                                          */
/ u- j. G! ?: r$ P( l/****************************************************************************/
; D5 {; \+ @+ O+ Ivoid PSCInit(void)2 C) ?" k3 Z; ^1 R$ {3 ~2 J5 g
{
3 `4 I  ]6 o7 o: P2 H        // 使能  EHRPWM 和 ECAP 模块
, F/ [/ n- N% y  f( f; Y7 Y: [        // 对相应外设模块的使能也可以在 BootLoader 中完成  ^+ l( s; q+ y
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
# s) _- ?7 T2 B, t6 I( V    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);- H" _/ k+ k5 O# d: J  z; k
}
/ d3 s( Y8 m  y) h9 n# O( l( @$ Q' F5 b3 p( r* h
/****************************************************************************/5 `" a+ n( K) G  Y8 M% n  i* n6 W6 h
/*                                                                          */
9 V, Y. m9 w- H/*              GPIO 管脚复用配置                                           */. q- l5 E4 y! g2 F& V
/*                                                                          */
! ^& z4 m+ N! ]7 A/****************************************************************************/9 \5 M5 A- \# Y8 t6 P& r7 H
void GPIOBankPinMuxSet(void)
+ k5 `4 O0 f! |3 A, t! t{
  c7 j* k2 I: [  G        EHRPWM1PinMuxSetup();2 s6 n9 b$ E" p  q
$ H$ t8 M9 V/ v/ P
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)$ d3 q- U% P8 _; i( ?* d+ e8 _
        // 作为捕获功能时管脚方向为输入/ e( K  A/ N2 l2 i- P0 J3 l
        // 作为辅助脉宽调制时管脚方向为输出: m/ S, p$ v! E( }1 U7 J/ a
    // ECAP2 / APWM2
) F) t% {" B! i2 [" Y/ M        ECAPPinMuxSetup(2);2 J6 O- M1 z1 \; f6 s3 j
) }# E" s8 k& _# G4 @! ^! A$ H4 i4 l
        // ECAP2 / APWM2方向设置为输入0 J6 c; I6 F4 Z- @' N( s( \
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
8 l1 U5 E3 W- j3 |# w' \}, x9 k' F( M+ b4 _& q7 D$ _
: N5 t* a- |3 H
/****************************************************************************/
8 J7 X. q! [7 ^- ?' r4 O/*                                                                          */5 w0 ]3 p; y  n- |
/*              PWM 输出波形                                                */
8 i& }+ ]3 \6 V7 R* h5 j  g/*                                                                          */
5 l. y, o( P- T. ?) j7 u/****************************************************************************/1 m- r1 ^8 V3 p! D" }
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
" i6 S3 E" v& S6 z) x4 d{5 ^. s% Z+ y: r1 `+ [; H: E' A* v- z
    // 时间基准配置
( j% f0 A% g- G' d  B    // 时钟配置
" }. k6 \! Z0 Y$ V    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);! l' J! J- X, n0 F2 D# @

( y- s: ?9 E# B    // 配置周期2 w( p+ a- J. g- C
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
' w3 f0 g% }3 V5 T  H1 {                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);" ]9 Y6 h5 |% E' O

( o  q: r1 j2 b0 V    // 禁用输入同步信号9 N2 V9 }+ R& ^2 ]
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);% {7 @6 ^5 d8 @9 p: B0 e
0 x8 T( Y( ?7 l4 z1 @: z; s
    // 禁用输出同步信号
$ U* R3 i* i1 c0 R    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);2 ?; k* m* G* m7 B/ }7 B! X) F

. r6 J+ V: y' R  v+ Y2 j    // 仿真(DEBUG)模式行为配置
, V3 m2 H4 M4 e    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
+ j6 ]4 Q! P: v$ X3 H
' E+ l# M9 b% G, K8 `% D    // 配置计数比较器子模块5 x4 s( g4 u% A9 p; n( o( L4 x# }3 U
    // 加载比较器 A 值
1 w/ W# H) c( u4 T9 d8 ^' O7 u    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,& P! Q5 |; E* m4 i7 }2 u+ }
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);9 P$ Z- Q( v; U9 x: d

4 T" p" E5 T9 {# r! s0 e    // 加载比较器 B 值) _- |1 ?4 j0 o+ S: w" U, h
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,' v- `) f6 [5 o6 X% I
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);4 b/ m& _6 s5 \# H# n, M

( P8 R, Z* z- o* x( s$ a5 Y    // 功能限定配置(输出引脚触发方式设定)" T' c1 H4 Q" B4 w5 x; r
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
, a7 R- J9 A6 R5 ^$ ]( g    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
& ?- u" ]$ J6 U: ~' n( Q" y                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
. I$ h. m! W4 S3 c2 [# t7 a                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
" m  ^1 K6 X. f& l1 Z
6 M& X8 ~; ~5 Y5 o% o8 G, L    // 禁用(旁路,信号直接输出到斩波子模块)死区模块) f1 [$ M( T8 x- n* s
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);8 t# g8 s3 W: a
6 i/ I  l9 U, e' Z: C( \" f, s4 b
    // 禁用斩波子模块) R: |/ |$ H, n  j
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
, B6 [( o( a0 i9 [1 n  a* ~: p' ?  u2 K+ c9 J
    // 禁用错误控制事件8 W) ~  \( X4 a- N, |; w# ?
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
) U. H  M! l9 |( X( P% a) j    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);4 Y4 Z- }% R- ]) W1 J* L
& A+ y1 j' U/ Y
    // 事件触发配置- ?' y5 Y9 G' c. V! d0 H) m" z
    // 每三次事件发生产生中断
; l$ M0 P- ]1 F4 m    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);0 H6 T( s8 d/ C, L
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件7 q- }' B* S3 v( w
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
, ^/ m# x- x. q    // 使能中断. f) v+ t' i; F: h8 T
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
3 Q' v% ~( r2 A5 d6 T8 m2 \4 l+ \' t* k0 T" L- I
    // 禁用高精度子模块
8 E" i2 N: L7 h# ]% L! [% e  B    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
; E7 P# J1 P4 z+ o
8 o9 k# H; _6 [. P' v( ]0 N6 J# m    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
, n8 `/ a1 S+ P' C6 k* g}
% w- n, `2 A+ {% z8 k
3 o1 o! S" v# G4 qvoid ChopperWaveform(void)! u4 T) u0 h9 f( o. L2 t+ d0 e7 s
{" @+ p" K8 ~7 W$ @
    // 50% 占空比8 C+ T; b/ R0 w: I7 D( u6 X
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);4 t2 a8 @, \" d  J
    // 4 分频
+ j9 P: D/ X' l- q    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
$ o) \6 Q- X, A    // 单个脉冲宽度' |7 [" l- C' T& A9 q. a0 y
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);9 k) J1 y; Q; z" z0 x
    // 使能斩波子模块9 m8 U6 W  s) J! q2 x
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
2 I. k9 c3 ~' S' o7 H! P" d}# X# A3 v' e* @# \) h5 G) k7 A

, s4 t8 Q. z) Y( o/****************************************************************************/" w7 W2 E1 c+ O2 C; F; s
/*                                                                          */( w9 }9 j( d" K7 J. B: @" J. l/ ]
/*              PWM 中断初始化                                              */
' l+ w3 J6 i  K! ?/*                                                                          */
7 I! D* _6 m: m2 m" q3 H" g/****************************************************************************/* A2 {8 ^2 k; V% |8 h: G
void PWMInterruptInit(void)9 h$ Q: T7 A* W; l, k
{
6 w) o) n, y& F: V5 f6 E        // 注册中断服务函数! w' s9 w9 K6 r: y
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);2 [' K# B1 S/ G2 U$ e& X
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);' [1 o1 @0 U/ I7 Z

8 R0 Y3 |! N& H0 }        // 映射中断8 l( Z0 S& [9 M6 M; z) O8 {
        IntChannelSet(SYS_INT_EHRPWM1, 2);
' L0 d( L8 ~/ v5 W" X, ~; ~        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
/ B4 u0 q! {  ^& ?2 f
% D% s# ^% |  b: ]4 M9 Z8 _        // 使能中断
  U! s8 V$ h  y% K- y- @        IntSystemEnable(SYS_INT_EHRPWM1);
& l9 X0 d" i  N7 }        IntSystemEnable(SYS_INT_EHRPWM1TZ);# Y: s- {: D7 g. e6 S
}# ]: n0 Z2 k4 Z

( a2 x  l5 I8 Y+ ^" \0 R/****************************************************************************/
4 C2 c" `8 q8 N. y4 E! ~! I/*                                                                          */' A) J- w& _6 S" q
/*              ARM 中断初始化                                              */* K& W! h" G+ g6 u4 S0 T
/*                                                                          */# R1 [9 b5 Z/ X/ ]: L5 t3 B5 c* L! @/ z
/****************************************************************************/2 X* Y' X* k+ ~9 c
void InterruptInit(void)5 ~$ P) v; ~* ]* S0 h
{
6 \+ i/ Z; j* y9 p8 g& T4 z  o" f        // 初始化 ARM 中断控制器8 W1 }* A& p, q: Z2 F
        IntAINTCInit();! T' D% T8 ^/ V& t

1 N% J1 e# a. F- \6 o        // 使能 IRQ(CPSR)
1 O; x: E: s# W. G        IntMasterIRQEnable();" f8 N! u5 Q: f& y- q" @3 L8 V: I
( |& x* ^! H* M- O( |
        // 使能中断(AINTC GER)" F# i) V/ l9 {
        IntGlobalEnable();& J; q7 \/ a$ b6 M# x4 \

  \) |* J4 n) `* K0 [5 A6 i3 f$ L        // 使能中断(AINTC HIER)6 N) O4 x& T% C. }
        IntIRQEnable();
/ k4 {" d3 P& `}
9 [6 }) `3 K/ _  ]. |
) O" f4 S+ u5 ?; h# j5 R% c4 b. n
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/
9 U# Q% |* j9 K) ~, h/*                                                                          */4 @. ~' f* J# x7 l  d
/*              中断服务函数                                                */, ~) E# o0 g% p& F, w
/*                                                                          */+ `7 E( a3 O# a5 D% C( l+ U2 h
/****************************************************************************/* x2 @1 b; X" u7 L
void PWMEventIsr(void)
+ I* B* k% k+ r* X1 n{$ L( w- [7 r; S
        IntSystemStatusClear(SYS_INT_EHRPWM1);, j6 }, l& d& Q

7 K) f% U( i$ b  `( i    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);# ?; @& v" Q' C
}
6 Q- M- f$ ?7 o1 V2 B) i4 N; D2 o6 _  a
void PWMTZIsr(void)
9 G6 X& ~# ]" O6 ]) l2 L{
" y0 P* x% [- c9 g* N' O+ F$ i        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);% X  v- }9 {9 d6 H

0 I1 Z0 _0 ~- C  N6 t    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);3 r8 \" y: m" i$ q  s9 ?
}- _2 C' O+ v, g: D

( d9 F5 G( T4 r5 z5 M/****************************************************************************/. X) M( L: u( w+ m8 @: y( k! E9 L; o
/*                                                                          */2 O& m# t9 ?- ]5 v- O% P* ]" a
/*              初始化捕获模块                                              */9 B% F8 d( X+ |; C/ a5 T, O
/*                                                                          */
0 E4 z/ @% Z& O( D/****************************************************************************/
& E2 ^8 o% u6 w6 W7 ^" q- O: ~) }void ECAPInit(void)
8 M, @+ q7 i. J4 f6 q# t) K{, X6 n! y' V& g: `! y: u- n4 u
        /*-----设置 ECCTL1-----*/8 K  C2 o$ F) y
        // 使能CAP寄存器装载
) @. `2 T3 q2 \2 X$ `0 ~9 [* Q        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
8 S7 T* |/ m  `2 q; G; t        // 设置预分频值.
8 g# O5 S  ?& p( L        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);' \" D) t, j% m
        // 上升沿触发捕获事件
; x' T) K4 N8 F- l        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
$ V0 f. Z# \4 n( c        // 输入捕获后重新装载计数器值.4 s7 a% C2 Q: e' U7 V0 v$ J
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
# T2 {  K& P3 c. _$ G: K! ~/ o
+ ]: [" u8 Q9 ]- m* N- J; m        /*-----设置 ECCTL2-----*/( k" [9 j5 l! q; p
        // 连续模式' z5 T  }" ~) P$ b" s* W0 b( U
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);% d% v5 U5 T- w9 ~! p0 d' w
        // ECAP计数器TSCTR持续计数
" X; ]9 L4 S9 }4 Y5 P: P        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);; K9 ?! I0 }9 H4 R7 P
        // 禁用同步输出和同步输入0 m6 V3 V1 W* z% u
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);* }) Y2 F# k* c3 X
        // 配置 ECAP 2 为 CAPTURE 模式
# s; H) I, @: e: o) j- E: i        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
+ b/ h' K: U3 o4 p8 i, t8 U- H2 G3 v: `; W. f7 N
        // 使能中断
! m, _! C4 n; Z( j4 E0 W9 t$ Z* Q2 n//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
  X! g  Z" T) j4 m9 d, Q. I}- O# p. O- k+ N  |9 Z1 s- k" b- O

, ^, Q6 Q3 p6 e8 M) X6 [1 u/****************************************************************************/
4 Z" S5 y. k8 W4 F/*                                                                          */2 L% K# p% j3 R1 H: ^
/*              取得捕获结果                                                */
6 P+ _' w3 z" V: y- m$ J, }/*                                                                          */! Z) {# P% k. I0 G+ k
/****************************************************************************/0 k! Y) Z4 L0 e# u2 ^; r- X- E: |
unsigned int ECAPRead(void)
. G- f# F8 [. P# |* u3 r{
2 j8 M/ k3 u, g) g        unsigned int capvalue;' v: o8 k7 b1 p
        unsigned long frequency;. w6 d; p% T5 N
& s! e9 r6 ?# {2 }! {
        // Event1 中断标志3 V1 o' ]% n4 b( {2 b
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT)); M! ~7 ]; N% t( C
        {+ q% C2 A0 y: V! o( p8 w4 l
                // 取得捕获计数' T  A9 m* Z2 T2 g/ a
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);" D" V* x/ ?: G7 t  J; a* _6 r7 a
                capvalue = ECAPResult.cap1;' \$ N8 ^. U! w

, S+ O# v8 C7 [                // CAPTRUE 模块 228M 时钟主频
; i; H$ p0 m/ i* y6 ^                frequency  =  228000000/capvalue;
0 F, T! m- ^' Q6 ]% H                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
. r$ g4 p; @" o8 e; K; P
- D4 G" z0 O! u% c+ Q6 f  K/ {# ?                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);6 E. l6 i9 q/ N$ j# S
//                IntEventClear(SYS_INT_ECAP2);: ]* M; b- Z8 y  [, d- h) w# x
        }  G2 I( z5 X9 p+ L) y$ a: [4 J
        return frequency;. z3 Y. E6 H/ @7 K
}
1 n5 ~% ]2 S- e
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
$ E/ P" s- G" |0 [: r+ L- b[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