嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家1 k+ M: J1 I9 y

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/% Q5 v* f* y* M- p1 s! m8 Y
/*                                                                          */
) a4 U' ?$ }7 H4 @4 i/*              宏定义                                                      */: {+ O! r" ]  w$ U- J/ d
/*                                                                          */
0 c/ ^! D& }" B9 n! p5 r/****************************************************************************/
2 U/ k; j& n% Q4 I// 软件断点1 U3 N" y! ~. f! L
#define SW_BREAKPOINT     asm(" SWBP 0 ");1 R0 ^9 }) X" T( l, h
4 A, y* ^3 J1 R2 D6 ~3 p* `
// 时钟分频3 x7 O0 v6 D5 W- ~3 u. ^
#define CLOCK_DIV_VAL     228
! V2 p- P9 N9 ]/ F8 Y" x- e& O: \  Z5 G
/****************************************************************************/
' O3 z# Q$ t/ W" U: q% n/*                                                                          */
0 ]+ j: |) X" ~3 R/*              全局变量                                                    */
, U1 [5 ^; |2 q/*                                                                          */
, O6 @0 }2 i6 l) q" ]/****************************************************************************/2 s, i( ?# [' ]8 R( Q
ECAPCONTEXT ECAPResult;
7 d( R- ]' V" ^. ?5 ]8 B( ?3 R" [" J5 `+ i, h' j( d# ?0 ~- c
/****************************************************************************/
( {) R" t2 z) r2 D/*                                                                          */
, S. c* i" M3 L% o+ g$ P% m/*              函数声明                                                    */
, _* g' X9 T7 C# R0 s: M/*                                                                          */# m/ d/ l) I/ D$ o
/****************************************************************************/
: e0 J, Z* L- ]! L) u// 外设使能配置
& f3 Z. M0 \" ovoid PSCInit(void);1 Z5 }1 N' b+ J
$ T+ h* e0 ^) B
// GPIO 管脚复用配置
+ G9 `. @4 x  ?& G  `$ [void GPIOBankPinMuxSet();+ U7 g# n9 A( [0 U! e
  e2 a' }4 F! i0 _9 ?) i
// 产生波形: L, q/ Q# t1 D7 {
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
1 h1 I$ z2 x. M2 Vvoid ChopperWaveform(void);. s" @: X: q0 G& O$ C% v, i

) Z4 V6 @  f# m7 ^8 M// ECAP初始化和读函数. S5 k1 M. R% l
void ECAPInit(void);
$ d" X1 a4 t9 B1 D) [8 j* D% c% zunsigned int ECAPRead(void);
; j  y0 @, b1 \& r
/ N0 ~, |3 i; c$ D! M2 K//ARM 中断初始化( q3 b+ l0 A8 z- Q
void InterruptInit(void);
1 U) A) H0 _- W4 X7 |. W) {) p+ a. O" v+ g3 y) ~* x5 c
// PWM 中断初始化$ |2 m1 V1 \( F5 n1 g3 J& U
void PWMInterruptInit(void);# ?7 w7 h) O, j! J! r
// 中断服务函数- }% B: f  X; F9 C1 R# S  T6 w& D
// PWM 事件
* c; x. }/ L/ cvoid PWMEventIsr(void);
: [5 j# H& q$ [: V4 b" b' C( R// PWM 错误控制事件0 s& ~0 k9 x" c8 W. z
void PWMTZIsr(void);* v/ b$ u: ]3 g! K

7 W7 o. I# m5 S  ?$ B$ R/****************************************************************************/  s8 T0 L# s$ V; o7 k* p& v
/*                                                                          */
0 G* @4 [% ?  M5 y4 F2 S7 b4 ?/*              主函数                                                      */; ~% G+ j/ F! x: w4 b" t
/*                                                                          */
2 o( X2 m8 ~3 ?* T3 f/****************************************************************************/7 N. i$ X9 Q7 j6 @" F4 |" N
int main(void)
, j6 _4 Z) v$ G) t3 d$ o" z' W{1 [" j+ J: o4 M( N4 f1 J
        // 外设使能配置! R2 O( b4 W  Y8 `; F8 D
        PSCInit();
! i: V: C; w7 Z$ r
; k- D  F% k4 j. k  g        // 初始化串口终端 使用串口24 u2 P0 x  I5 \: \: m  u
        UARTStdioInit();
% L7 P( b, ~3 r* D2 U/ \" I       
, w" \) W+ k8 u& J; M) y        // GPIO 管脚复用配置
9 y. S- M7 l: v0 ]        GPIOBankPinMuxSet();
; e: j& U* J% W3 w! `! W& O) w
8 M- W+ k! f, S4 I        // ARM 中断初始化
: Y, L* w2 R3 J8 ~        InterruptInit();* x3 Z1 B5 b& G" d$ h

8 p' ^9 T6 ]0 B9 n# K4 f        // PWM 中断初始化
" J: v% y  W: s1 X4 V- K. ?        PWMInterruptInit();6 c7 W+ F; ~+ P% r; m

9 `$ k  ^! F+ k$ [2 Y5 Z6 @        unsigned char i;
; \* e# p2 d$ x" @% I$ k        unsigned int j;
# c; D4 u! t6 p+ S, k/ S* R9 [+ t" q7 z
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);, q- ]* |# W' Q  S3 e8 X, @* o
        UARTPuts("------------------------------------------------------------\r\n", -1);
8 F( |$ l. f5 G1 W        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
! ?+ f' N' `( g7 e2 V9 K        // 产生波形& ?  x& I$ w# P4 S, `2 X5 g: s
        PWM1ABasic(25000,50);- Y# P0 d; ]+ y1 r1 Y. g8 q

/ ]$ m2 i8 ]& `; T        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
6 J' X' _: _- P8 `: Y; F& C, M# P        UARTPuts("------------------------------------------------------------\r\n", -1);
' r  T; b9 g' w) D& A& ^4 _3 n. x  S3 R' G# Z0 ?

: ?# @; e  ^- ?
- j6 k& U, x$ b4 m3 d3 T3 M" w  A, U        UARTPuts("------------------------------------------------------------\r\n", -1);6 g2 E+ S4 |' {4 M% Z2 _
        UARTPuts("                    C6748 ECAP Test\r\n", -1);) I; a3 w0 o+ \$ v7 U( L" ]
        // ECAP 捕获初始化# ]8 }! W) k4 u. P8 }- I0 l7 G
        ECAPInit();9 B& n1 ^  X; B- ?9 ?& H+ M
        UARTPuts("Initialize ECAP.......\r\n",-1);
5 y+ e- ]% a7 _6 D0 J        for(i=0;i<5;i++)2 v% s% A) T. H" q8 j! a" \
        {
5 G+ g5 Z: e5 i6 F! h                    for(j=0x00FFFFFF;j>0;j--);            // 延时4 k3 ^+ R& c: c7 p
                    ECAPRead();
8 i' `9 ^% T, d" f        }
. U! e) c; d$ g- ?# v: c+ T        UARTPuts("\r\n",-1);
6 b2 [  m, X) g8 N& }3 q7 l        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
: v* R7 n- h/ B7 A+ O        UARTPuts("------------------------------------------------------------\r\n", -1);9 K/ ]) z8 K5 E3 e
6 w& V8 F* }' {- i' v
        // 主循环3 F  c" }: J( ]) H
        for(;;). X! h1 O: z! N. b: h+ X
        {
/ _; H" ^' P* L$ T# X6 X$ W2 J1 \$ K' j
        }9 L- ^$ J; }" H5 z1 s; `
}/ e- l: p* _/ g

) \7 }/ r0 P* F) p" ~( P/****************************************************************************/# h& s* J# t4 E6 M' K& ]0 s6 O6 P7 s
/*                                                                          */; {" q- u: T. V$ ~
/*              PSC 初始化                                                  *// J' [: a5 f* s* g9 S/ z* U% z3 l
/*                                                                          */+ C; L+ J7 Q! n! I( R
/****************************************************************************/, @9 \% S5 W  G5 B1 p! z
void PSCInit(void)9 h- ~% W, \" }+ L
{' _: i& M! b4 Z& g, L% o% U6 @' H5 r1 ^
        // 使能  EHRPWM 和 ECAP 模块
' w: C+ }3 Q+ G: B4 _! W        // 对相应外设模块的使能也可以在 BootLoader 中完成
/ Q$ u/ T, f( W0 v+ H    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);. Q+ e7 Z8 N9 J
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);0 A! F( D2 q5 S! u6 F
}
$ ~6 L3 ^  W/ i# u) E! `2 \" A! ]. S
/****************************************************************************/9 N0 N7 k+ y5 d$ s1 K3 h0 Q, I
/*                                                                          */
% T0 A4 J& v+ T/*              GPIO 管脚复用配置                                           */
, n, C. p$ A" G0 k& B, V2 l+ D9 b/*                                                                          */9 F" J* g. E; }4 J  x) y
/****************************************************************************/
( U1 j9 e7 ^. _0 E. j* _0 T3 @$ }void GPIOBankPinMuxSet(void)* d- n. r) a3 S0 r- S. x
{
' \# E9 t- l( H  `% K        EHRPWM1PinMuxSetup();
$ Q8 O: @1 P9 l" C4 {8 B  v! b- _9 s/ b* y; G$ H6 ^) `
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
" g$ H6 p" m  ^$ \: h2 g7 l        // 作为捕获功能时管脚方向为输入
% h' t! [5 R, M3 {8 x' Q; k. `        // 作为辅助脉宽调制时管脚方向为输出
* B" l  T' j6 y& s9 X/ P* g    // ECAP2 / APWM2
! U6 R. a% B- g* W. L" N, n2 m$ v        ECAPPinMuxSetup(2);: m4 z7 Y% J9 p
8 I. S5 }' |4 H: T6 b) R
        // ECAP2 / APWM2方向设置为输入
5 C7 A% Z4 S8 b* D        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]" E$ G8 ^" u) _0 M0 e! y
}
1 i: Z2 e  i' `/ |- k" [  v; n- W0 K* }. j' B* y
/****************************************************************************/
/ h) Q' |* ~8 @3 W/*                                                                          */0 N  y/ c( Y8 Y- v
/*              PWM 输出波形                                                */; R. d( I9 g. a4 ^3 i+ V- L
/*                                                                          */
1 W5 I; l7 H' Y; ?/****************************************************************************/9 h& a8 u. v8 i4 \: q
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
- @$ s2 F1 ^# H6 c" ^{
& a- K+ w# f2 J' F7 `% u5 y" u    // 时间基准配置
( h  y$ i/ H7 @' X6 J9 G- b    // 时钟配置
  `( e5 z& @. `( g# {    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);7 `# i9 N/ B$ t6 V( L

- ]. A' Z' s- D    // 配置周期
1 U6 u' x+ T9 o2 s6 l    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,; @% U1 X1 W! e; x8 K' G
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
# Y: `9 W% ^4 U1 m1 V: T  b7 i5 F' Q/ A# Z1 U8 r6 L
    // 禁用输入同步信号
/ p- \( F" m$ f, t$ g    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);" f8 H% [& f, q; @6 Y
) ~9 }, o$ w9 [6 F- H
    // 禁用输出同步信号" v, h) ?7 p  _" z- E; n; ?
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);: ]: B$ h  D: a

7 V2 t8 M9 @  y    // 仿真(DEBUG)模式行为配置8 Y7 G0 ~( c( o" e
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);6 l" E# s& ]$ t* t) b: }

( T( H0 w  J1 {' v- C8 j* G    // 配置计数比较器子模块; J4 v# W: U4 B4 m: G
    // 加载比较器 A 值
2 k5 g" l; W4 l; l    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
" s( R3 U$ s7 |# z9 \+ ?$ [- |                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
- F  ]0 W0 e0 @1 z
# `' E% C: v  u/ U" ~% X    // 加载比较器 B 值
7 j3 D( i/ c0 b2 y1 m+ O/ G    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,9 p: V. |) P; [
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
+ X) a2 }! i  h' A8 \
5 Z. y3 x  ~+ [+ W' A    // 功能限定配置(输出引脚触发方式设定)
3 R: \& N" H0 d- p( `    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
+ v% p" p% t9 n' D! s; u# n6 {    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
/ W5 ~* M9 U  h" d1 u                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,2 u8 O) G6 F$ P% ]
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);" H& y% C. a* L7 b

) j8 B8 ]4 L+ N6 c" T  Q    // 禁用(旁路,信号直接输出到斩波子模块)死区模块! @8 Y6 k9 Y/ j8 J- [' N: E
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);7 k2 O) f5 V( B& ?- ]+ Q9 T: ?! W) E
" f% x* z. k. E8 Q
    // 禁用斩波子模块+ D8 _) c# x+ W7 d
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
3 [' @" U# K- \) B% a/ Y1 v+ S+ a7 N' }3 }) L1 R4 R
    // 禁用错误控制事件% @# b+ k# D' X+ D7 y+ s
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
* ?' k1 q; N6 `% M0 ^% T0 d7 K    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
, n; X' l6 E& ^: f1 \; b5 B; }( O
    // 事件触发配置) V4 n9 A  y$ q* w- ~
    // 每三次事件发生产生中断$ j0 ]7 i! [/ H4 l- U1 ^
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);7 ^$ B' X+ L) V0 K
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件6 q# L1 d" J* I" e" E
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
) ]7 A1 ~6 i$ F* ^    // 使能中断
9 \- q/ ~5 U$ [$ h6 w5 I* m2 l/ q2 D    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);3 ~& B, O4 g/ ^
5 X  n8 i9 W$ H
    // 禁用高精度子模块- u% ^9 ^6 f7 M
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);/ v" ?' J3 T$ \. B" B% |4 g! r6 X1 g

+ H7 a6 N6 m# z6 S    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);  d" Q: Y) Y1 D7 c
}% e4 v) S' }1 n0 Y! F

2 P* n  E4 p- M, N+ rvoid ChopperWaveform(void)* r# Z  j  l, s: L
{
3 T$ G% W* R' j    // 50% 占空比+ x$ C- Q5 R) s0 L
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);: z* |+ o# b# [0 ~
    // 4 分频
  w* n( Q, o7 _% S4 ?9 z    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
; u- N# g; \' o1 A! X9 i9 f    // 单个脉冲宽度, w9 ~6 a9 U- _8 T
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);' h* d- `8 D. \1 W$ o9 ?
    // 使能斩波子模块/ M. _3 [8 r' y# \
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);+ y0 p/ v. @2 L6 r4 t# u: m! \
}
+ C8 I% a! L1 N9 N8 \7 ^6 d/ A, `9 d4 c4 O8 t
/****************************************************************************// f. z5 b# h+ Q; q3 n5 p6 N
/*                                                                          */, C: e( G: d- n/ P6 r7 ]3 o' [" {
/*              PWM 中断初始化                                              */7 |( V9 m8 k% X7 _  A6 P
/*                                                                          */
) u- C3 A  h- W2 e' R/****************************************************************************/
; J  [! ^2 x3 Q, C* f' Q" j7 svoid PWMInterruptInit(void)9 F5 W1 S) B! r  n6 v: N: }& E
{9 U5 l: ]# H8 u4 L; X" J) k* ~+ A6 M
        // 注册中断服务函数) I2 @, {$ Z2 y/ [
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);% f! p8 e& k1 w% D
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);4 p' Q0 d5 f/ }, S, N: |
0 ~8 q' L; U6 `& C5 l% |" {! o
        // 映射中断
2 \6 B$ H1 N& ?- O        IntChannelSet(SYS_INT_EHRPWM1, 2);  l* Q. h6 \4 G5 i- B
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);% Z' S7 a+ Y- Q) {

( Y) s, w+ N! n. N% W% V! B2 ^        // 使能中断% z& y" x- ^0 ^
        IntSystemEnable(SYS_INT_EHRPWM1);8 }' c& `: t1 P
        IntSystemEnable(SYS_INT_EHRPWM1TZ);
- }- r1 n2 h4 M  H/ L6 n6 e5 l}- b9 W, Q1 C0 G9 z3 Y8 P
' N( Q+ p! D. ~$ v, V0 N. ^1 |! b
/****************************************************************************/6 @0 L& z, m' k
/*                                                                          */! e, ~, N- W3 n9 l1 e9 ?
/*              ARM 中断初始化                                              */
" p+ Y. D5 A( j7 [, \% m/*                                                                          */
: G! a/ U) t6 t8 t, `/****************************************************************************/& i& x. y) L6 t! y! W" \
void InterruptInit(void)
7 |8 D  N2 N5 ?! m% Z9 G% q( y+ [; Y{
* A) R* @4 O! E) e; a$ N* A        // 初始化 ARM 中断控制器4 M: [; G, ?, k$ @
        IntAINTCInit();
" M( `. D, @, ?% d! j
- u# H2 d' _. B5 N8 A+ N        // 使能 IRQ(CPSR). x( x/ o: x" j7 n
        IntMasterIRQEnable();2 ~: l% [) M9 f  H$ B7 v
6 v) e3 t+ Q% I$ @1 i( s! V: }
        // 使能中断(AINTC GER)5 C5 ?- W! m( [8 C
        IntGlobalEnable();
0 Y* j, o! L6 @; U$ i
# ~* _) t( }6 j; P! n: Y  |        // 使能中断(AINTC HIER)
. W3 S% n0 T6 d- p3 H        IntIRQEnable();0 l8 R3 ~$ n1 m
}
9 E7 r% u3 H( M( e) Y3 t0 ^! `! G

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/: G# w; @( N4 t+ ^0 t9 \5 `0 J
/*                                                                          */0 l9 w0 m" t" D% g" f
/*              中断服务函数                                                */
7 B& n; W- |+ Z1 j+ J, c7 X( ]0 {/*                                                                          */+ d7 }; Y- ^$ O* M, z' v% X
/****************************************************************************/
. \' T5 [7 j' O1 v, h" Qvoid PWMEventIsr(void)5 q5 g2 c5 t' ~2 J8 Q9 Z
{
; j# }% W# q' M        IntSystemStatusClear(SYS_INT_EHRPWM1);- l8 p6 h# k2 Z. W2 x' p

2 P$ o/ U' r: e* A    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
# c/ G9 r0 x; ?}
- u9 b$ b" P- ^/ l
4 w: e: ~6 b! e. y0 z. Evoid PWMTZIsr(void)! m4 d: Z9 n8 m/ ?& a  F
{
( T8 d; V! A# W' R        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);$ E) v  r, y# [2 ]& Q
  E6 P* v4 a1 a' z) W
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
4 k* e$ ]& b) A1 S+ M% S" @$ a1 V}4 ~8 F7 i. k' B7 x. k+ i

/ T! I- P) f' i1 s4 Q5 L# h/****************************************************************************/+ p  j! E4 q  ^" o5 ]
/*                                                                          */
+ G' p# g# ?: d1 `6 ^/*              初始化捕获模块                                              */
) X  k  u! q0 ?3 A0 r/*                                                                          */
4 R6 ]1 {( x; v) z6 _% p- |5 O/****************************************************************************/
2 W$ H6 X! m( V& w* c4 X4 Hvoid ECAPInit(void)
1 I# ^0 u: P6 f. ?{& Y! B$ f+ B2 {) S8 X" v5 g
        /*-----设置 ECCTL1-----*/
/ n6 O$ a; X! l3 H, Y% _% o3 a        // 使能CAP寄存器装载" Z! i  ^2 P% u0 e! _
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
3 ^* [+ U: ?! O        // 设置预分频值.1 |6 t0 R! j! ], p
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);) \) \, i1 W) N: v
        // 上升沿触发捕获事件
& f3 G; a% N% P        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);2 T) b/ c/ W/ P  o; s5 d
        // 输入捕获后重新装载计数器值.
# L, \$ t6 @* w1 I4 D        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
% [( `3 J5 c7 E2 l
, G' A: m' R( ]% r) z' x8 y        /*-----设置 ECCTL2-----*/4 ], S* a( t' W! i4 S6 X
        // 连续模式1 J7 `/ X7 Q' u$ g0 e# m& L2 A
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);) u  a  o' Z' Q# w# b+ G6 {# k' _
        // ECAP计数器TSCTR持续计数+ V3 I( D7 u' ~8 n* D
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
, p% G0 |0 c- `        // 禁用同步输出和同步输入
3 H7 V8 O) ?' `; s2 E        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);8 W. N8 m0 e, \# ?* |8 W2 r
        // 配置 ECAP 2 为 CAPTURE 模式
; t* _1 F& x- f/ P. Q        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
- t3 y6 }/ G& y7 I$ ^
; c/ d" F+ ~: S3 D, O+ Y        // 使能中断
7 ~: L0 X! s8 O! {3 F5 d( L& K* [//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
5 K. Y2 w+ h  a0 S# `. q}
; ~. m: Z6 u! o! ]7 t) a* w6 f) n2 U- M+ ~. \8 i
/****************************************************************************/3 `7 z3 i& i/ A* J
/*                                                                          */
/ g1 e9 j3 a0 h7 g% ?" o2 I7 X+ G/*              取得捕获结果                                                */- Q7 N$ E' j, P0 p9 l
/*                                                                          */  Y9 Y4 y; S6 F
/****************************************************************************/$ X& C% N1 D  I' x' @# G
unsigned int ECAPRead(void)7 c1 O$ E* r6 ]" g# U: U$ C
{
+ q7 w& D$ o  K- v: }        unsigned int capvalue;
7 u! b. F' q3 E6 y+ W: ^  D4 [        unsigned long frequency;, ^2 s; m* V" ]# h3 R
# B3 ]& f* C; U0 h
        // Event1 中断标志2 Y6 a6 x$ {- w7 X" P- r7 o2 T+ v) q
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
& j5 g* Y0 @5 C+ w% _8 o1 [        {
7 H* Y7 x9 B8 t                // 取得捕获计数
$ W9 h2 F% L' g$ q: F" {$ |! v                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);( f  ]% t( {, i- r
                capvalue = ECAPResult.cap1;# f6 E# T  V& X4 R! W+ i, Q

" ?9 z5 `) R& A% u                // CAPTRUE 模块 228M 时钟主频
' Q4 L. R; \" ]6 m  D' G+ z% j4 i                frequency  =  228000000/capvalue;
0 L! N! ^/ k& g                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
* g0 t! a; y7 L( ~  z
- i# r( @5 o* Q5 I5 _  G; C                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);' g4 ^' n8 i4 @, j( I( K- w& q
//                IntEventClear(SYS_INT_ECAP2);
1 J. n& N4 F+ k9 x# J        }
+ E! Y1 E9 y2 q$ a3 @7 o        return frequency;
% W% W( t7 W. B  u}
: z1 |0 h; `, p. B3 Z8 t* c$ B
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。$ J0 Q) {- m) [4 X. }' G
[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