嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
, c, d3 e1 m- ^$ n- p  \+ ]
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************// [& ^/ {. \0 l" x( ~+ a* ^
/*                                                                          */- o8 r( x; z3 F0 H) _& I
/*              宏定义                                                      */
1 I! W3 r  T9 |/*                                                                          */5 a3 M# P& o2 |2 T6 i
/****************************************************************************/
0 M& W* ]# ?* D+ x* f- ?& t// 软件断点
$ X$ S7 O: }5 ^& G) S* H#define SW_BREAKPOINT     asm(" SWBP 0 ");
+ A1 F/ k% I. v  A8 |7 r
  A% I! v# K0 `) ^! v5 M// 时钟分频
. L  ]. l' G% T# H3 }8 f& N# X#define CLOCK_DIV_VAL     228. m) F0 Q# m5 c5 h# G

  e6 {( W8 Z3 ~# t8 `! }/****************************************************************************/3 r1 C+ i0 S: `
/*                                                                          */  W/ e: H5 K* D6 X: p& c$ k
/*              全局变量                                                    */
" }8 n# y. x( M& L; ]/*                                                                          */
, w/ g  k; J( i) m/****************************************************************************/
# b, Q! `% L9 h3 {+ u% Y7 iECAPCONTEXT ECAPResult;
) {+ V" o; W: c4 L5 q: {( T" A9 u8 S$ |  R4 p, E/ @& |' `  x
/****************************************************************************/
6 P6 z: {% u3 X, ]' E' y/*                                                                          */5 D; y3 n0 n! c2 R
/*              函数声明                                                    */
+ y. Y* _( {/ N; Z8 t0 N: d/*                                                                          */
& y# E9 B2 g% h# Z2 X+ v/****************************************************************************/
8 o3 e* ?3 W0 ^+ M; q0 G% k// 外设使能配置
; C6 |- ^; O' E# i' _9 f  l) I( d  Vvoid PSCInit(void);( y- F$ a- f! G- Y! U2 f
* T9 G; [, T& ?; v# }' m
// GPIO 管脚复用配置5 O9 n5 [/ O3 o2 D
void GPIOBankPinMuxSet();
1 ]! \6 D% E' q/ w+ W/ I% q5 W# ]. x7 ^$ A! _. v$ X
// 产生波形6 b3 l6 t& q( U: ]* C
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);* `1 s; ?3 S# b; ~
void ChopperWaveform(void);& @& l" {6 r* F6 |
5 w& t( {7 S: A1 B& e: i
// ECAP初始化和读函数# G4 l1 E# n9 g
void ECAPInit(void);' J- e3 ^; h. [  A4 Y( r* ?
unsigned int ECAPRead(void);. Z5 V: d1 p& o4 |
( K4 ~4 l8 h6 Z( |
//ARM 中断初始化, o- p- q% H1 w& B% T0 @% c0 W
void InterruptInit(void);1 z- m* z, @( t, L$ k; _

) b' i; `# \9 L: A- L4 a// PWM 中断初始化
+ n+ S: I* K! ?+ O$ Vvoid PWMInterruptInit(void);* E5 t$ E0 r7 a8 ~  c7 y9 O
// 中断服务函数3 P1 q- [" z* ^2 S+ m) y) v
// PWM 事件3 B% x# `3 b& h! h! Q" V, M$ Y
void PWMEventIsr(void);
2 e) I3 z+ k7 P// PWM 错误控制事件1 W- K+ S+ j0 @3 o1 _6 M; R& ]
void PWMTZIsr(void);
1 t% x0 z5 I3 [% ?, c
; u* |+ n) @# i6 X( L! N/****************************************************************************/
7 r- I. f' z* O+ a: {; I7 I) i/*                                                                          */5 g' _- \/ Q7 I
/*              主函数                                                      */0 V5 R+ x7 R5 }& `: n, q
/*                                                                          */
. N2 O4 q* P! y% \3 u/****************************************************************************/
1 \5 ^! v+ P! b( l! C- p, h1 ]int main(void)
. F. Y6 D, {! N! S, {{
% w/ }. p' Y, `; I/ F; m  ~        // 外设使能配置% U* O; x3 L4 @, S
        PSCInit();( z" T: f* l8 S" Q- B! \
; s; J, t6 Z: k
        // 初始化串口终端 使用串口24 c6 L9 l. e7 x4 U
        UARTStdioInit();
9 q& |* N9 F, e  F5 R( G1 O$ ?       
% m3 v8 }% [+ c# S; @) a7 q. ]        // GPIO 管脚复用配置
0 p, v0 j) i( r( u- p& o        GPIOBankPinMuxSet();2 {, {  r: b- _* ^7 v' F

# l& ~& u9 y2 Y! ?/ N        // ARM 中断初始化
  X" A' R5 _8 M9 E        InterruptInit();) }! C4 Y9 e8 w( Z

: y) \3 F0 i2 e7 n/ |        // PWM 中断初始化
& s; @* D* p! A        PWMInterruptInit();
3 i2 q0 G" E! U/ F: x0 R  c# _! f% ]; `( _0 F+ t) D
        unsigned char i;2 M' I. n- G8 G- P, ]; [
        unsigned int j;# j- f$ |& d6 e3 H9 I* Z
( x+ K8 q' q% B- e
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
* M7 s0 P) h0 ]% P, A1 \        UARTPuts("------------------------------------------------------------\r\n", -1);
7 y  b! G& R2 H6 z( _        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
" y0 N" c" _4 m; f! R3 W. e6 R        // 产生波形4 g! F. s; o( M$ n+ O* R- X
        PWM1ABasic(25000,50);
* A! ]" D% B5 Q2 _0 F- r
' p& d' {. |1 X- G' g* e        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);7 I; C+ K# t6 D5 T& T8 q* s. I1 i
        UARTPuts("------------------------------------------------------------\r\n", -1);
# q# S3 P! V) \% l
" e; x" Z* R( q6 M  k& F- p! f1 d; G: @" I5 X

; H4 F, ?" L8 E  J9 z# W        UARTPuts("------------------------------------------------------------\r\n", -1);" U9 X! p$ M- t9 ?) J
        UARTPuts("                    C6748 ECAP Test\r\n", -1);' g: G0 O) K$ p) V' Z
        // ECAP 捕获初始化0 U8 ], p0 ?) I6 a, l5 H) z
        ECAPInit();
2 d: R: y$ U& i( w        UARTPuts("Initialize ECAP.......\r\n",-1);3 S% f+ z9 |$ |; ^, n7 T" ]
        for(i=0;i<5;i++)
& Z0 W" z, A1 j/ o        {8 p3 u3 C. Q- S( c0 b
                    for(j=0x00FFFFFF;j>0;j--);            // 延时, X* K0 o, j# T
                    ECAPRead();
8 q' {( _' x+ H+ u        }4 f8 T- ]) p, U; ^5 z9 n
        UARTPuts("\r\n",-1);4 g' b: L4 R* O, ]  B0 ?
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
8 Y# D% S/ p7 H        UARTPuts("------------------------------------------------------------\r\n", -1);" i6 A8 s2 z: u9 N; c- s

# Y+ p/ l' N' @+ ~  e        // 主循环! t, F4 J( A3 O* R- d5 y/ ]
        for(;;)/ z6 k, g! e; x  f2 L& [% O
        {
, l5 E# @$ X' [9 N, S
- M! d5 V6 a4 Y* A6 s# h* Z        }, m1 f7 G- l0 X7 L3 C
}. c; }% c& C9 ]
# ^9 i! p$ b4 G) U. A; i
/****************************************************************************/
1 b9 X+ Z4 J& z* Q/*                                                                          */$ A5 P7 r" ~5 U/ {, C
/*              PSC 初始化                                                  */& v& v; f4 x' l
/*                                                                          */
+ j0 ^$ s5 d1 f7 ~9 u/****************************************************************************/! S3 k2 u- I, y7 q0 \
void PSCInit(void)4 P2 P3 ~9 `' |! P+ t$ B
{$ {8 k5 [, k) w0 g% P+ N; u; B/ T) Z; }
        // 使能  EHRPWM 和 ECAP 模块
  ?: L$ i. [4 n! ?+ R0 a6 q/ i        // 对相应外设模块的使能也可以在 BootLoader 中完成1 ]. T/ P" o5 N
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);% v4 W2 N) V; [. I! v% }$ K
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);3 G6 E! ^+ X! d8 G7 g
}
. D; m7 a' c; D9 J
- s9 b' c4 ]( z, R* {/****************************************************************************/
- j' m$ w% D7 z" e/*                                                                          */# u9 Z% m. N, u$ p8 b
/*              GPIO 管脚复用配置                                           */
% j$ X* f8 S: g* [( L! i$ x$ s; `: O# h; x/*                                                                          */
; W* @/ y* i6 R& w& p7 v7 T, C/****************************************************************************/
; y3 I) B# M1 avoid GPIOBankPinMuxSet(void)
6 B9 @! J5 X3 ^8 Z  V) F2 l. f" b{
+ ?' t8 a; h) X        EHRPWM1PinMuxSetup();
8 Q) w- @+ ~3 r. e/ r0 m; m2 N! _! r+ V! ~% Y
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
6 }- M" Z' u6 a+ d/ s        // 作为捕获功能时管脚方向为输入9 a: s. Y  Q7 K" V
        // 作为辅助脉宽调制时管脚方向为输出) Y. j, M' ], ?
    // ECAP2 / APWM2
6 b; {) b6 P; u3 Z! ~% i        ECAPPinMuxSetup(2);$ J; b' y* |3 U# {+ ], h: k
% w6 |6 `* j4 s3 x$ P
        // ECAP2 / APWM2方向设置为输入! [) x/ i  l1 S
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
& |9 G& v% s1 L' u- Q) v}$ x! I: x  F) f; P7 D

9 m: s$ o) L4 [* f% n/****************************************************************************/
, {* m& K( w& `( a/*                                                                          */, X+ |* b7 l' o/ r" `
/*              PWM 输出波形                                                */4 @: K" L- B+ @( Q3 |  E
/*                                                                          */" O, Y( k8 u! o. C$ Q8 v
/****************************************************************************/& {1 ?. [+ h1 D, A- q- M
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio); N- j) b# C3 ]+ z
{4 c+ V; V+ v- @* K+ |7 u* V
    // 时间基准配置5 G8 j) |# p  Z& x
    // 时钟配置
& c2 j( Q7 C3 T7 i1 N    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
( s2 O9 Y7 E) F1 g3 t% w: u
& }5 ]  G7 C- I    // 配置周期# Y( d  g+ }& b
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,9 j( n4 M7 f; q/ _6 B/ N. m
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
/ Q& _/ R8 B( H  R
$ e; |: h0 N+ y! \7 H    // 禁用输入同步信号
' k7 e. T4 l* |, U- ?    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);$ |" l, s- P, t9 B" ~& n; R

3 |4 r" ?+ i) g- D) c1 o    // 禁用输出同步信号- S! ~4 |) v( P6 d+ ~4 t
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);. N" k( G  p$ D! |* D" S! F) `

0 x: N$ d1 H1 Y/ ^# o    // 仿真(DEBUG)模式行为配置  H+ K, b( J, K! [
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
) M7 q9 i+ a" u
- r$ k7 P7 \+ I! B    // 配置计数比较器子模块' R! }8 B5 T  g  ]" G2 t/ c7 _6 o& [( ~
    // 加载比较器 A 值
& J7 R% {* _: C    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,. K" U4 j4 _6 z' J/ o# [! k
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);2 V1 x+ z, ~: M* o7 o* ~/ F3 v9 J
0 c9 t1 z* X+ W( A5 y
    // 加载比较器 B 值8 G3 V- p) e, `( z3 d6 F1 {' f6 [8 y
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
/ @6 O: N5 h8 K1 W                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
; h6 K; y) h5 |$ j% ^7 ?$ L) ~
" W/ B; U$ G4 f# ]# H2 M9 C. _# @    // 功能限定配置(输出引脚触发方式设定)* D  x9 L& _; I' h6 X2 ~' ^: a8 V7 r
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出5 M1 t: U2 ]6 H! v; T& Y
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
0 a. f- p. ^% C# p7 J# @$ z6 ~                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
1 K+ K* ^0 q+ S/ b0 f# M                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
3 B3 T% q( z  n% {4 n7 o, q
- [* Y2 d3 V& \    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
. o6 j4 F( K* [# k* P% u& Z    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);" s$ p8 u9 m( |0 Y1 V6 b
/ q. d$ t& ^; {1 F1 h5 |
    // 禁用斩波子模块' B2 j3 H" A9 j- `. S* n# D
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);, n/ I! O. A9 l1 a( Z  v

0 U6 q6 g; v" Y1 W& m; z    // 禁用错误控制事件
( a/ v+ G0 I& I8 f$ K8 @    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);9 V+ L' I6 q, C! B1 w5 f$ v
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
( i, Z5 e6 ?. o+ |2 Z. w5 X5 Y4 a# W9 I& G' h* H' J9 \
    // 事件触发配置, I4 J/ }) B) p0 W) L/ f' ?
    // 每三次事件发生产生中断- }3 V( e/ |( w! ?- n
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);$ E8 I3 k5 M4 i( }$ R
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
; \1 u7 k/ _$ y! i    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);& I* A4 v% X$ F$ v
    // 使能中断3 n! ]" a/ L& @1 x; }( U
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
1 W3 \& ?( W) k5 l8 s* p" Y& C, m* e! _
    // 禁用高精度子模块
: ~1 f6 E& o. @0 C% d# v    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);8 g7 V9 ?! l& h4 x
, ^5 [9 D8 H9 |7 q4 m- c
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
8 X& m6 T9 X4 O# y0 B}
" g2 X$ k) [2 n4 o$ Q; U
3 b5 P! |7 R) E, X* D* _, Ivoid ChopperWaveform(void)
% r5 \; q4 A4 A  j0 J7 d' z{
( E, J- w* f9 X    // 50% 占空比5 f2 c4 `" T+ l% Z  n
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);3 m2 B; k+ J1 \/ Q
    // 4 分频6 m% {5 |& G) {3 F* r
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);1 L. L7 `4 k. H6 T; I# f
    // 单个脉冲宽度( J9 @# h. P2 p* |$ _. f- x
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);8 G" ?( c1 E/ z4 _) q, X  q; H
    // 使能斩波子模块& O5 C$ I$ n( ]9 d7 [% x
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
/ X6 n3 w) N6 z: s}
. n) Y5 h* M5 }- ?- K+ H, {9 \( ^1 J6 W1 n7 d4 h
/****************************************************************************/) |2 U6 y' c9 q. y
/*                                                                          */
* K5 G7 @( y* }/ g/*              PWM 中断初始化                                              */0 K8 S, V) A8 X) _! f
/*                                                                          */# H; E% i; c9 o/ p$ u$ E* a
/****************************************************************************/
/ E' X: }+ ?" E0 uvoid PWMInterruptInit(void)9 P5 \1 y+ v5 Y3 E& H
{
* ~( m- s# _) I1 D& ]        // 注册中断服务函数, @* U8 y. {# M3 `! ^
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
% n- D: d6 l+ y% r- i% {) Y- O        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
6 U) a) S" U" C, ^+ L) w3 n
) a- z9 G2 [; u% l6 l( A; R        // 映射中断
# f/ j# I* N( U+ f0 Y0 ~        IntChannelSet(SYS_INT_EHRPWM1, 2);( k+ p6 V6 }) V5 Q, N1 @/ y
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);) f" w+ }8 T8 u1 v5 O( d' g

* {% }, }$ R, r0 y% r3 u, i        // 使能中断- R7 Z1 q" h, O+ Q5 T9 a, p2 Z
        IntSystemEnable(SYS_INT_EHRPWM1);$ U& Y6 a, }: ]; V
        IntSystemEnable(SYS_INT_EHRPWM1TZ);
- [, b7 ?/ ~# D# r6 Y}
+ Q4 E+ c2 K* a. G7 i& f+ G2 l$ C8 _* ~. N; }
/****************************************************************************/, F: g4 u7 z) \- g
/*                                                                          */( {; J. t5 ~8 i) @# E
/*              ARM 中断初始化                                              */
3 K/ S5 z( n& p! \' H5 Y/*                                                                          */
3 i9 y8 m9 \7 N$ l/****************************************************************************/
: X) d- p/ G8 u9 Qvoid InterruptInit(void)
! k3 k! [; {" X, v* l{
# L8 _! @& a% W        // 初始化 ARM 中断控制器- Z- E& H1 [2 p& `/ R1 Z, u
        IntAINTCInit();8 }2 a- s/ r( L7 S
' Q& e0 w1 |0 M+ [2 ^
        // 使能 IRQ(CPSR)
( M0 v3 G4 l+ s* D        IntMasterIRQEnable();
, C3 m+ h9 I+ q
2 T5 V0 o+ @9 _& `- ^0 j& m        // 使能中断(AINTC GER)9 G5 H1 R0 Y1 @4 Y& a3 d. B+ i
        IntGlobalEnable();
) K5 r$ Q/ r. u+ l: C5 l5 }2 {- a. D5 Z8 B. O$ L) {
        // 使能中断(AINTC HIER)+ q2 {/ b4 W- x- g. ^& w2 R
        IntIRQEnable();
" W2 a# O, [- A! e! s& j& ~}
& x4 l8 {2 v$ A5 G! y
9 P6 d9 Z4 }6 \
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/, T+ a" w: I- X" Q) g. f# x/ q
/*                                                                          */. a* ?5 H' |* G2 T  z& A6 R6 ]$ L( Q
/*              中断服务函数                                                */# a0 ?* o& W4 ~9 O$ V
/*                                                                          */) I" M6 t  V  r* D# D4 s
/****************************************************************************/% d  X+ O5 C; g8 m4 A/ s
void PWMEventIsr(void)
) X% f5 g( ]# x6 O( ?7 d{
  _$ h% g2 A+ @" l2 g- [        IntSystemStatusClear(SYS_INT_EHRPWM1);  t# L# I, d( F1 @' O
, {6 }$ ]7 ?& l" d/ Y
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
2 u4 V" p8 g- }2 O/ S' ~}
% l5 W5 S, r* B: U* J1 |6 ~6 ]% H  y  b$ `
void PWMTZIsr(void)+ |' I0 W7 |; s3 t2 k
{
# E9 X1 }5 i1 p- W        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);6 q  E- b, g3 k. B* T3 `
, b* c* o0 b. ~6 [
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);0 f7 S! ?7 \( z+ B% p( X6 d, F
}
( H4 Q( y/ g7 s% _$ ]1 e" X8 k/ k5 O% [7 P# X! T( U
/****************************************************************************/+ Z3 }/ p: F. l: ?7 d
/*                                                                          */
* X' G; L* w9 A/*              初始化捕获模块                                              */# ^7 K+ O. p+ c/ q# q7 b4 m# o
/*                                                                          */6 e% P" Q+ E6 F- E/ X2 q
/****************************************************************************/
- g: g" N/ ~, t# N0 @; o* ^void ECAPInit(void)
9 S7 Z1 }* b0 A& A2 P* q: ~8 G  ^{
* `/ |1 R2 V- f* b- s) d$ p        /*-----设置 ECCTL1-----*/
) E! V& }# f0 a" _) y        // 使能CAP寄存器装载
' I; _+ c+ C# S        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);  N5 A$ z+ I' }) d' t5 l
        // 设置预分频值.7 e+ Q' r% s" t& f' G
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);: U. d( n" y' S/ r" r0 ~* V
        // 上升沿触发捕获事件
% V, C* w8 a* w5 W8 K5 H# w        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);% O3 g/ \+ ~  H+ q
        // 输入捕获后重新装载计数器值.  h: D2 ~4 j5 ^$ ]& V& u( P1 ?
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);) S. c* P3 C* z0 |4 V3 W
6 K! U% h1 s6 [3 x/ C9 F
        /*-----设置 ECCTL2-----*/% |. `) m" g3 K/ \* C" G. g
        // 连续模式
& z0 f' x2 F7 F; l7 V5 V4 i        ECAPContinousModeConfig(SOC_ECAP_2_REGS);% L% H" p. `# u3 M6 f: J
        // ECAP计数器TSCTR持续计数
$ `0 ^0 E' q( n) Q/ S( h        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
4 @- q, M. `0 D        // 禁用同步输出和同步输入" I; F6 h% Y: v6 m# v3 Y4 H
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);; C4 V1 I: I4 Z
        // 配置 ECAP 2 为 CAPTURE 模式6 u4 U5 H7 M( c7 j) ^
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);5 l+ p9 W/ b. w
, O# ]6 q' w* @+ Z
        // 使能中断
& O. O. p* ?; {# q# p//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
  C( F4 [3 C( H4 I$ m}; h+ d# i2 Z, ]" ^' j8 n4 N5 l* r
4 D& O+ d. c& A8 G6 }: q
/****************************************************************************/2 a- f" W9 D  \9 s+ W6 E7 P) n
/*                                                                          */
. I; p5 g- B, a8 r) V) ?* E( p' Z/*              取得捕获结果                                                */% G' M4 V: P) F' H' i. |
/*                                                                          */, i% G, T# a+ @8 |/ F
/****************************************************************************/
0 w$ v+ N/ L4 ?  o' n* t. Vunsigned int ECAPRead(void), V7 x  O, e& M5 `3 D
{- `9 x& O( x. t$ ]
        unsigned int capvalue;* i) G; ^; s/ I1 A/ p2 R' w
        unsigned long frequency;
6 _, _$ {1 [$ n5 n9 ?  C
! i  o2 w- t( M5 q; b) z        // Event1 中断标志; @  I$ m6 d4 m) G- }# o# F
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
2 Z4 y; }2 L5 U* z; L& z        {
: p7 C2 ?& c" ~1 {                // 取得捕获计数1 _# a! X# E4 E; f, G. X1 s
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);. p! E$ [2 i, g2 a6 Z
                capvalue = ECAPResult.cap1;4 W6 h4 B/ c" ^6 }' P1 f
! E* }5 W. ^, a8 R( _
                // CAPTRUE 模块 228M 时钟主频% _# ]* T" S& Y! w9 |2 t0 L( {" N
                frequency  =  228000000/capvalue;
7 {* O- ?; q7 j" Z$ R. @! c                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
4 O3 b1 B, ?, w1 q. s1 ]) G
0 E( _: f4 e6 @" Q9 B* q                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);! I6 R: `% B  O, K, r
//                IntEventClear(SYS_INT_ECAP2);/ @4 Z% o; l- y' Y
        }
" I9 f" k& s; r# {: s! ^        return frequency;
0 {3 G! `; Z2 Q- {" o# d3 \; K}9 _" Y3 U5 J5 o& a

作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
; F- g* v: J- ?. ?$ c[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