嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
& c+ [, ~  |# x/ p2 K; T; R" C# N2 \1 n4 H
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
2 N! ]* o9 E- v' V/*                                                                          */
. Z' F- ^' Z2 R* e: l$ y/*              宏定义                                                      */# {# j, j- u, J
/*                                                                          */0 c/ M: G2 j. Q0 y
/****************************************************************************/
& N! Z% w) \+ o0 N5 w// 软件断点
* I! J5 s/ ~8 W4 ^#define SW_BREAKPOINT     asm(" SWBP 0 ");
* C3 ]. y: \" p1 W: a7 V  m. h9 D
// 时钟分频
) q7 f# r" c6 l" `% h, N#define CLOCK_DIV_VAL     228/ r" G+ i5 C/ N: }- v  B
( e# ~* R; e! k7 _+ V) @" a% k
/****************************************************************************/
3 I; }) Y0 J$ k" G& t& C/*                                                                          */
+ Z  _7 b; O9 @: ^' T/*              全局变量                                                    */
) Z) {* m- w( y  z/*                                                                          */
$ ]2 x" K" V0 j/****************************************************************************/0 T+ u  e3 T5 z: E6 L
ECAPCONTEXT ECAPResult;
. @2 P/ I2 f# b1 e- ~
5 z; P$ Z( t, R& B( Y7 ^/****************************************************************************/
  P+ J  d0 y& H/ |0 c9 k) U/*                                                                          */
6 G7 Q* ]: i5 E  Q/*              函数声明                                                    */
  {4 c4 ?0 c' p; R7 q/*                                                                          */% ]7 z5 O8 j% ^% X) s
/****************************************************************************/8 N; X; a0 `( a
// 外设使能配置
% f+ b/ `& O* s; R% d$ dvoid PSCInit(void);
, y7 D& z/ W. n+ P; w; b+ P; ^' I* m4 f6 v+ U1 c. v
// GPIO 管脚复用配置- D- g2 [/ J7 J7 t# r0 F
void GPIOBankPinMuxSet();5 e9 b- P9 q& W$ l. e3 ]- S/ Q

0 b; |- a, g5 @) q2 h- h. O( j* @// 产生波形
+ C4 E- _$ d3 ?1 O1 G  Gvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);3 [% W6 C# G7 P$ d9 }6 p. I* Z/ y
void ChopperWaveform(void);
: t3 ?# e9 ]1 m; f+ s
# B0 H: v+ i" c  l8 y// ECAP初始化和读函数
% z: l: S4 u8 b1 Bvoid ECAPInit(void);
/ f( D1 K) a- Zunsigned int ECAPRead(void);2 H5 B9 O& G/ w+ ^( O2 f. P8 i
) C) C6 o+ ^8 J6 F- S
//ARM 中断初始化
0 J5 c2 R- X) o; c: [: ]. H0 [+ Svoid InterruptInit(void);" J% \" r* m$ U0 u& l

+ K+ v& i$ H7 d+ m+ d# `// PWM 中断初始化* M$ Q0 k& a2 Z: X5 C8 T
void PWMInterruptInit(void);
9 w! J. f6 V4 g" I// 中断服务函数
3 n6 K& `/ E9 K$ ]// PWM 事件2 X' |7 ]8 C- [  {
void PWMEventIsr(void);
/ ]& [% q2 U1 t2 I; M6 L// PWM 错误控制事件; R$ j/ D" `: S
void PWMTZIsr(void);) b" W  Q, \* {4 s7 X& e
8 s' k4 e/ U5 K9 o; n
/****************************************************************************/
" s' w9 Y7 h/ y# o. t# k/*                                                                          */
6 `2 Q, \7 p, k1 J) r1 Y/*              主函数                                                      */
' S  Y3 F7 ?* I/ b3 m/*                                                                          */3 J- [0 P& T) U( ]% |
/****************************************************************************/
  e& x' g6 ~; b2 N& ]int main(void)$ j$ J+ E3 \/ N$ ]9 H. |, a% d+ k
{2 t) g1 _* }6 d7 M" i. l
        // 外设使能配置
( U: f! u7 \; l" c* f, S( N        PSCInit();+ o; Z% U' P0 @/ Y( H% M
& D7 H! q% a( @1 q9 w" e
        // 初始化串口终端 使用串口2! ]# a8 G: q) l# o
        UARTStdioInit();5 c+ x$ I- g! N( ?% W
       
" W3 E) t3 V/ m+ r6 f! V6 ?* x        // GPIO 管脚复用配置
* K  r' N; ]. ?- e9 \  {        GPIOBankPinMuxSet();) p0 M6 {3 q6 t: G7 Y$ i( T8 `

7 Z6 V+ W3 |4 M8 V' s/ T9 Z& L        // ARM 中断初始化
9 Y5 |& V+ K. T- r! }        InterruptInit();) L3 G. z9 x: ~: V- J) S( u% {: }
+ t! ~, T, f8 m4 d2 X* O7 s
        // PWM 中断初始化
. T: X- ?& U) n6 I1 L! ?9 F        PWMInterruptInit();2 \' P/ w! U1 Q' ~
& T$ k" D, d& D
        unsigned char i;
" ~8 A/ M- A' [. S        unsigned int j;0 s/ e  h* g9 c6 I9 v" @4 `
# y) _4 g( A; R0 ~$ V
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
7 s0 E3 J# q3 H2 ^7 o; J        UARTPuts("------------------------------------------------------------\r\n", -1);* l8 y4 N; o0 I9 v) b# p+ L
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
; ?  ?. m6 @9 W        // 产生波形
3 _5 J7 X0 c- ^6 N' x3 H        PWM1ABasic(25000,50);
3 K( Z! h! ?  a5 u  }  f
! o# B4 k: X7 {0 m7 V3 W$ v, m' f        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
2 }" L7 k6 d* n5 D' I% }        UARTPuts("------------------------------------------------------------\r\n", -1);
5 m  O: B. ]  r5 c- _) u  o  F7 H" Q- J, V6 R. A

/ y( F; v& i5 \7 h2 y# i0 o+ R3 g7 x2 [7 F( a! g1 ^
        UARTPuts("------------------------------------------------------------\r\n", -1);9 I# |6 c* t1 |
        UARTPuts("                    C6748 ECAP Test\r\n", -1);3 O# N2 Z; ]% p
        // ECAP 捕获初始化0 N* F1 B. d$ e5 O
        ECAPInit();
* J" ^$ V* y( y1 W4 @        UARTPuts("Initialize ECAP.......\r\n",-1);
" J% C; z  h) P6 p: _# P2 e        for(i=0;i<5;i++)
$ C. I) o8 O6 Q1 O( h. P        {3 ]1 Z& Q3 v" d( p
                    for(j=0x00FFFFFF;j>0;j--);            // 延时6 r% W  f- W/ R% g
                    ECAPRead();) ^+ f+ c$ n% w8 @+ n0 p. U
        }! N" w3 l# @" i/ V+ N
        UARTPuts("\r\n",-1);5 N5 {. L2 f( m1 a8 F" [. x0 c) \5 t
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
! Z5 F0 m3 E2 X; T! H3 h4 i  I! G/ m' t        UARTPuts("------------------------------------------------------------\r\n", -1);5 e  X8 K, D- m8 a, \
  B" c. i* o6 D7 c
        // 主循环
3 Y; ]+ p8 n/ M& \4 \* x  N' d        for(;;)
7 ~7 f1 u+ B# V7 R$ n7 E        {
+ \5 W( t1 J2 \
; \% d; p( K4 i+ |  s) U5 w% C( w        }
% u5 g% V/ L/ i4 _# w' B* L3 e$ |}
& n3 S+ f5 F8 K+ ]3 X3 c0 Q9 I' {( H  s# E7 h; p5 j$ K: ~, V+ ?
/****************************************************************************/* S9 n0 K4 e1 f' q: a
/*                                                                          */9 ?! C7 }% O7 S8 a3 Q' O, E7 L, x
/*              PSC 初始化                                                  */
3 V# N4 K) |% d8 j- E# `/ T) H# Q/ @/*                                                                          */
( x8 Y* m$ I) Q' w% ]7 y4 V/****************************************************************************/1 c3 s) \1 G) j* H% }- ^0 F
void PSCInit(void)) p* j6 t+ B+ G: z8 \! k( _
{
2 ]- T0 N5 ~  A6 j, a) b) g        // 使能  EHRPWM 和 ECAP 模块+ ~$ k4 M7 T5 I2 G& \  [
        // 对相应外设模块的使能也可以在 BootLoader 中完成
, [/ H1 O3 P% y  D0 p    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
. B& w4 E  y" d    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);" {6 P* y7 y' q8 J% k% C
}5 E) {3 J1 J- H, ^$ j6 ]6 L
$ c' ?: {: D& E. Q  ^
/****************************************************************************/
! H% e1 n  y( w* N; a; N5 @/*                                                                          */
, x* L* ?8 m1 b/*              GPIO 管脚复用配置                                           */+ L) ^. N( |; }2 x4 I6 C
/*                                                                          */6 |$ G  A0 w% W% B" t. x( y
/****************************************************************************/
& L! \6 @" ~* B4 v' i' ?" I2 kvoid GPIOBankPinMuxSet(void)
. g! V$ O( n! \6 D) m- u! k" n+ c{. n. \6 n+ }+ R: E; A
        EHRPWM1PinMuxSetup();
% T0 d4 _. i7 R, v  f# R" f- S, ]. w' ]/ I0 l
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
- @+ M8 Y% A+ C1 v0 W4 G9 w2 b        // 作为捕获功能时管脚方向为输入
' a7 H/ J: R: f: Y7 @- M        // 作为辅助脉宽调制时管脚方向为输出; F8 b, [/ x# H( [- e
    // ECAP2 / APWM2* E& ~8 g6 I1 d# z
        ECAPPinMuxSetup(2);
/ W& x2 M+ Y) i  H! |# P. K  A8 p+ @' D0 ^
        // ECAP2 / APWM2方向设置为输入' Q/ G8 @: o* A$ t5 U
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]8 x: |" d) N6 L$ x9 Y8 H+ w
}: j" v5 p7 ^" Z4 n7 E

1 i" V3 l: @1 P& J# S/****************************************************************************/
: N$ q, {+ C' e5 h5 C3 z' y/*                                                                          */
* I4 {( W2 p; T/*              PWM 输出波形                                                */& T, L& O( t4 T1 ^9 z, q3 _2 U
/*                                                                          */
& Q9 Z/ H! t8 S# @; R5 ?: A/****************************************************************************/
1 n  z  @6 L( m' Avoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio). W6 r! l! B1 D. O) \/ f) A
{
% D5 R( s( p8 @2 w' T    // 时间基准配置
' U8 y2 \$ J& O/ c    // 时钟配置( y/ i- D, s, O
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);; `$ A: V- i  w, d) Y
$ N# m( J- t! d( w
    // 配置周期: }% D, `! t- [3 t
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
: f! S  I1 y# t; f: d' K, n                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
/ X% |: F# T. ^2 f+ Q" U6 `
3 o' @8 t( @$ Z1 `' t/ W    // 禁用输入同步信号
$ [) l5 n  r! R; E    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);& C6 S& A3 }! {1 @8 F0 L

! P2 o  n1 o# `; r' F# |    // 禁用输出同步信号' n1 e* v" _, c4 Q( p: l* A
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
) m2 J0 Y- d" ^8 O  Z# N4 T* F
    // 仿真(DEBUG)模式行为配置
4 P4 @) i# Y6 k- e1 k* Y! ^1 \' g$ z' c$ V    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);" r, z( k# ?, Y, v3 `6 {

! v: k6 R" n/ ^) D    // 配置计数比较器子模块# j: A. g9 {8 p5 j" G( b. g
    // 加载比较器 A 值, Q! V& C( q" W7 P0 [6 A
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,& [% ]  U. e' R9 ?8 k
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
2 {% N& S+ O' F5 y3 W4 ?- y% \# j: o' j
    // 加载比较器 B 值; I/ V2 Y# q1 d8 e& a! k0 [5 l. Q( ?  b
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
" _, c+ K4 w8 M# W/ @6 W                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
4 v  \& e/ q( y' L" }+ n" n; L' h
; }; ]- h; S; K1 w    // 功能限定配置(输出引脚触发方式设定)
6 N( M  B9 W, j, s1 h    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
3 U8 x! G& R% \) ]+ K7 W    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,3 P: J- a  a( R- J, c+ Z  K
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,- V6 f7 y/ P5 R9 X
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
  r7 f% u: b/ }8 ^/ ]+ S: p: ^
1 B3 _9 ~* B( E$ f- }    // 禁用(旁路,信号直接输出到斩波子模块)死区模块5 S$ b# x( O, `9 W
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
* X- @8 q0 S# A5 X) ~- C6 _% ?
: w- `$ C3 g. W* I/ b6 \    // 禁用斩波子模块
. a& N* q* T+ d0 Q5 y    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
% a; [9 s8 l/ w* ~4 G  D& e5 B7 ?: |3 f: U$ A0 w) C
    // 禁用错误控制事件1 L$ D& l0 [3 R
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
: Y* n# R# {2 w4 c' N' l    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);# \* |* t+ h+ X
7 m/ F. g7 |) @' |& k
    // 事件触发配置& M4 X# x3 ?4 m
    // 每三次事件发生产生中断
5 q' G& h. ?: M& A* ]  p3 F    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);3 C! T+ {- G! ^1 `9 q$ d
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
5 J& c4 c, J1 P" M+ }6 ^    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
3 S: m8 B' j" m0 ?    // 使能中断; h, c1 a6 _2 P3 y
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
0 J( M) T2 e2 X6 L6 i5 k+ A* }3 ^5 Y
    // 禁用高精度子模块5 @. H1 j: D% G
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
4 V3 Y; \7 D' N8 K! W3 \# O
9 S2 z1 Z% z9 S' U; P    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);* I6 {. L0 W5 z3 B0 y9 t/ O. z
}
3 M1 m) K/ P% y4 L1 J. @& X# O5 w/ A: P# {% p2 V9 Z
void ChopperWaveform(void)
6 D! f% E; i7 W. k{
! y$ H$ x, [7 {3 L    // 50% 占空比( N8 s7 |& ^" A& Y/ j. W
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);: n7 g) I" [6 O; ]# G
    // 4 分频* X9 ]8 S. S# D- _  ^) v+ _! s
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);+ ~  V5 N8 l3 S) G( M
    // 单个脉冲宽度
; V$ @, a% s( ?1 s    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);- \' V- _& B% W$ ~2 G% D* T# ^
    // 使能斩波子模块
8 a0 S+ K* l, i/ n    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);9 n1 D' B6 d2 b5 K8 w1 N# O
}
- x) C' @: q) g- _" w& S3 s# h! x+ b# T! K- \  J0 E
/****************************************************************************/
. q5 c7 p$ E8 z- g3 D* X/*                                                                          */# q. A# \4 ?( l6 D5 X- Y
/*              PWM 中断初始化                                              */
# T# T9 P0 y" R5 r6 A, P* U) v0 O/*                                                                          */- ~+ m; J% R4 e5 d( L3 h4 J
/****************************************************************************/% }2 h8 w0 B- _8 m
void PWMInterruptInit(void)
/ i6 p9 c3 H) F  W: K{
6 x5 c, H0 n' ?, q! W6 b3 |* G        // 注册中断服务函数
0 v) d4 @. u9 W/ ]4 ^& B        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);; i+ A$ O3 p6 n- J7 e' ?! o6 c
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
/ X  I* b, W5 `7 R
5 C1 R  k6 a  O: d% D. r        // 映射中断1 o/ J" T" R/ J2 U. |, L: A$ @6 p
        IntChannelSet(SYS_INT_EHRPWM1, 2);
# ^) M' h4 H  f1 w        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
9 C0 n1 B6 c" d
# X- \6 m, _1 x& z5 U) C7 v, ?        // 使能中断
) ^7 e" t+ q7 D" F! J        IntSystemEnable(SYS_INT_EHRPWM1);
/ @) r6 y8 d( ]; `3 K4 |2 E( ^        IntSystemEnable(SYS_INT_EHRPWM1TZ);
9 B7 p  G5 a$ p}
: v$ ]& Y+ K7 x. v2 r4 Q1 p' A$ A- \3 Z
/****************************************************************************/
! m9 x) @: D8 v8 b% @/*                                                                          */& o4 m! p5 a4 n6 U: d
/*              ARM 中断初始化                                              */
0 ~% y, @! [+ x; R- |" P% o/*                                                                          */$ X; n$ N/ \  S
/****************************************************************************/
" E7 P* e0 D# }6 D3 F, `3 T; Ivoid InterruptInit(void)
( _2 [' T! A$ B2 b0 }/ s{- i6 D5 K4 U8 f" V
        // 初始化 ARM 中断控制器
' K4 f, j' l3 X6 u8 G9 `        IntAINTCInit();7 L" j: a5 P. f$ T7 Y5 E
$ P+ Y9 M2 o0 j' p# v) E3 T
        // 使能 IRQ(CPSR)2 [5 X7 y4 `! L
        IntMasterIRQEnable();
# }1 N$ [' k1 q8 p* f3 d) v& S& ]8 \" S# q1 J9 D
        // 使能中断(AINTC GER)
' |# i9 r8 [- G  R% _        IntGlobalEnable();! {# o7 h4 i3 k/ O6 f

2 d3 r8 Z! S/ G6 G- \; H$ u        // 使能中断(AINTC HIER)4 S& A2 H( X8 l! A
        IntIRQEnable();! J8 F8 Q. ?7 `! K; @$ D
}( p: P/ U* O3 O, Q) S: l# l4 \
) X4 l" F  P: a7 k% H/ W4 |  j

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/
7 q$ C9 i* k! @# ^: H/*                                                                          */
1 r6 X' u/ S" }$ T$ R! ~$ q8 P/*              中断服务函数                                                */" E' K: W+ n" k! p, x, L; s
/*                                                                          */
8 |: O" b( C8 Z( b' `$ b# r/****************************************************************************/
  H# }% g$ E. o+ `5 @* nvoid PWMEventIsr(void)
- V: H" F% B' v5 w{7 b7 G: s* @. K7 C3 d. k, \
        IntSystemStatusClear(SYS_INT_EHRPWM1);
8 ~$ v4 F: z6 s+ [7 O/ s
3 \' I0 ^5 O$ h8 Q! r    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);+ Z/ q  ]0 M/ n) {- e9 i
}
& ]6 `/ T$ N9 I7 i
5 G/ Q: S6 {( C. B  C2 Q* Svoid PWMTZIsr(void)
6 b: m0 P% e7 y6 q{& j) l8 h; {0 ]$ B
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
& K! h: F- l; c5 V7 l0 P8 \# N
+ |4 g: |4 a& g+ }& d( `    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
2 _+ \6 a* ~' v9 P+ t9 \}' W7 J% k* D: _- Y' _

9 ]2 ]: D. A( x3 f/****************************************************************************/& s& Q& Y0 s7 R( W+ H, Z8 g
/*                                                                          */
% M3 x& e8 t3 Y: M. ~% u/*              初始化捕获模块                                              */
3 c: o) ]! c0 S8 s. Q/*                                                                          */
* a8 m1 @% u! F/ k! o8 _/****************************************************************************// m; q7 _1 a, ^4 ~
void ECAPInit(void)3 T- q1 [7 `# }9 B9 @$ Y
{6 z! h* i$ K- [( t
        /*-----设置 ECCTL1-----*/
  `' {* n* O* \. _& b) L; X: P        // 使能CAP寄存器装载5 D. p( U3 q9 @* M0 I# Z- j( z
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
# o/ \) c# w, i2 L" a        // 设置预分频值.
$ \, q+ d8 w  D. `        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
# |* X8 Y1 E4 T0 s        // 上升沿触发捕获事件
) Z7 |; z4 A, L1 E        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
2 F# D5 `4 ?5 n  t: V        // 输入捕获后重新装载计数器值.+ G1 ^2 a% Z! X) ^  z1 u: L, u
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);* X# v' \' H0 s" M% w* J, F7 n9 i

# W9 d: m) ?$ w0 e' }        /*-----设置 ECCTL2-----*/
' a' A$ V/ e' J$ Y8 E5 Z        // 连续模式
# ?( R% c( O, G' _, _9 I        ECAPContinousModeConfig(SOC_ECAP_2_REGS);7 \, e3 _) K- u; h
        // ECAP计数器TSCTR持续计数2 {9 w% a; y; K9 P
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);: |0 R) l! }1 o5 s
        // 禁用同步输出和同步输入2 E6 V' F6 o8 o
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);2 _5 P9 a* B% k5 D$ d
        // 配置 ECAP 2 为 CAPTURE 模式( \6 m# R; G5 ^; |6 m
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);: X, ], [: a* b: f

% h' ^- I4 @9 R        // 使能中断
% d# _9 W/ {$ p//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
1 ~" F" N/ J" t# b}' @+ ~8 n- m3 c! H; k# e

# Q7 G1 Q* t( \0 d0 L/****************************************************************************/
( _. L/ \8 ^* ~+ ?' ?2 G/*                                                                          */
+ Y3 ^' E, l  r4 Q3 P/ f/*              取得捕获结果                                                */
1 \. b& }" X6 X/ \1 R' f/*                                                                          */( g4 {  [9 L* e1 X
/****************************************************************************/" U, f9 m9 R) h* ~3 t  U2 s
unsigned int ECAPRead(void)
* L! B; S% v) |3 t: Q. ]{( [6 R* p4 C4 D: ]) _/ \" y* M4 V
        unsigned int capvalue;
* z& s5 U6 P4 g/ ?0 v        unsigned long frequency;
! q8 |  ?! D+ N' v" i% [! G# b: c$ h$ C% @9 z/ d8 A  a" u! N
        // Event1 中断标志* T  ^9 N7 @$ ?
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))4 C' E% O2 ^9 a/ e
        {
5 o2 }! X& y" E: S+ O4 L                // 取得捕获计数
3 a: B. p; ?1 j                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);( V$ r  d# J9 I( G' n) e- C' M
                capvalue = ECAPResult.cap1;* ~% {: u2 }6 t  x
$ y! s" U+ K, j2 r7 ^
                // CAPTRUE 模块 228M 时钟主频
, n- b- Q0 i, o9 ^                frequency  =  228000000/capvalue;
) H3 c+ F3 x* W4 R& o5 U. E1 N3 H+ c& L                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
; V4 E. R0 r, b9 ^
- x0 R0 g# x( M2 a( `# t; H# N                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
$ G; r/ D% x: L/ _/ f//                IntEventClear(SYS_INT_ECAP2);
8 H8 Q  _0 s9 F) s: Q$ e        }0 S& f! h8 s1 u8 @4 s( |8 X) o
        return frequency;4 n; b# l# G) q$ m5 p
}+ v6 Q- [/ K: v4 w+ `+ ^& P* S' T9 U

作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
. P2 t6 `+ u+ b+ C+ T[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