嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
  f5 H6 k/ M9 q; J
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
4 P6 O2 N" L  q1 N3 U4 L: N/*                                                                          */
  [& Q6 C3 g3 Y: ~/*              宏定义                                                      */
6 {$ {. ^# Z! |! f3 V; ^* r/*                                                                          */2 z! b0 m' h1 b9 `! H. N. o
/****************************************************************************/1 k5 e, j. T. l6 Q7 Z% x; P1 N
// 软件断点: M- {, @9 \/ e- b6 W% D
#define SW_BREAKPOINT     asm(" SWBP 0 ");
% M4 B% }8 ]( s# u
, D: G+ v! i$ }5 S- x5 U8 H8 @// 时钟分频7 `7 P6 g( l: j% [/ I5 O
#define CLOCK_DIV_VAL     228
8 e9 Y0 Z5 y% m1 A+ {
0 a! B4 B- W* V7 W) k* T/****************************************************************************/
# P0 X  a$ Z. A  o5 d/*                                                                          */
0 c+ l& T. ]5 }7 _) e% t2 `/*              全局变量                                                    */
( W' K( I  c6 E8 t& R3 m8 H/*                                                                          */
& i! G3 Q, h/ a& z. l1 r1 i/****************************************************************************/
" S1 `: p4 a0 Y6 r% ~( Z" v! ?0 C3 cECAPCONTEXT ECAPResult;
8 w3 w; e/ Y" C6 B, T) [. s( _' {- f, T2 z+ j2 a! _
/****************************************************************************/4 o! d1 }( k% b
/*                                                                          *// L. y; ?1 q$ \, e7 T5 O# n& }& Y
/*              函数声明                                                    */
  b5 E, Z! ?2 F- J8 x8 |/*                                                                          *// {/ a- P! Q# o' l
/****************************************************************************/
* }) D# k$ r% d8 f# Y! |8 y  g: `// 外设使能配置
9 G' S# ^3 y3 x7 Z: T) Vvoid PSCInit(void);
- }. d2 v& s! w# n+ N" Y% T3 F
) ?5 @% y$ L; \9 s// GPIO 管脚复用配置
* ]& c6 y0 S* F. u8 A7 avoid GPIOBankPinMuxSet();5 U3 T3 ^7 a' K  C5 D' [
  x) Y4 u& S# y: ?# {/ x  ?
// 产生波形
  `0 F' z! \! u( D2 `/ dvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);/ N* {7 Z8 X7 n0 C
void ChopperWaveform(void);! Q) Q) g% P. \* m
" }, ^* `( b1 V! n$ e  _
// ECAP初始化和读函数$ A0 i& K2 x; r, [/ \8 }  M
void ECAPInit(void);
" k" _  |/ Q& w. m# _( Cunsigned int ECAPRead(void);
7 g/ ~: F& n; z4 b. H* b* B+ B3 b0 S8 C, e$ g# L. X
//ARM 中断初始化9 u. {5 M9 @  g0 d# ]
void InterruptInit(void);8 Y8 g' \" i# \
( D! _; {* c8 W5 B
// PWM 中断初始化! |, G) O& U8 a) F! f! V9 }
void PWMInterruptInit(void);$ Q9 q6 d  ]' h9 `! H
// 中断服务函数
5 p! M; \) W2 J) G/ G// PWM 事件1 g1 s  z  g; A- U) `
void PWMEventIsr(void);
) \! m' w( b, l4 s// PWM 错误控制事件! i% }, c/ s4 T+ Z( A) T  `, r
void PWMTZIsr(void);$ Q1 P$ P; O( \0 l

8 S7 B: b2 \0 M3 ^' N/****************************************************************************/3 }# b/ v& _7 ]& ]; u# j- f
/*                                                                          */( i4 V( @. S- D& z" V( O
/*              主函数                                                      */0 G' Z1 }* z% U) @1 ?$ A
/*                                                                          */0 O, C. Q' B% y0 b: J) q
/****************************************************************************/& W) B) D- v) Q. L% O9 V* h
int main(void)
. ~$ O7 s+ b! P{
: D$ z' p' W9 ]: z8 s/ V1 D  @        // 外设使能配置) x6 T9 }* R' Y  _# o
        PSCInit();
3 H! I" S' E; i+ W& E) Q' ?! v1 d. z  ?! E0 v! l
        // 初始化串口终端 使用串口26 v( @1 K& A9 b) K
        UARTStdioInit();1 m0 w. Y  H5 D' L9 W2 ^& I
        $ A% F/ N' J9 m
        // GPIO 管脚复用配置2 J2 u3 Z# _$ z0 t- G
        GPIOBankPinMuxSet();# w6 }# w( @( z2 h& `4 j

/ @: U/ ], ?. ?' U, H& Q! }; Q" u        // ARM 中断初始化
  m$ |0 ]. W4 e9 O; t        InterruptInit();0 v% n2 d4 P7 P# l
1 @0 B  \. `- l8 ~+ \
        // PWM 中断初始化& ~1 [* _8 N: L& v  a
        PWMInterruptInit();
% M% |/ O2 E. m. Q, ~& U
- s/ X: d. L$ b3 _        unsigned char i;' K2 [( w; F9 n5 t- ~3 W: b: P
        unsigned int j;5 U5 v7 d1 Q. b- @2 a" f; T5 U
; Y8 ^1 P) t4 D( p& J8 @+ s% }
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
( @' a- V  g% |7 x7 a        UARTPuts("------------------------------------------------------------\r\n", -1);
$ n: m: I- e+ L" U" c+ b        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
$ ^/ o. Y+ d7 ^- t( v5 ?, `        // 产生波形% z; s  L! b& b6 J5 C
        PWM1ABasic(25000,50);
7 }0 ~& t& T. |" E% W4 R0 S
6 g/ u8 a4 |6 X3 z/ Q: }' e" C: p        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);* s5 H, T, i2 p; E
        UARTPuts("------------------------------------------------------------\r\n", -1);
7 L4 I# r6 o3 h3 Q2 e; S& n
6 ~% k' w) z( X0 J' ?3 n
' f" \$ ?1 k4 ]5 a
8 |3 n# `8 H" A* A; F        UARTPuts("------------------------------------------------------------\r\n", -1);  I2 f5 _3 J# u: I
        UARTPuts("                    C6748 ECAP Test\r\n", -1);( k# N  v- e* j& E1 R' }' ^
        // ECAP 捕获初始化( C( a1 J! {" X2 {
        ECAPInit();
* p: X) r7 A0 K) Y        UARTPuts("Initialize ECAP.......\r\n",-1);6 n6 Q) \* M, n. b
        for(i=0;i<5;i++)! G7 H* Z# B  Y
        {
* ^6 D3 j; ]; a# x                    for(j=0x00FFFFFF;j>0;j--);            // 延时
1 Q; r. M4 c, A( \* n# X                    ECAPRead();( x4 `( d( x# j2 j  b8 S  X
        }  o$ Q) Z: |- q+ J
        UARTPuts("\r\n",-1);
$ P6 G# b0 ^" [: x$ C: R        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
; I5 ]9 H! J1 k' o, ~8 n( T+ ^# D        UARTPuts("------------------------------------------------------------\r\n", -1);
7 S% D  J9 ?: C& A& q& g/ F* T8 D$ l: B  O* \6 Z
        // 主循环6 U/ A, ?/ ^8 [
        for(;;); C% ?( C: X1 B+ Q- z  r% Z
        {
/ t0 `' N( V* o% c4 L
8 R+ v& _' f5 Z# R" m        }
! w+ F3 W0 |' u2 j% o}% {+ @. Y; p4 U9 l9 M; W" z+ L
5 M' s# u: T% P9 Y. O# I2 w
/****************************************************************************/
: p# S/ o% d" X& l9 ~2 d7 F/*                                                                          */
3 `' `+ H2 V# u' a3 p  v/*              PSC 初始化                                                  */
! R, t7 u" U  x- ^" o/*                                                                          */: D3 i: H2 G9 k. D, I1 F: m' V* ^
/****************************************************************************/1 w2 Z6 ^$ w$ M8 C% ]
void PSCInit(void)
$ q* d0 M& L/ p/ e( W; @7 ]' e{
" r" G4 A' Q5 E. c8 \" S6 |        // 使能  EHRPWM 和 ECAP 模块
, y& _3 K: j6 h  `6 i; R        // 对相应外设模块的使能也可以在 BootLoader 中完成8 o. z; T; k7 l6 @
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);$ r# h- i4 b$ f) Z+ G9 Q: H
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
) y9 ?- p/ d$ O5 m}! M4 {1 ]/ {' M# |4 u

/ N4 H/ o' Y/ S* L8 ^$ G/****************************************************************************/
2 S/ o6 b3 L6 o. ~' Y8 ?& I% t, A/*                                                                          */
4 x1 M7 a$ J* R* Z/*              GPIO 管脚复用配置                                           */
1 j& E" A4 U, U8 d/*                                                                          */
% t( b" X' K; t/ E0 J/****************************************************************************/0 d. ]) M, |. M. t+ p- j
void GPIOBankPinMuxSet(void): W3 w) w  q: ^2 w1 A9 i
{
. l5 s' }1 L) h3 W* S8 F3 p: h        EHRPWM1PinMuxSetup();* F$ e0 ^% ^/ H

% y7 g0 s+ l3 [0 p  _' g; @        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)8 t* H' r! I* u# X; t
        // 作为捕获功能时管脚方向为输入* Q1 J/ M# x: [2 R! n
        // 作为辅助脉宽调制时管脚方向为输出  ^1 O4 w8 f" M
    // ECAP2 / APWM26 N2 s( s7 Y0 @8 O; M$ |: _4 P
        ECAPPinMuxSetup(2);( u3 a( o- X9 t) l1 f& P

: g7 v9 {- U8 i' }7 d        // ECAP2 / APWM2方向设置为输入
* A9 k. Z3 R! H" {' ~' ~        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
5 E) D' P* K2 q! `# G0 R* Z( V}
  J( d/ R; J& X
4 i# v5 g0 i$ [$ D8 |/****************************************************************************/
+ q0 b/ r0 m3 ?/*                                                                          */
& F. ^! F! `8 K% W& w/*              PWM 输出波形                                                */6 C. B7 N3 w% f; X; J' Z5 v, T, s
/*                                                                          */
% t! Z0 |' [' r3 b3 A4 k/****************************************************************************/3 t  @+ X* f4 V4 f
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
' Z% s0 w, k- q0 V( ^{- q& u1 ?( F( Y3 U+ W
    // 时间基准配置
8 r" g7 `% A6 n! e    // 时钟配置& j1 Q1 B" q4 i) T2 ]
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
& y* ^( Q8 g" T4 e  z- g0 e( d! V% f3 S" V
    // 配置周期! h% n0 p+ a) f! ?: x
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,6 p# I# z  c7 g
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);; A0 Q6 r4 p9 T/ }
: ?; i+ R/ W/ N& f0 Y* y1 H/ r
    // 禁用输入同步信号- L" B( ?  j' ?7 v, j; |
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
* q; W1 r+ z- P( I" B) b# n2 R  @8 I, y# T9 x
    // 禁用输出同步信号
) s6 H! l8 j" y3 O) N, L    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);% g5 u3 S6 f+ \$ b/ p
# X5 N1 v  g5 y8 U3 D
    // 仿真(DEBUG)模式行为配置
9 e" }9 m6 h: ^, g. t+ |    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);& A; Z& u$ T2 d4 D+ m& J& k2 o$ g' J' D
; O4 i4 P, l: m8 {* c
    // 配置计数比较器子模块+ L+ j1 ]. D: S8 {
    // 加载比较器 A 值
$ _% v' C9 i  i! _$ p6 P! A    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
% Y! h7 h/ \: o" k) K- c3 t                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);& f( n* W( W9 t$ f

2 L$ z/ v! _) c7 u0 [    // 加载比较器 B 值. O5 f- v. N& Q% h' o
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
% X8 `, C% U9 ^& O                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);% ]: u$ E4 c* s/ o: ^! V9 `

& R4 _2 w# q. t6 M+ D0 |4 R    // 功能限定配置(输出引脚触发方式设定)! P5 N( A! E1 Z. J
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
, P" g; B7 x  n3 g    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
+ M3 U$ d+ E7 d' E8 d. \                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,+ `$ _- y1 x/ B
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);, P2 `( p# q$ ]: A9 |0 H/ R

9 @, I# ?+ e$ A    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
. S- b% C- P8 X" ], J- C" E' ^7 e    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);9 Z) a; [% r: M! c( h% q3 \
# e. c/ W% l' X4 m
    // 禁用斩波子模块; b% D' f4 E% M7 }# ~/ b; z
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
! [2 X- }' W6 g; f* c& E; W2 h5 p& e) W/ Z; K* d
    // 禁用错误控制事件! y* v# M  k: b* [
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
  q$ r3 d/ Y, L; b% r    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
* I( F( I* z0 e! m
: W' z% b# I5 a" W: U/ Z    // 事件触发配置
5 f% f9 Q) r' V8 c1 r' t& V    // 每三次事件发生产生中断: ?' I6 I% d! y* f# f
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
% ]0 A0 Q' m, `. s% A    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件$ M7 {; W& w5 ^0 r. C
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
2 r3 V$ {4 {$ F7 X$ L    // 使能中断- b' f" X7 b& u% y, J
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
. N1 v  V6 ?$ I9 [1 T% }' O+ {& y
8 ^0 e' o' O  Z$ y; _2 m3 q    // 禁用高精度子模块" [' M' g- E; b0 z$ E' R
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);5 E; l" n7 B- q8 C3 M
, }. w: N& b/ m3 K& R3 e. V  O& `
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
- o+ ~+ R7 n1 T8 j, R6 [) h) n0 X}
2 M  c' d1 d' Y% \9 \: U( q/ J
# A$ S$ Q3 y% c5 b- kvoid ChopperWaveform(void)2 U+ }5 Z( o9 y5 _$ ~. c
{
" y9 n9 N; D8 V/ b+ U    // 50% 占空比
! q2 M, B: J4 m8 X9 n3 |+ h    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
& }# r* k" U9 A3 W) U+ I    // 4 分频
" q- z9 H; j9 }$ f6 h, ^$ G. ~    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);0 _0 z4 Q4 M; \/ g. h. F
    // 单个脉冲宽度
4 r  P" a4 Y: S4 n6 V1 c' x    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);% r  F6 n; D7 i/ E$ o, ~
    // 使能斩波子模块, @( Q/ l* K% y: H1 B" [; I* B* \
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);/ n, I3 k9 N0 M& F$ i( U% R
}  K% W6 D5 X2 v  ]$ m' n+ M

) Q$ }4 v6 `' e" R' w7 c/****************************************************************************/$ _  l6 u: W% D0 b! n
/*                                                                          */  J' W+ i2 U  @0 p
/*              PWM 中断初始化                                              */8 M) R  Z- R9 h
/*                                                                          */9 c1 Q3 C2 v. h
/****************************************************************************/
2 I$ W' D1 L  ?. ^$ S' avoid PWMInterruptInit(void)& ?" _" A5 T& u4 o) U4 ^: b6 q6 [
{
* G4 E6 @! c( M$ N, n# b        // 注册中断服务函数
5 y8 x8 J5 S/ d- {) G: A. E: g        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);* J' @8 e$ F' ?/ [
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
/ M0 H% n- O+ Z% \4 @
5 L/ Z9 l! `$ `4 ?2 L7 |+ }        // 映射中断1 T  w1 b$ q& M- c5 n  X" R3 {
        IntChannelSet(SYS_INT_EHRPWM1, 2);
+ A# a) V/ H6 c. x* g& k1 C, y3 l. z        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);/ @& \5 O, }3 y( f
) Y1 K8 O( e2 K3 t( K9 Y6 Y4 {1 D
        // 使能中断
& w9 l2 H' `1 W7 C2 t, i1 X        IntSystemEnable(SYS_INT_EHRPWM1);' K; w+ V- z2 }- t7 J% a5 m
        IntSystemEnable(SYS_INT_EHRPWM1TZ);
& P( k9 I. T) o2 \3 V5 F) S1 A}+ u: \' \: z5 W1 M
  P( U2 h, R- c0 i# v* X4 E
/****************************************************************************/% h0 P, P9 R0 `; D5 D# g
/*                                                                          */
. u1 K) I+ y: X0 |: _7 a: W: ^/*              ARM 中断初始化                                              */+ I8 c& s7 A" W, |. l
/*                                                                          */  P* j: N6 m' K; o2 d. C5 I2 E. n
/****************************************************************************// o# @3 J& N9 A1 [$ e) ?5 n+ r! _5 l
void InterruptInit(void). T- B1 V& R) I- x& p5 O. A
{
- w; y8 m6 c: K/ ^. Z; u  D        // 初始化 ARM 中断控制器" l8 \0 h  r. N6 d5 ]
        IntAINTCInit();
& W/ e7 x) s5 y% B' {& l* [
  V, ]5 I0 i1 a        // 使能 IRQ(CPSR)
5 F+ ^. `( C# o7 k# j) i3 P        IntMasterIRQEnable();) D$ }0 e3 E' I  u" w6 P

2 v( m6 Y. w2 x  @        // 使能中断(AINTC GER): f& G( r0 a( e) U' l
        IntGlobalEnable();0 |/ u7 T& e4 ]9 R' W2 F* W$ F0 h2 ^4 C* s

- h0 j% k2 f% s) n; ]+ U        // 使能中断(AINTC HIER)
! |$ i; t/ O: B! m$ v        IntIRQEnable();
* z3 _4 {7 [1 a0 P3 D}  i! ]! n! Z6 D
: W/ O5 @7 ?+ s( E

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/, }9 @% o+ p; p6 t5 x8 n. r
/*                                                                          */5 m: j# Y7 b! g9 A1 A2 T
/*              中断服务函数                                                */' D; K2 a& n, {5 h: V
/*                                                                          */2 K1 w& A7 A2 o8 X/ b# G0 ?9 a* z
/****************************************************************************/, S+ V; ~" j) l- _3 S1 h$ j
void PWMEventIsr(void)
4 B  U+ k' A* k{. f0 R* s, M: `5 @
        IntSystemStatusClear(SYS_INT_EHRPWM1);+ I: p3 ^; v+ v2 @6 p3 q9 j' x4 d. z

0 `+ \' _- D0 H* R& u: B    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
" K" `- \, O3 `1 |9 g# @* n7 f- [}; e$ F% b, [9 o( A$ ~! m: Z

& u* C4 U- e$ Y6 Xvoid PWMTZIsr(void)
/ Q5 o: x# I& d; b4 V5 o# s{9 z$ u# j! O# |+ E; |/ A2 o6 \* h
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
" K# G6 x2 g9 x9 J5 e# _2 z  Z7 w, v# E. p
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);8 D, D9 L2 j3 U, L2 p) o  k& U
}* w' c* j6 S- V2 ~7 v
  ~9 Z5 F% _* [
/****************************************************************************/, I' A4 v6 h8 q2 k& n
/*                                                                          */; A2 w4 X1 x1 X* W8 ~
/*              初始化捕获模块                                              */
+ K; S6 t. `. ~# C7 S% U1 U: w/*                                                                          */
( }" S- |3 V2 c' t0 P) |" T5 h/****************************************************************************/
, S# q7 W+ Z0 b7 y3 w8 ?' ?void ECAPInit(void)! n* {9 C8 p& F$ _
{
; L9 ^, n3 z; w4 d9 b% f$ b* F7 C( d) t        /*-----设置 ECCTL1-----*/+ X: R8 Y0 a& @! ?
        // 使能CAP寄存器装载
. ]' c( ?: t; {/ G7 w' \, H0 X        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
: O( [9 ]9 E. f- D1 k  F$ K        // 设置预分频值.
$ U9 q) A2 {5 V& K        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
6 D* i& v$ U% q% @; ~6 G7 Q2 [1 C        // 上升沿触发捕获事件4 x4 f9 G9 D& c" F2 \
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);# d% a) H- i5 N* c7 ?7 H$ c) ~
        // 输入捕获后重新装载计数器值.: Y- B! D7 V: ^! H
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);4 A, n, F, W& s8 B
* H/ e. T8 g* P& h0 w' J0 a
        /*-----设置 ECCTL2-----*/
  W3 }0 X9 x6 a4 z        // 连续模式) C" m5 V# f8 V6 @; b& Q2 S
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
+ z7 g* Z# ~" p& t) q# ~$ ]  ~6 ~        // ECAP计数器TSCTR持续计数
; g# h% R- m, m8 K- @/ ~, K) d6 U        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);% f7 [" M) ]8 C( |! x6 N: `
        // 禁用同步输出和同步输入
2 Z3 u3 S0 U4 `5 |        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);( F# K9 z! i( X7 o3 c6 K. n5 F, u5 g
        // 配置 ECAP 2 为 CAPTURE 模式& `5 W+ B6 s$ t/ i
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);2 O0 T+ X2 P1 _! H
+ `3 X4 @3 \+ P- Q1 z2 }
        // 使能中断
4 z/ G! b% U& z* T9 T1 c//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);. I- s# n, Q& K$ I3 v$ ^
}' O6 }5 Z7 Y7 W) A" Q2 W( ]

% E' z5 i+ g- ~& ?  e/****************************************************************************/3 E, @5 B+ ], N- |' O5 }  {
/*                                                                          */
( U4 v/ B: y& j4 Z/*              取得捕获结果                                                */
: @4 X3 W4 D6 g" ]: U2 O4 L/*                                                                          */
+ ~8 S6 s6 B- T* Y6 l4 C/****************************************************************************/1 a4 c( ]$ U. r' ]. ^, p' E
unsigned int ECAPRead(void)) K* r! @. h" s* ~; L: S
{
0 N! M2 m$ {2 u- c, C: E        unsigned int capvalue;
+ ~. t# c/ l. B* x: L' V        unsigned long frequency;% ]/ z( L: a. e  x% s# b
7 p: T. \6 R7 g8 b. [# c
        // Event1 中断标志/ d) Q" s4 L' p6 k. }
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
$ J2 o, W- t; V7 @        {
* w: y4 }+ I6 J( m+ b0 }6 }                // 取得捕获计数
1 s  N/ p, N- k! `; i( D                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);* r) E, x  ^6 K, H2 X; @1 `
                capvalue = ECAPResult.cap1;$ S& L/ J# c8 C6 b% o+ T& F3 K& L/ J
' \" F% U" J6 b
                // CAPTRUE 模块 228M 时钟主频* T  G( i1 l$ x9 O9 O' A- E
                frequency  =  228000000/capvalue;1 G! Z2 {- v* B: E4 p, g* D
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);# l4 a: K! H- R! K" b0 F

$ w* B) E" X  s8 l1 J                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
0 p7 I) o$ r) W) T//                IntEventClear(SYS_INT_ECAP2);, O* U  h8 X$ p# h4 {# E
        }( {3 d3 B& I- L
        return frequency;/ l- ]5 @( L( e/ U5 p% Q
}4 Y* ~  V( V4 Q4 z

作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
/ R. n6 d, g6 J2 ~3 K! }# ?) }[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