嵌入式开发者社区

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

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

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
0 S1 {8 y' t8 b2 T% v" I" I9 M/*                                                                          */
' |3 ~2 U: U6 U8 A$ r1 Z3 m/*              宏定义                                                      */
' n; p7 L8 ~2 \9 R5 `. Y; P6 c/*                                                                          */4 o" _5 S8 M$ A% X
/****************************************************************************/8 |2 |+ n5 k* e' `( u0 {2 G
// 软件断点
. s8 p5 l( h7 j0 y#define SW_BREAKPOINT     asm(" SWBP 0 ");
8 [7 e0 N1 Z8 e5 C* o* M! R
1 \  [; O4 y0 m1 [( u6 d4 A2 u( A// 时钟分频' c+ U/ A7 [# Z) S8 @2 Y. ^3 G
#define CLOCK_DIV_VAL     228
% _0 A. t1 i: ]0 k0 _5 w- W$ C: d7 U
/****************************************************************************/; d' U' U/ W2 c, e
/*                                                                          */7 P8 ^6 W! ^8 `9 ~2 S. G; Q
/*              全局变量                                                    */8 A% R( \' L, K! p4 @2 P6 E, y
/*                                                                          */- _" T4 z2 L0 m* E7 S4 W9 D0 s
/****************************************************************************/. B: Q3 h4 m8 B8 n
ECAPCONTEXT ECAPResult;
) t$ d4 o4 `. V$ b7 ]
8 n' ^) L# k; n/****************************************************************************/
! ]+ W- f6 }: e0 U/ W/*                                                                          */
- j$ H$ {( \! g6 v- h/*              函数声明                                                    */
5 A8 a" `. h, t- }' g/*                                                                          */( K2 ?3 r+ Q7 r! }/ G3 l
/****************************************************************************/8 _' I5 P3 E8 r( p$ x' a  {
// 外设使能配置$ q9 l- E0 y5 y. b1 m
void PSCInit(void);+ b$ O& o$ U  @* I  ~

% G( P: C9 l8 E+ t8 q+ @// GPIO 管脚复用配置
7 L$ ^  O( m' Q8 a8 {void GPIOBankPinMuxSet();
: X" F0 Y6 Y5 |" o9 o, }) H
, D5 ~1 F/ y$ Q7 S// 产生波形
$ H( a" S1 \' e' b* Q- ?7 Mvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
, R# p/ q" |$ @' g) M% \void ChopperWaveform(void);
+ F3 N; m% d6 m6 S* v: x  s% J# G* @  j8 T
// ECAP初始化和读函数
3 Z- N4 {, R+ Q: f( |$ n* S7 f3 Ovoid ECAPInit(void);) Z# H& {! l" ~' s
unsigned int ECAPRead(void);
1 p4 D5 y8 b$ y) e' N1 K. t" r
//ARM 中断初始化
2 ?, [+ }+ i1 a6 `# s) k( Lvoid InterruptInit(void);
5 \# U. Y) ]: B4 F5 T( E) @$ m; X) l+ A: z" {9 p; T
// PWM 中断初始化& J- w" u5 M7 W6 `' v" T" g
void PWMInterruptInit(void);
% X( {  U) X) E7 u4 a9 E* M- ~7 c// 中断服务函数
3 T% q- H  @) Y// PWM 事件. S& `  ^- h7 m' q
void PWMEventIsr(void);
* Q. y: |$ K, D2 N! F5 h/ d8 g) V& h// PWM 错误控制事件
! D% [& |' c" B; d7 wvoid PWMTZIsr(void);. e/ v. R' i2 l- E
0 s5 q3 j. i4 `- @+ z
/****************************************************************************/
+ r* Q* H, X. Z9 w- ~) D/*                                                                          */( Y/ ^! e8 |3 x8 u
/*              主函数                                                      */
- n0 S$ [0 N/ _! b2 S/*                                                                          */
+ d9 F% M! G. V9 F$ W! K$ t% i0 D3 e/****************************************************************************/
( P5 O& `: c' O4 i; G2 qint main(void)
+ k! x2 e5 y8 ^{
5 ?" R/ S+ @& [% [0 e5 e5 V' F7 S" Z0 b        // 外设使能配置9 z5 n6 [" x) H2 \: Y3 b
        PSCInit();) S3 q- d- h( A- c4 f3 I
" s7 _, ?- p9 Y; m7 _8 n' l
        // 初始化串口终端 使用串口2/ {$ Q2 T5 b/ W# M  f
        UARTStdioInit();" o( E: I1 T8 i& p* R8 h% T
       
* V- ^  {! g2 u* s; o- [8 z        // GPIO 管脚复用配置
( k: f. e( M) w6 i- l0 O' O5 v        GPIOBankPinMuxSet();
! k$ K# f3 E& d6 l2 a, ~% c. j7 K! I  X) O6 _8 \6 c" I
        // ARM 中断初始化
5 ~. l' u3 @# o        InterruptInit();0 F% r1 o- j* ^& ?- b% ~
" u+ n' \; F3 Z6 b4 h. M, F
        // PWM 中断初始化
& {" v8 O$ u  a& a. m: C        PWMInterruptInit();1 p9 Q2 Z  ~0 D( z/ X

0 q& U0 F8 k# @$ D8 |' q, I        unsigned char i;
$ z7 H3 A( `& T, \8 X8 A2 e( o        unsigned int j;
' b1 z: ]0 u) ~2 R* g0 a9 Y, b( Q9 o  d
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
, M' f. G9 h) Y0 |+ o( O3 O* H        UARTPuts("------------------------------------------------------------\r\n", -1);
9 B3 E8 ~- y4 y/ o3 i8 Q        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);0 ?' H6 U1 _$ z/ k0 D) Z1 l4 k) A% M
        // 产生波形1 W% F; e' b- p& A
        PWM1ABasic(25000,50);0 l7 i5 ^+ h5 b+ E3 G$ s. r
1 L' `; c( Y  o+ Z5 z' {
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
4 U7 s/ u) f5 i' o! A        UARTPuts("------------------------------------------------------------\r\n", -1);
1 W- w( T7 J4 s! H4 B
# y3 m' V- K: [+ u. [. b0 Q
( v$ v+ |! Z$ z% |6 N0 D* [7 G
; P* @/ h7 n+ \1 w        UARTPuts("------------------------------------------------------------\r\n", -1);
1 s: u3 I2 ?5 ?0 ]: z        UARTPuts("                    C6748 ECAP Test\r\n", -1);" I: x8 L% c6 L, q! R
        // ECAP 捕获初始化; k* P- V% c/ m, {  T# X
        ECAPInit();9 z% ?$ C2 I1 A" P  m# B( G( ?
        UARTPuts("Initialize ECAP.......\r\n",-1);) [4 a& s, F( Y
        for(i=0;i<5;i++)5 I  G0 M* I. q+ T7 q
        {6 l# M, T+ r+ h8 l/ `! `; S
                    for(j=0x00FFFFFF;j>0;j--);            // 延时
; K2 V* G' T8 c/ Y* `+ S8 q                    ECAPRead();
3 Q$ m! s- K2 v* m        }8 h( Y+ \3 f: r" C% b: L+ m, W
        UARTPuts("\r\n",-1);
' F. ^" G1 q* j7 e4 Q# ^& L        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
8 d; A( s4 F4 f9 T2 g4 p# n% Y        UARTPuts("------------------------------------------------------------\r\n", -1);( Y# j& g5 c5 Q) z

  B3 Y# n, x3 R# S4 [: ^        // 主循环' Z) R7 |/ k- N
        for(;;)6 z" }$ ]  [& C* t; ?6 ]& d$ P' m
        {
1 i2 {+ Y7 F! Z4 G. h9 b$ `* G3 i0 ~% S
        }
2 y  V. {" m( E, Z% q: [# i( l. Z( g}0 g0 i1 L( a5 e+ X5 O8 [

: D% }. P8 W. @/ Z) V6 ~! j' H4 a2 F. Z/****************************************************************************/
3 b4 P0 k6 ~0 a/*                                                                          */
  s; }( T' G8 v: Z/*              PSC 初始化                                                  */9 p( J3 [# S0 ]' y4 P+ o
/*                                                                          */( N( ~% T  L9 k6 b$ }6 _) J
/****************************************************************************/
1 {. N. ~* u0 Y! p( D" W" W1 Dvoid PSCInit(void)6 r! S! e8 d" I3 y( D* W) {  F
{3 y) t" r0 B+ h9 ^& N/ @
        // 使能  EHRPWM 和 ECAP 模块
% j8 P. h2 \$ H- s* h0 K  P        // 对相应外设模块的使能也可以在 BootLoader 中完成5 V% p# q, Q; u' Z4 j% q
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);1 }; T: H9 U9 i
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);, v7 q3 o) p; g
}& }& T8 L) H$ c+ G6 k* c
+ H4 S$ g/ E" U, x
/****************************************************************************/
. s# d' s3 `8 g3 K* c5 B: N( n$ K/*                                                                          */
; c1 X  a  z8 C) t# @" Z2 o) v/*              GPIO 管脚复用配置                                           */
8 k3 q2 V7 U) o& s' n) k' U, ~/*                                                                          */) [. `) y! _0 c+ o8 l) Y
/****************************************************************************/
2 I$ M8 w$ U1 r$ ~void GPIOBankPinMuxSet(void). m- b0 c# m7 v
{/ e+ t) u! A- J
        EHRPWM1PinMuxSetup();
# J1 ^' \5 a7 F: v5 S
1 {2 H- z0 r5 L: q" g: x        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)& _* m  E+ l2 ~  B, B' e
        // 作为捕获功能时管脚方向为输入
  H7 z( o/ a, a" L        // 作为辅助脉宽调制时管脚方向为输出
/ t+ i" h. _. i. d5 ?/ T) m    // ECAP2 / APWM2! x1 V/ A+ }7 V4 i. H
        ECAPPinMuxSetup(2);# N$ E. @/ Q1 T" x2 {

" j! P  u- v9 f/ J1 ?$ d        // ECAP2 / APWM2方向设置为输入
. m1 ?+ K5 |% H# H# D3 R0 C9 w        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]  e4 F" B3 I9 W* q+ D
}
+ c- C9 L8 j# ?. K' z) o4 ~+ x8 r% V! Y, b% t7 J% |
/****************************************************************************/
, y1 p6 v+ w( |) D+ X% O* t- ~/*                                                                          */
9 @+ N; O, v" u+ F% U/*              PWM 输出波形                                                */. Q% e4 }) O, d7 @2 ^
/*                                                                          */& X# z4 X( c( ]
/****************************************************************************/
, ]9 P( x% |" I8 ^5 }0 zvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)2 ~  `7 ?  |% J
{/ o! D8 _( ~2 x) o% D! v
    // 时间基准配置) O5 U0 @& ~2 i! F$ w
    // 时钟配置
+ Z  U) O: ~7 B    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
- x! _* p( K* `$ x- P9 Z# Q
5 N. [; ?, k  x    // 配置周期; c8 A' D8 b1 C% {- S: ~
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
( @7 }4 x3 Q4 L; l, M* h                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
  W* u+ M8 U9 D  a$ n0 C
  |) N2 V& m( g3 R  i" l" y    // 禁用输入同步信号. s6 E5 ?* I$ B. C$ H; U
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
2 [9 F2 t' E, X4 f
7 p& {/ W2 E7 Y, }- w! a    // 禁用输出同步信号8 _) q2 Y' V1 w% i6 v
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);# U) m! v; x: w$ ?- |

+ X/ A# |6 c% W! N- T3 J    // 仿真(DEBUG)模式行为配置
% u" W7 x' `: O# P- F  [    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
7 S/ q4 y/ \" E0 P8 {4 {* S0 W0 a4 Y9 }) C: |& v
    // 配置计数比较器子模块
3 e; g$ m4 Y' o, L    // 加载比较器 A 值
6 w. n; z0 q: Q1 y" Y) H- I    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE," w6 t! c* ~4 v# R# ?
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);* x( ?" B4 P9 y! \% Q$ k

2 e0 t! N. A3 d; v/ B1 S    // 加载比较器 B 值
* y& X( T' {5 A) q+ Q) F# O    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,$ }/ t9 W* i: C8 K: q0 r
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);$ ~& `4 u/ s8 m5 i" ^( J: r3 b
' k1 x  l, W7 S! f7 n9 O6 x
    // 功能限定配置(输出引脚触发方式设定)
1 T. z4 q- K7 p& M# G% q    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
% c  J1 T4 D) `* U    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
) W) `% F1 ~. v8 U1 v$ D2 A                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,0 w6 I8 S7 E% K/ a5 c* C
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
  S5 k' I; T1 V9 L1 r. B2 b4 T2 N
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块) F( M* O, R3 v4 J5 T# p
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
' {  q. A( N  l/ W8 }3 ]1 C7 b2 y5 t7 @' T% a) C% [5 I0 V
    // 禁用斩波子模块
0 h; y. W" X" ]* B4 T. W    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
2 x' Z; }+ H' U6 G1 x  Q5 Y- s6 z* k& Z" S) q# K9 `  h3 l
    // 禁用错误控制事件
1 \/ F8 @  h3 e  \3 j    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);5 h6 r: {7 a- J7 k" g4 t
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);5 Y; P& `6 n3 M# z; X
% D+ ]/ W$ P7 m, i# k' o
    // 事件触发配置8 n+ f. E/ ^' h
    // 每三次事件发生产生中断
: F( I2 q4 q( I4 Y" E4 n, R    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
( x+ M& m7 R* i  y# @    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件1 t! i; n" l: p
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
8 @* y$ {; P( m    // 使能中断/ J) ]# I3 t( c' s( |0 P
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);, @7 _# Y* P: i( [

8 `7 A3 y$ A% d: Y% T* S    // 禁用高精度子模块
+ b& w) S, |' U2 z    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);3 y8 H. l& I# c
1 S6 L) A4 S1 ?$ G. _
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
2 g( ?5 }1 a1 O0 `, s}1 [3 I! g1 B1 N; S/ V
7 k% O' H1 {  R& t2 D* W  `
void ChopperWaveform(void)
, [9 J' G6 L9 s{
3 r' o) i  O/ [- q) l. j; F    // 50% 占空比
6 [! I8 N6 X; \* |- T/ z    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);, W( C( e- w/ b- ^5 B- i$ R
    // 4 分频9 H% V" V1 _" g) t8 w
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
; v* L% Y4 N. q5 Q  n    // 单个脉冲宽度
2 ~: g. g1 z. g, O3 y# x    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
0 t1 u: T0 l% z' {! `; x- _4 ~6 [3 O7 q    // 使能斩波子模块# _" ^- G" \1 k" X
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);- w+ [% V, k. a  B6 Q; v4 f8 x: J
}! i' O  r' P. {' ?
1 ]: S: h7 B3 B  R5 Y+ b
/****************************************************************************/
/ |" ~+ x9 J$ A; N/ e/ a3 O/*                                                                          */
# r9 N% B* y& v, x; I/*              PWM 中断初始化                                              */7 \$ b- t& K$ X7 K7 m
/*                                                                          */
) E5 `% Y1 k/ r$ K7 M' C, S) W/****************************************************************************/
/ r7 g9 [8 m1 b5 ]' w: }! Vvoid PWMInterruptInit(void)4 x  d0 n( ~* q- u2 D! B% ~$ l- ]
{
5 j5 e, F' ?) d% _1 \; r3 l: ], N' ^        // 注册中断服务函数( }4 ]3 Z* S7 B
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);& ~; i) F4 v1 N7 g* a8 n& ~
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);, ?) D$ f) k" l

) p! c  W. B6 C+ x% ^        // 映射中断' z! A. F# s( k9 d6 F" X
        IntChannelSet(SYS_INT_EHRPWM1, 2);6 Q" Z, q6 n0 Y/ H2 B7 [" T
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);/ E0 O0 c8 j* X

, y( \' h% Q) a, F& T5 O        // 使能中断
! P  U# c0 R- d( g) R# y        IntSystemEnable(SYS_INT_EHRPWM1);
- S# ~# w* v& o3 W        IntSystemEnable(SYS_INT_EHRPWM1TZ);
1 F  J1 `* O( B0 @  g- N! c}
/ u  s: I5 G0 l
2 Q" q! H5 A2 o* x! o9 ^. _$ e2 d) v/****************************************************************************/
# l* u/ F+ r+ W2 [! z; r. C/*                                                                          */- ^0 x# [' |4 t& W( R. W( l
/*              ARM 中断初始化                                              */
- Z) K# s% J+ S/*                                                                          */0 _8 j% m! Z% t8 D
/****************************************************************************/
4 r$ T9 v" W9 I5 N( p1 Fvoid InterruptInit(void)* |7 H3 H1 y9 D# r6 x
{
% O+ ~7 y7 G# K        // 初始化 ARM 中断控制器1 s. ^, w- h  C' [/ Z5 m* ^
        IntAINTCInit();5 o* |# m5 j+ n, l/ [5 m) Z
, ~/ G  b5 p. L' E# d3 @
        // 使能 IRQ(CPSR)
2 S! n; Y0 P& W* v0 c, ?        IntMasterIRQEnable();: O; n9 J# E+ Z7 ]& I& I/ H
5 j. k4 a3 |/ U/ b: z9 Y! E) b" O
        // 使能中断(AINTC GER)
4 S6 b7 Y( |- A: D        IntGlobalEnable();
/ j# g7 N( c; d, Z0 c5 ^" Y6 }7 r5 R3 n9 s5 o) |5 u8 Y) h
        // 使能中断(AINTC HIER), J* t; p# }1 j! D+ ^, c. f
        IntIRQEnable();5 e2 O5 Z  n" z5 `' m+ O
}
5 Z5 p9 W" }! Y& D8 f( ?3 M0 |/ n* r2 S# a6 |

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/
) p+ }+ v2 S9 u7 k/ ^/*                                                                          */5 F' z9 a9 i( Q7 _
/*              中断服务函数                                                */
8 X) |( V; W# R/*                                                                          */7 F2 v5 @2 q7 {2 h2 M# {0 z
/****************************************************************************/
) N0 q, }* p% H$ R- u; p# a( M- Jvoid PWMEventIsr(void), v* Q4 h9 E; m2 H
{% R2 A: U* W. \
        IntSystemStatusClear(SYS_INT_EHRPWM1);
( q6 }5 f- U1 z0 m- ]: O4 c8 v* `# z  G) r/ S' H7 N( z4 R
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
0 `5 b: m3 Y# Y8 Z/ b9 o}: ^* H5 x3 A1 g, S5 }5 n7 B
  I& m; O6 O6 E6 e
void PWMTZIsr(void)
4 n8 W- Y* l' X, l) r% r5 f{
- S& j, e$ C6 x% j/ d        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);7 W0 b+ \" ~' n1 e( H

5 @0 U% N  @# D! i% T    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);( D& x  }9 n# b0 c% ^9 K6 D
}
8 J  f. z9 s% E9 d  Z2 W3 R9 Z( Z) q% k- M
/****************************************************************************/7 ^7 c5 ~/ O) R6 N6 S' E0 \9 G
/*                                                                          */* j1 N0 n# y' M7 v, C
/*              初始化捕获模块                                              */
. O/ X+ V, w$ W, o# K/*                                                                          */
% |- M$ R3 `$ m9 b3 }' ]/****************************************************************************/
6 e( f9 ^  O3 D, b, ^7 p9 Ivoid ECAPInit(void)) u1 X8 Z' ?" ~# x& y0 M' Z0 X2 v4 ^
{& o( S$ S, ~/ ~9 K3 [0 L5 V% f9 b
        /*-----设置 ECCTL1-----*/) y) a( [2 S# B3 A9 q  w" z
        // 使能CAP寄存器装载5 d, t  j( r4 ]5 T; V) _7 L
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);% G+ O7 _7 V* @0 u0 Y
        // 设置预分频值.
1 e: V7 D5 i, e* C8 z; I6 l        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);1 G+ r& C! z; k4 j( w% R
        // 上升沿触发捕获事件
5 U. a6 C7 j2 }7 M        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
+ T- L& S8 e! `& M/ c5 q3 Z        // 输入捕获后重新装载计数器值.
- C; X1 C' D5 c" R        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
2 L* N0 d5 {3 s( j$ }( Y/ ~/ R6 B2 i4 W* ]/ C8 y: y8 r+ D7 H
        /*-----设置 ECCTL2-----*/, Y7 n! k! @+ v" D. \
        // 连续模式
( A- g: N' O% ~7 w/ \) c        ECAPContinousModeConfig(SOC_ECAP_2_REGS);. T( I, f+ K) O
        // ECAP计数器TSCTR持续计数% Z$ n$ R! Y( s: j& E8 ~& Y7 N# p7 ?
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
# P; T: p$ R0 Q% z5 c        // 禁用同步输出和同步输入
# M4 y' Y' C2 g' ^        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);; z. p: [& V. K- |2 x* t
        // 配置 ECAP 2 为 CAPTURE 模式
) N* Y2 Y( h  V* P, M* x0 S8 n* _        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);& H) Q! q- s, y  O1 k7 j) Y5 _
7 u8 n+ y. |* O, T
        // 使能中断4 N* P! w$ i5 D9 o( z6 P
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
, P) c4 K; w/ V5 X) I}
9 c' l7 ~" |, G' a. V6 k! B( v1 z+ R
/****************************************************************************/
: c5 O( [# h# _: v, `/*                                                                          */
5 L3 [; {+ x. s, x/*              取得捕获结果                                                */
& k9 M0 L) v0 y  j4 g/*                                                                          */
; ?! U, H- R+ }3 e" m/ _( v/****************************************************************************/. u" }+ g( j5 f! C
unsigned int ECAPRead(void)
4 k+ H8 T/ F) e3 u{. d4 ?5 u0 I6 O& E8 j
        unsigned int capvalue;) \. \0 u% Z& S; j6 Y
        unsigned long frequency;
+ A* V7 ]7 h3 u% T: z* O; S( x7 M( }. y! n) w4 E9 ]
        // Event1 中断标志
6 M; j& \+ q. X7 c5 n5 z7 @        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
" F4 f' |. {( R2 r        {; T: N/ e# |$ f. m( @2 ]9 o
                // 取得捕获计数
8 n0 c# l9 W6 I% k: ?) u8 R$ \4 W                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
+ D7 B. a4 R% E7 C& K. u# q, L" Z- d$ J                capvalue = ECAPResult.cap1;8 D; R& C6 l  N
* J/ f3 h7 s; m7 c( }6 T) X; O
                // CAPTRUE 模块 228M 时钟主频
  r: D' u- M1 H: N% X# s) v' D                frequency  =  228000000/capvalue;
# p0 O1 R$ O2 d$ b- U* A, l                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);" a0 o) q: d' ?) f
8 r; d+ {8 Z+ r1 o5 O/ i# b
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
" T3 M  @/ F; c+ R0 `' x# a//                IntEventClear(SYS_INT_ECAP2);
9 y- p; I, f  C0 b        }
, q0 H% L/ d) g        return frequency;
& X! V3 K2 H! v3 V; M8 a: A}- N  l5 ^( C" V# c9 d4 H0 b  t

作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。5 b+ ^% k7 v4 r! f/ g7 o$ i+ m& y
[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