嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
" Q" |% f$ @0 B; b& J
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/, e1 g/ h4 V/ r% {8 c- l
/*                                                                          */; n1 |5 c" G) D3 W* K
/*              宏定义                                                      */* ^8 Z3 J) y( v
/*                                                                          */# U% e* D2 c( Y/ j
/****************************************************************************/  x+ d% o* s( n$ O& @
// 软件断点
" u5 u' R, _' j+ H2 s. o#define SW_BREAKPOINT     asm(" SWBP 0 ");
, b. }3 U' T+ Y% n7 T$ Q3 I; n' N5 |0 s
// 时钟分频; f# z. h6 `+ m8 Z, v
#define CLOCK_DIV_VAL     228
$ q+ u. x1 t7 e& V; A% ^4 P* J; O1 T/ `& U2 ^) H6 i% m
/****************************************************************************/* U6 ]. k$ l0 G
/*                                                                          */
$ u3 ?1 }- U# }8 k- k2 t. A/*              全局变量                                                    */2 B0 n6 H  z9 I' _) k6 n
/*                                                                          */
" q4 h5 R$ X7 |3 k/****************************************************************************/: {7 X$ J0 k5 t
ECAPCONTEXT ECAPResult;; s3 Y7 k0 U- g# l3 E" ]2 ?% e+ h3 F6 ]
( r1 W2 V+ W! ]
/****************************************************************************/
  ~; h1 D- E0 N8 _* r$ |2 S( s/*                                                                          */
7 t: ~  C6 J' ~/ l8 p/*              函数声明                                                    */
* ?0 \# ]; Z2 S# V/ V8 E) p/*                                                                          */
# e- a8 j3 {) A1 d+ N6 x: e/****************************************************************************/2 R" v1 L0 Z: v& }" v  |
// 外设使能配置- v6 q5 ~4 ^! b& B( e$ I
void PSCInit(void);: o( w* H+ i3 y( d

& p0 _( w0 g: J, P! c! \9 Q" c// GPIO 管脚复用配置
8 r* s& m$ d! k& kvoid GPIOBankPinMuxSet();
* n% e, g$ X! h/ l* f/ K8 h9 {) R% A1 V( R3 o
// 产生波形9 X4 g) B9 I% B9 b" f! K: _4 |
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
: V4 Y! s0 X- c. zvoid ChopperWaveform(void);7 w6 s4 j8 \' k! Q3 t; m

  c9 Y+ k' u4 ]$ p// ECAP初始化和读函数2 {% J# L0 g9 a* H  }
void ECAPInit(void);
/ [& S/ ?& M) n  s& a8 `unsigned int ECAPRead(void);
$ j5 n# B( I) ?) Q
' \& O) R7 B& p5 B- _//ARM 中断初始化
- {$ E. p: B9 B, qvoid InterruptInit(void);
1 a: T) n0 ^( l' H$ {5 X0 m( S7 v7 [9 Q+ e* y% ~
// PWM 中断初始化
$ {# X1 U, e' u9 j* A' m7 N+ pvoid PWMInterruptInit(void);# ]6 l5 {. p. c5 l) A: U6 {
// 中断服务函数
7 ^% u/ D$ p) h1 M5 f// PWM 事件3 ?3 O- g1 C, f
void PWMEventIsr(void);
! a$ Z, L% i) q' g: M// PWM 错误控制事件, {2 S' i. E1 B+ t# V  }1 ~
void PWMTZIsr(void);
1 N# Y5 ~$ ?9 I8 ~' c6 X# L, |+ p  u% ]/ ?! K/ {0 D9 T* i7 x
/****************************************************************************/
3 d6 u* [* p5 Z7 e/*                                                                          */% @, f1 R" A; G' D% H$ c
/*              主函数                                                      */
/ b5 Q+ O( b2 g/*                                                                          */
8 U5 p  Y+ F! H! C/****************************************************************************/$ r# o- O3 I' L; O7 ^
int main(void)) Z3 v  ]1 m5 @" ?% W" M" P
{
2 q8 k% _' Q6 X4 G# P' U        // 外设使能配置
; |) t6 h. w# M' m        PSCInit();
, e' z6 Q$ @2 @: _/ e/ W
9 F) A4 E4 C! e% \' j1 A        // 初始化串口终端 使用串口2
- ?$ w9 o  ?- w) X/ Q) |        UARTStdioInit();
4 `1 c9 z- M: w       
# Q7 |0 O8 E, E        // GPIO 管脚复用配置( W' O$ H$ Q' K7 e7 r! `
        GPIOBankPinMuxSet();
' Q5 b5 ]6 \+ p/ p+ _
* f5 q; |1 D1 r0 r1 ^* h& i        // ARM 中断初始化
, D4 T; J0 I- B5 s        InterruptInit();6 k2 ~( c) Z; B/ r! B% B
+ U" c4 k- ]; A7 {& o/ |& a0 h4 Y
        // PWM 中断初始化
" t) [, L4 B' M6 j        PWMInterruptInit();
7 w' ^3 H0 z- q9 t/ \6 F! x- A* e1 u3 ~! a( L
        unsigned char i;( z' Q; p: `; r. u  w, q$ R
        unsigned int j;% T# V  j4 `% m" M- p4 z) Q
3 V  w% p6 S" [6 w+ u3 H" s
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);8 i3 |: a: {4 W
        UARTPuts("------------------------------------------------------------\r\n", -1);% R+ J3 T5 ~7 J1 Z/ o% s7 B
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);* f( h# J  n+ L& {" N) i4 w4 V
        // 产生波形* x! B4 o' Y4 \, L, O
        PWM1ABasic(25000,50);3 ?$ o& p$ r  d( r) z
: D2 T3 d: k. @  [9 i5 ?
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);0 q7 N) j5 m1 H& b% \
        UARTPuts("------------------------------------------------------------\r\n", -1);
, a) T# s. E( v$ w4 {2 o9 C
% M# T4 s9 m( \- x$ U
- S" Y6 A4 K  A5 \, ^4 p& |+ V$ w5 Y6 A7 g# Q. c0 B
        UARTPuts("------------------------------------------------------------\r\n", -1);
" {! f( O6 f  Y' M3 n# g        UARTPuts("                    C6748 ECAP Test\r\n", -1);
2 B) y; U* j3 R1 A- D$ V        // ECAP 捕获初始化
- ~: f8 f! x- Y0 y6 M) h        ECAPInit();/ ~" L: m& F7 M- K0 ?9 T7 C
        UARTPuts("Initialize ECAP.......\r\n",-1);
, n( H: m3 D, g4 z$ E# ^        for(i=0;i<5;i++)* F' [; x- E; Z( H# }
        {
" \2 M; S/ M3 t/ W0 k) }                    for(j=0x00FFFFFF;j>0;j--);            // 延时
6 C: ]9 W; Z% s6 g. E" p                    ECAPRead();
6 N' p: k( }/ f6 B        }
( y+ I4 i  D. q& _+ u( ^' c        UARTPuts("\r\n",-1);
: ]" T; U3 ]/ e* n0 Z        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
3 f3 z1 h4 ]" w6 C+ X6 L/ p, O0 B. {        UARTPuts("------------------------------------------------------------\r\n", -1);" y5 |: A/ U  y1 d7 b) Y+ o
# ^6 }. t* n7 o
        // 主循环
5 A* M1 L" c& O3 d" Y        for(;;)+ j2 u6 F! C" b, W
        {
+ L5 d+ w. v" d: K0 b8 m: C5 A
, i( [) f( f9 C$ K3 F+ W% c: {        }
/ Z! j" c' x6 V  t- O7 Z0 m}' e1 E; j/ s9 \/ p  a: X
& j/ `) Y# r9 ?" T" e$ ]! D
/****************************************************************************/
. X/ B) ~6 @: S. J% t2 q/*                                                                          */
4 m9 W, `# s4 z6 u$ @+ ]+ ]  p/*              PSC 初始化                                                  */
+ j$ `& O# _; c; ^* W. n9 z/*                                                                          */
+ W3 k+ X7 f. B: ]7 q8 S$ ]/****************************************************************************// M1 |: B; R% K! a9 m( g& k: n
void PSCInit(void)
; o0 ~' q. L! c, R/ y, b% h{
4 M+ \, _* y; O        // 使能  EHRPWM 和 ECAP 模块/ Q! x4 L& Q! s6 B
        // 对相应外设模块的使能也可以在 BootLoader 中完成5 K: P8 m  o) j2 Y6 ~- o; v; S
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);3 y/ {/ N1 R3 v3 f- Y1 W
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
+ U. {% h$ C$ N$ g4 `}
" x) m, T2 m; L9 Y, J4 o9 B! Y0 }
0 }4 R% ]* j/ i/****************************************************************************/
9 V$ E( g$ y2 e( s( E9 e/*                                                                          */( r2 t/ c, s2 y+ v( s/ Y9 z9 S
/*              GPIO 管脚复用配置                                           */. {/ Y8 Z5 c' }  m. n
/*                                                                          */
& G( \# `$ @; ^8 R/****************************************************************************/9 h  y" A0 ?3 ~% Y/ s& H
void GPIOBankPinMuxSet(void)
$ @$ X7 O2 ]7 Q9 B5 j4 f) _+ O{! q; r) B, Z" N! f* y, D. K
        EHRPWM1PinMuxSetup();, o  V( b1 j$ {
; f8 ^2 O7 |- B; Y
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)0 B* |$ y/ R9 A$ Q0 @  C
        // 作为捕获功能时管脚方向为输入9 q4 M: S+ z; P6 {/ Y
        // 作为辅助脉宽调制时管脚方向为输出9 \& G) O7 S7 {2 s( F/ ~" e9 \
    // ECAP2 / APWM2
* V: A8 l+ ?$ `8 Y0 H        ECAPPinMuxSetup(2);
, K- S: `9 ], A% T' g# D: u0 G( a+ W8 u  G( ~, F  d
        // ECAP2 / APWM2方向设置为输入7 C. v& g% I  \# k8 E  e
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]( P2 Y( v% [  V4 L
}
& V8 _9 H5 @! v0 x! Q4 ^2 ~$ \2 I  ~! D
/****************************************************************************/* u; i% D) O1 `8 E1 O, s
/*                                                                          */
3 L* h. R/ x( U0 s) ~% n/*              PWM 输出波形                                                */
- y9 `' Z3 h3 g7 q* x6 v. I5 \: x/*                                                                          */
: O' N4 t" w5 y/****************************************************************************/0 A1 M/ m1 z: c. b9 |: H# V
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)5 X% {6 U) q- V
{
+ \" }% G6 S4 U, b. Q$ i    // 时间基准配置
  `8 A4 n: _/ c: `7 E    // 时钟配置3 ^2 N* r; ^5 i- `6 v
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
  q1 y& L- p  e! g$ |& T
; F# G# Z2 N) k& ]6 i0 j    // 配置周期8 t: x/ p% N, _4 R' G- t( _
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
' ?4 y: r' V, x2 k  m% [( B7 e                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);- z* K5 B. O) q$ m2 J9 m! `1 P

# D. C* V  P4 ?" q5 W    // 禁用输入同步信号
# b% q. w$ e& T* t    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
3 k! ^1 A$ \! W# v) U3 A
% q; ~; b, \3 g1 t    // 禁用输出同步信号7 u( U& f* d4 l2 @! j4 l* t4 t
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
8 L0 L! ^' L, W( J6 c
7 s6 z  P  x$ G  X1 [    // 仿真(DEBUG)模式行为配置
* m$ d' O1 F/ Z6 A  T% y8 B: A    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);8 ]5 W0 H$ w1 u# {
. M# [  v% C6 ~6 t; `" |3 N# k; F
    // 配置计数比较器子模块
( m9 c* d8 h9 S7 E' K' s, [! J4 b; {  b    // 加载比较器 A 值
9 I0 C" z- V7 g/ L    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,- P; m& y$ h) C
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);, H7 w+ o8 o8 J9 Q; d2 `
2 b7 P* _/ v5 C  u  ~
    // 加载比较器 B 值; g) s+ M" a) W
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,, n; }/ g+ r4 [) J
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
& L' z$ B; L# g! w' |! Y& H  E/ H3 r% x$ U2 y1 ~
    // 功能限定配置(输出引脚触发方式设定)
& L0 P' X8 x% ?* B- O( U    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出! L" v& y0 r3 c: g% Z) }; O( y' K
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,% f  j; P/ z7 N5 M- M
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,: P9 V0 i+ y' X$ H, ]
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);8 S& c8 n6 n2 [% F! w" L

' \2 L$ R1 }4 r; x- I; f7 w  V    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
( ]* \# O/ P' |$ H& m$ K& [! b    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
+ M+ |& e7 _- X7 u3 a9 O! s; v  ?  k! ~) J. e
    // 禁用斩波子模块7 O2 O; q; v3 j5 |; X1 Z7 T5 p
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
' m/ A: l7 Z- _1 V/ H: U3 e# J# f5 X8 v7 [$ w& |, f* }
    // 禁用错误控制事件5 N3 J  C) ]) R& ~4 d
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);/ S3 C! g* A# V# N3 ]  A
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);' g% z9 S+ p% e7 r+ ^: m
: f% Y1 c4 [: N
    // 事件触发配置/ [6 f$ m, ?' r) G
    // 每三次事件发生产生中断0 u+ P: {; M6 t* d, E6 K
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
, _- T% x' L* z% @7 z    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
+ i% M2 \) F" B) Y8 a    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
! K* ~. {$ B6 Z; \% A    // 使能中断
1 Z: E9 |1 C$ M) n* L  \( n' u    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);$ t" b) {" K( j' q  N  x9 _! m

1 P0 V, w* Q0 T& y. [; u6 p4 d1 n    // 禁用高精度子模块9 C; y# B4 \$ m5 P
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);+ z. J! @! l8 n8 f6 ^! v# V
- ?: s/ i3 d0 r; d2 O- ]
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);& S4 p! c; G  u) y0 H
}
: i1 u& l/ T2 c0 x% M9 @( V: Z7 V# ^
void ChopperWaveform(void)
* R  a+ K9 h( @6 H- v0 P/ C/ b{
- m/ I6 j# e$ r" i0 _0 Z% W    // 50% 占空比
! T) i9 m+ O: H    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
3 D5 H& B, u# P# p    // 4 分频5 Y/ O' ~% }% H0 Y5 I7 q! p
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);% x6 y% d+ {8 K% e1 m% ?
    // 单个脉冲宽度
- [" {$ `3 H* |+ m0 _0 w2 x    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);& ]8 _7 y% y3 N
    // 使能斩波子模块4 H; x, ^3 s$ A, Z" s! C5 p0 O; O; r
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
( d* s) H: ^2 t# ^! S5 w. d  I5 c}  A/ J8 q, L$ i7 R
* O( t# ~7 C9 f% \4 b# d
/****************************************************************************/, I: M# @" }& A$ W
/*                                                                          */
( T3 e8 M/ ^( o/*              PWM 中断初始化                                              *// j4 Z* |/ I# o5 H# m( W+ p
/*                                                                          */
( K7 u) N+ m; w5 ?/ O3 F/****************************************************************************/3 B. X  Z2 s4 W9 Z- _! P( M
void PWMInterruptInit(void)+ o3 z/ k: r* a! w8 b6 o4 C; N
{
8 `  f% g* h1 ]" D  Z        // 注册中断服务函数  F1 S0 q2 S. p. @0 S" ~" p# l# C
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);& |- _  _2 O- l5 R% [
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);% K) c' R! B2 }

9 J/ L6 @1 \# p% J# K/ J1 X& H        // 映射中断7 B8 G! c" U7 x% A0 z
        IntChannelSet(SYS_INT_EHRPWM1, 2);6 ]1 |6 h) s1 x7 h- A9 _; L
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
% y7 {' x: R, `- N
6 t  l2 f, g. s7 k; l) X6 _3 f8 Z        // 使能中断
! j" Z/ W& f0 z/ y. t4 J9 H        IntSystemEnable(SYS_INT_EHRPWM1);
5 J+ m5 v1 Y& ]. q3 v/ F        IntSystemEnable(SYS_INT_EHRPWM1TZ);
  U* k& _# V  J6 X; C}
) K. |+ v/ e& V
( [  a. q6 B/ [/****************************************************************************/0 O* Y* R- a% L. w& D
/*                                                                          */( e+ s  h% f) Q/ v
/*              ARM 中断初始化                                              */& I; w- X. {* k
/*                                                                          */
8 a$ h' F* p6 y0 b$ z" ]3 [; Z4 U/****************************************************************************/
( C/ z& F: E% h. d9 {void InterruptInit(void)3 ~( K  y) n* ]3 @. c( [  M
{( v+ d) B' G$ ^7 y* o, X3 c: N$ A
        // 初始化 ARM 中断控制器+ U" a8 p: k) z5 ]* B0 V" r
        IntAINTCInit();
; E1 j; ?0 \. Z+ V1 e* H! E
& T% b: r( t( \7 P/ U% p        // 使能 IRQ(CPSR)
3 {) I6 I) _! w& H0 U+ J( l. a        IntMasterIRQEnable();
. P6 \) |  u) l+ w5 g. a
  \: ^3 S) [: }% @        // 使能中断(AINTC GER). m  U5 x5 B5 X4 U$ l
        IntGlobalEnable();9 }7 B7 Q+ K( J2 A) c
& C! Q$ X, G! I/ m
        // 使能中断(AINTC HIER)" l. E% v( H. H
        IntIRQEnable();
$ {3 `) @9 s; g5 c2 W; R: m}
9 U: C; Y  |2 R9 i: W% s( }
2 ]2 `/ K* _" _" I+ _& |! `
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/6 }4 f4 `2 R- n) k1 @5 h* Z
/*                                                                          */
' J8 W4 [2 X3 D. C" S3 `% U/*              中断服务函数                                                */: W. F  ^: g1 l/ Z, B
/*                                                                          *// ]% W, m) M8 u, o2 ^1 F
/****************************************************************************/
2 ~! R! H7 k6 N+ @( tvoid PWMEventIsr(void)$ m! m% E7 `; d  V) u$ M4 H
{
4 s$ B9 Q! J$ V' O        IntSystemStatusClear(SYS_INT_EHRPWM1);, t. e8 e+ a7 A8 }
+ P2 {% q. A" D" W2 f) }
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);& Z. f+ B6 K& o' u) _3 V  Q
}8 c5 R6 Z! L! C4 s$ B9 Y$ n9 J
! i5 s8 C5 x* k+ A0 a0 w  ]9 k
void PWMTZIsr(void)- I% R: w' _' |- g& j; |
{- U& Q8 }% {7 |/ v3 @% {1 t) [
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);% v  t( C8 u3 X. J* C; _( H- |+ V

+ q1 h' @' K  E: S    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
4 I$ K6 ]: F5 k5 y}! u. ~7 K; p+ a# F, S5 @; f

6 K1 s' Q- I# B  V! x) p. W& E/****************************************************************************/- n) P& a  _8 Y" E, D% W& e
/*                                                                          */
+ W$ g. R. {$ `/*              初始化捕获模块                                              */( e3 b' K) K* S6 w+ i  [
/*                                                                          */
( Q% W2 @* Q$ t/ D' v' z/****************************************************************************/0 ?1 e, v7 x( ~
void ECAPInit(void)
+ a' j- e; J0 ~{
% X8 J( S) [. [$ [" s0 C: j        /*-----设置 ECCTL1-----*/
9 b- A, f8 X3 a: x  K+ ?* @2 w* f2 N        // 使能CAP寄存器装载; s/ _' v: U; T) X9 i5 y) X5 u
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
% e' D. e7 [7 k. ]& S+ v2 J1 t        // 设置预分频值.
) r$ G9 r1 I7 ^; c0 p5 o6 a        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);3 \9 V. O- G: i) t* v' ]
        // 上升沿触发捕获事件/ H4 U/ V- H2 ~1 M, K: ]
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);( |  |  f% O  T- L
        // 输入捕获后重新装载计数器值.  B: w9 K4 ]) w$ ?* N& ]
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);) a- p3 O$ H3 @6 h
" _! B. Z% B. y' ^& v
        /*-----设置 ECCTL2-----*/
: g8 a, x* d. Z2 W. b# w8 B, B        // 连续模式, M4 T8 X; `, w0 I
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);$ l8 p' O( \2 p; J& ^! C) u
        // ECAP计数器TSCTR持续计数
. v+ k( Q" M9 V' m4 e# U        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
2 n+ L4 m% Y9 r/ E        // 禁用同步输出和同步输入
7 h& V( |; L# L$ W        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
9 y1 r- I, T+ o% ~8 n9 Z        // 配置 ECAP 2 为 CAPTURE 模式+ a' m8 r& r! ]0 q- u' \- Y, F, O: ]& h( P
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);7 o* Z, i+ O! s! X4 \6 R; j
4 o! T, ~& Z; X4 N+ F3 N% b$ Y+ m
        // 使能中断
0 p6 ?/ f4 B4 v3 g//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);! u1 v' f$ u. F1 q3 t" y- \
}
" B) F7 V3 E5 c" Q. m# X$ |8 A- J. t+ l
/****************************************************************************/# ]8 l, t! p- f6 Y6 v/ l1 Z
/*                                                                          */
7 \. E# e6 i, w& y/*              取得捕获结果                                                */3 c: ^( l4 L9 {" V& j; ?& _
/*                                                                          */+ ~8 o: Q0 W% R9 e$ s% C
/****************************************************************************/  ^4 h2 B5 r5 `. M0 r8 i
unsigned int ECAPRead(void)3 f8 o  p9 n) u# R
{, V5 y9 Z, m5 [1 y& z
        unsigned int capvalue;5 u0 g5 Q, z3 [
        unsigned long frequency;
  J) A2 Q/ ~; e. B# ^! @+ Y5 I' @: n/ j6 ?# L9 `& i
        // Event1 中断标志8 ^3 Q: J+ @! ], x5 n" N
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))5 g4 m" o; E6 [$ |, A; P# z
        {* \  i; z# o: O. v
                // 取得捕获计数' ^% S6 D/ f$ \# |: s$ r0 Z
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);" y9 n, a) J. q! n7 }$ m
                capvalue = ECAPResult.cap1;! D) Y* o3 R6 ~! E; |# p$ B
% ^  R7 f/ [8 T0 M7 e
                // CAPTRUE 模块 228M 时钟主频6 {; f+ `! ~3 Q, R, p2 H8 ~" V; H$ F
                frequency  =  228000000/capvalue;: ?7 Y& K) M5 W% \$ N( o& {  H9 z
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
7 O6 Z; N/ m3 o" Q5 M
3 G6 x# I6 v$ D6 X3 ]9 f                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);" [% _" g/ j5 N; @& I
//                IntEventClear(SYS_INT_ECAP2);5 F# y: J$ K- a- S
        }; j$ _6 K2 t- {) u; P
        return frequency;% j& t8 j+ u) ?, w( C
}, G3 |/ Q6 b" M9 x1 S1 A# j

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