嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
2 Y- j: f8 R& f& h* ^
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
; \" N/ T$ R8 V: I/*                                                                          */
# U- Q# ?% F8 G" C/*              宏定义                                                      */
0 x! |$ @$ ?9 w  C/*                                                                          */
# ?& C7 U# j, {/****************************************************************************/$ |6 N1 w+ Q( r& X4 A
// 软件断点
0 u$ F7 T9 {" u9 q# ?. R$ X3 L% p: X#define SW_BREAKPOINT     asm(" SWBP 0 ");
& n/ c1 l2 a4 D, C! W$ T7 T5 V) N$ }: e" q' M. |' A, c$ V4 J+ ?! P$ v
// 时钟分频# s0 n! U& A! Z8 J
#define CLOCK_DIV_VAL     228
( D& i0 }+ \5 S4 e
3 w0 T0 G' b) ]$ @* ~/****************************************************************************/- A; d( F5 h% S8 L3 s+ M
/*                                                                          */
6 ~) w7 T! i  y4 c( G5 F; _+ ?/*              全局变量                                                    */1 @/ e" a: \; L2 J( j
/*                                                                          */* `7 Y0 R* X: G
/****************************************************************************/
1 u3 S2 _# G. g* t1 E* B0 i) @ECAPCONTEXT ECAPResult;! I4 f/ [: d4 J3 S

! ~' M) v8 U# ]& G! _/****************************************************************************/8 C. j+ j0 _1 Q
/*                                                                          */
: ^' ?: u  W" A/*              函数声明                                                    */
2 C# J8 ]4 R& B1 x8 d/*                                                                          */
' Q2 }1 b( N: u- A% }5 V" y/****************************************************************************/5 a) u' ?  Z: h- F( f; b
// 外设使能配置
& D, `' j6 P8 z/ Avoid PSCInit(void);/ L' b2 N1 t$ i' F; k$ j/ ]3 p7 G! g
% h& M6 P" D5 c! |. ~: Y
// GPIO 管脚复用配置
8 w" v% ^0 M* _9 F" @& svoid GPIOBankPinMuxSet();6 {/ `% A  S# q0 e
) q1 u! q# N6 ^( l& Z5 ]
// 产生波形
2 G! u( u& X# Y+ B  b% V; yvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);. M" F2 R! N# O
void ChopperWaveform(void);* J6 u3 `6 |2 K. r$ g. ~/ U
$ Y6 j) A& [6 D# C" [
// ECAP初始化和读函数
9 n4 N7 r$ c( u& k, Pvoid ECAPInit(void);5 a1 D8 D' [# O$ S/ q
unsigned int ECAPRead(void);7 ?* ]" }# q% [" A
' o5 s3 T2 I2 i& C- A
//ARM 中断初始化8 K- l7 k9 [3 S/ M1 H. B3 u& C  C
void InterruptInit(void);
# P% B5 {8 `1 t. f7 N8 E5 d1 N, {( J8 r- k7 d& [
// PWM 中断初始化- ?/ Z6 J, Z& Q$ ^# j
void PWMInterruptInit(void);
2 ?5 _) M! W# D4 [; M' O. J// 中断服务函数
% R" A$ i# p% ~' W9 i7 K5 [" `// PWM 事件- X; Z0 d0 d% v! ^2 F" A, K: u
void PWMEventIsr(void);
" P) y( x, ~9 q6 T7 L// PWM 错误控制事件5 h8 [% z* m. I0 r" x- |) }
void PWMTZIsr(void);
: a( a8 C7 Z2 T; g# e( p6 J5 |. @+ R5 o$ h  E* g; H3 {/ ?  k
/****************************************************************************/' P( b; p8 K# i" d# M6 d) ]- {9 B
/*                                                                          */  g. j3 M+ Y8 U: N, u8 S2 Z3 ?
/*              主函数                                                      *// r( C. n, a0 w$ m% F
/*                                                                          */
: d  S0 a. m% ~: j  q& w* h/****************************************************************************// |* Q, R: z9 R  \1 y
int main(void)* }' ]. }* v  y* X/ V0 y, ]
{" ]; B/ j! j  {" u" m- `' D. O
        // 外设使能配置
+ b$ ^5 l7 n. ^        PSCInit();. V" c( T' |$ ^. N
6 l  x; n. z. Y  _2 R& U1 L
        // 初始化串口终端 使用串口24 G) f% _8 `- [5 y' n( x
        UARTStdioInit();* z$ k) G3 J, J* r6 W9 f
        ( i$ j: v% n% I1 b
        // GPIO 管脚复用配置: u* M$ a5 ], c) x3 y
        GPIOBankPinMuxSet();
- ?% a# p0 Y4 X- i: U( K0 [% A0 Z( q
        // ARM 中断初始化/ r: t4 W- X7 x( K! o+ _
        InterruptInit();$ k. F- ^6 t5 _/ [  m, l  ~6 w
7 {7 P3 j' U+ E7 w) Z
        // PWM 中断初始化* R5 @/ n8 [" O# p# N$ N
        PWMInterruptInit();
* [) d6 c1 E7 s1 K. d7 ~. a( U  D9 k, ^* X4 p2 p: E
        unsigned char i;0 `* ~3 w2 }! l7 j% P
        unsigned int j;0 {. G/ o8 y3 R, q9 s& \. m

+ q0 E9 W& L" l6 v" @3 J6 c        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);0 @2 |: S3 c% ^6 h9 e" \
        UARTPuts("------------------------------------------------------------\r\n", -1);( S' `& O2 g$ J1 B* \5 U" k1 p) u
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);( T5 x3 q4 T( R+ T) Q
        // 产生波形
" v( p/ _5 R" S( U- _, K        PWM1ABasic(25000,50);
" N: Q$ d" ]- ?6 n7 y3 [9 Z) q+ T+ F7 W: ^; m
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
/ Y/ D3 \! E% V$ R        UARTPuts("------------------------------------------------------------\r\n", -1);6 g5 D1 C1 O+ E4 d8 E) Y
5 D) z( s. E3 y& R) h
9 Q; i- Y; ?" q  H3 f
6 ~& D& U' x& N6 e2 L
        UARTPuts("------------------------------------------------------------\r\n", -1);
, Q4 Z5 H  @* ^8 }5 w        UARTPuts("                    C6748 ECAP Test\r\n", -1);
0 a( _# w9 [+ ]9 q- z6 a& k1 o        // ECAP 捕获初始化- Q% a! k- `! h, n
        ECAPInit();' G) V, g  g" d( Z* B
        UARTPuts("Initialize ECAP.......\r\n",-1);
( M1 w; c# k* f( s5 ?        for(i=0;i<5;i++)7 D9 |5 u3 l" ?& r% ]; g
        {
0 l% r4 r7 x0 R                    for(j=0x00FFFFFF;j>0;j--);            // 延时& k* x2 L9 `: [! q
                    ECAPRead();5 x# Z# J& j' d2 G) N* e+ O
        }
# n' S; b" y/ h0 V1 t, l; _        UARTPuts("\r\n",-1);$ @# J1 I* N  q' O% s
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);0 N5 V1 D. u0 X  U5 G  Z# z3 _( N
        UARTPuts("------------------------------------------------------------\r\n", -1);1 R/ q+ r7 O. f, v9 U
) u: n& s7 Z" F5 d
        // 主循环
% w- {$ D! l. @' |8 b4 Q        for(;;)
+ {3 i& m: y# Z        {
( U6 k' j, @1 Q
+ Y( C& |7 G" ~' [- Y/ n5 ^        }# g; S$ i" Z! h  g5 `+ r( s
}
: A; g  ~& g2 k( e9 t, s- o$ q" v
) S3 X! U" t; o; Z$ r! f2 F6 B/****************************************************************************/
, G3 \3 J' H( t: T4 Z% F  r: u+ ^6 U/*                                                                          */7 e. u# D) C8 U! C! H/ {
/*              PSC 初始化                                                  */8 d) g/ ]4 E2 i
/*                                                                          */) Q8 w$ H1 o4 U9 ?  I
/****************************************************************************/
7 g  I( \  F2 {6 f- n' Yvoid PSCInit(void)
5 j# [$ K7 M! {. W# Y{
7 O& _! q# ?$ ^; s        // 使能  EHRPWM 和 ECAP 模块* T8 F) Q4 l) A- f6 {& @" O
        // 对相应外设模块的使能也可以在 BootLoader 中完成
; a5 e7 i* t2 i$ Z" j    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
& q& e; m# [+ F8 ^    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
1 M' Q2 Z; x: {}# {( i, f& O/ u+ `5 K

; L& s" G6 S5 ?5 \/****************************************************************************/
0 D0 Y+ m/ s4 p) r/*                                                                          */
: |; \& E( e% r! L4 q9 j/*              GPIO 管脚复用配置                                           */
5 R& b3 i) m6 W/*                                                                          */, J! M. I/ I: o; A; y  l6 A$ Y
/****************************************************************************/
  c2 a1 v0 ?( y$ ~void GPIOBankPinMuxSet(void)) N1 V, G" h4 W
{7 u% T2 z" M/ L7 ~+ ?
        EHRPWM1PinMuxSetup();# _5 _! j2 B4 w) S8 ?0 p, o# d
9 |: o2 ?, T1 ?* J: L
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)/ Q6 h3 X2 Z$ U2 L
        // 作为捕获功能时管脚方向为输入
! Z$ f2 f* l3 g        // 作为辅助脉宽调制时管脚方向为输出6 x+ A) U' Q2 `; d5 Q; o! J0 x- T" f
    // ECAP2 / APWM2
; i  F  f" O2 K9 f6 I- w        ECAPPinMuxSetup(2);
. Q5 C3 s+ e# N. R6 v0 x: w% b3 [: M( r0 e0 p8 E5 \+ Q
        // ECAP2 / APWM2方向设置为输入
8 b) w3 S* t: ~4 S1 v& T        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
6 W. n& u+ ?# j: X: J; y, z}. w: a% d/ B5 u( G

. R: M% y$ }* E- c' o/****************************************************************************/1 [* o5 J4 {/ y1 O4 F
/*                                                                          */1 x" b" O1 w$ t% P1 U$ f# _
/*              PWM 输出波形                                                */
2 b5 e3 D- R- F1 a/ Z) x/*                                                                          */
; v; v' k/ k) g* Q/****************************************************************************/9 ]; j  g! o+ \5 t; ]* I; P
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)4 M4 R* M2 t4 Y' V
{
# m$ s7 I8 F/ p' ?% y    // 时间基准配置
+ h; `: \" E! J6 K# W  e3 K4 \5 _    // 时钟配置( e$ X3 W3 A; l* G$ j
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
& Y, Q; s. R& M1 j( `, C/ J& o& g3 R! h8 y( C5 v8 `
    // 配置周期
( V4 `) i* Y( E, S( R    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,' y1 b) [3 J: `& c% m0 X6 S' `
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
- z: ]% }* [3 J2 b: z) p: e/ e. \( V& }3 \) O2 G/ ^$ Y
    // 禁用输入同步信号
% z! e' ^) R! o9 A7 h0 K% F    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);. z/ o1 W4 K4 i( s9 r. K0 ?
  \9 s2 ~! j' c/ A+ T
    // 禁用输出同步信号7 f" b# z* A2 _' S1 y: z: B# U" a
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);! X$ `  V) v/ D* Z# @& L

; l3 u) |$ H  i# f    // 仿真(DEBUG)模式行为配置6 c3 n! x* z9 v
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
4 V. K$ ?, {/ N' v
7 [9 X2 N1 N% c" K  T/ J* X& O    // 配置计数比较器子模块+ o; G$ }# D- b7 C" j$ }
    // 加载比较器 A 值' `( ~( r+ e* m& E
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,8 ^9 z5 t. r: z
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
, V$ a& ]7 c. y% E' p, Q# |6 G! w  r
    // 加载比较器 B 值
% Y# D8 |. N0 W3 p$ u" C    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,, _+ e9 r& M% w8 }2 H3 q
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);: W) k" K# S, P  y8 C" s" S8 g

# C/ p  y' p! G- R' R4 d7 o, n1 P    // 功能限定配置(输出引脚触发方式设定)
  Y( g) R) `, A; l4 z    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出, u# r, a  w6 F- `
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
! t* x( F0 t" Q) f6 P& E  o                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,* G" |. z) `$ A) `! r4 |( Q
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
3 b& @0 y3 [2 w: E- [3 z, k
  i* z, v3 G% m  b# e8 ~    // 禁用(旁路,信号直接输出到斩波子模块)死区模块9 @9 X+ ^+ W0 B/ S- R( J
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);) B5 Z' @4 V* N& o; {, m

* S7 k2 `' b+ _3 s6 h    // 禁用斩波子模块
: l+ b8 ^! q% O    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
- s. w4 U  H7 D# m
* I$ j8 J6 o4 _! E    // 禁用错误控制事件9 A1 e, x- B! j; v8 h) _
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);$ t& h7 s+ W9 Y3 O
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);- V1 r2 o5 ?0 ?4 E; n9 g& W4 S
; j& y( F  I7 t+ T
    // 事件触发配置9 x  E2 A/ B, I' A
    // 每三次事件发生产生中断
3 C% M/ f1 D% A  K% q8 y! ^6 y+ Q) q    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
9 v( Z* S5 B4 l# K    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
6 V; D4 O) O/ O" i4 B3 |    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);$ C+ t& x/ Q# y8 z$ V
    // 使能中断8 C0 A4 D* P0 a9 v; F
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
+ N8 }# z0 D$ m2 u4 s
7 m8 Q: }. n$ b3 D8 Y) ]; l( I    // 禁用高精度子模块" i2 [% v2 y" w. I
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
! z  m( P( g; h( r: c5 q. j! c: D- |1 R1 X  m5 h
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);/ `  K' P, g7 G4 f6 Q: \# B
}* F1 ?6 N% E& m/ B
( z* d- V; S' X# a/ {5 s& @
void ChopperWaveform(void)) x4 e% k! L2 _3 ~0 h
{! f1 O; U7 H8 u4 i$ T& z
    // 50% 占空比
7 v8 r) G# S' J2 @1 }    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);0 t" O" }: t/ Q7 z
    // 4 分频/ g! t: t5 z% D* x/ e; o
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);* _9 e( Z  G( s  p3 f& R. V# y3 z
    // 单个脉冲宽度' x; o9 p  V0 e8 w0 a) u: [
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);  @4 \( ^! Y: B8 x3 |8 }
    // 使能斩波子模块
) Q+ J+ Y5 o1 K# r  ], @& p6 s    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);( y6 D% L2 Z- o7 f9 ?. c% f' F( p
}2 U- x' F8 A! Q* s2 l/ V) ~

- k* u" r+ w/ x3 f/****************************************************************************/- i2 a5 S6 {) `" f! k7 J% \
/*                                                                          */
5 v- C2 g" s* z7 B/*              PWM 中断初始化                                              */
; u6 v8 f1 H5 G$ t5 y& l" |+ w2 X/ h/*                                                                          *// y: {& X; f* ~' v- t4 E
/****************************************************************************/
8 y7 `1 z. `& Evoid PWMInterruptInit(void). j+ F! ]! C$ y, U. {
{
. s4 X& ]! L; `4 o; h! m" v        // 注册中断服务函数
( n, b5 N0 p" G! a5 e        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
, j" w2 E: M5 L* K* H- p  D' _        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);+ ^  n' x" Z" J8 D7 r* r
( s1 r  F. o; Q+ R5 V3 c0 m
        // 映射中断
: p+ n4 O. a2 w        IntChannelSet(SYS_INT_EHRPWM1, 2);! A$ p! ]7 u  e9 T  Q% n  _- F
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);3 S: H; j  H! h7 G8 N# _
* H, b: e$ p% B- P' A  X. Q- u2 v' r% j
        // 使能中断( c8 l4 b, k! X* i% p
        IntSystemEnable(SYS_INT_EHRPWM1);. |; t& \) f2 w+ J" _9 t  X$ S
        IntSystemEnable(SYS_INT_EHRPWM1TZ);7 ]6 x( j( X; [3 F1 I4 M$ h% m
}
" E0 o% a" t5 {7 g- @( |
: W4 `: L' F" w/****************************************************************************/
& u; Z) M) g, H: h9 ?& A/*                                                                          */: |& Q& ^+ `$ G, ^! N
/*              ARM 中断初始化                                              */
( U$ g, Y# @7 a( G/*                                                                          */1 j9 W0 G1 A7 ?" ?0 H
/****************************************************************************/
; e! e9 R! p+ wvoid InterruptInit(void)
8 _2 o1 C; t: m! J, P: D0 I{
# a, D. w( Z* Q& Z: |        // 初始化 ARM 中断控制器
/ k+ J- w, ^7 H2 [7 q4 m        IntAINTCInit();
" e3 F- h- Y! b; P. `2 F
  E. j6 [, x3 B: y/ `" x2 w        // 使能 IRQ(CPSR)4 @* g* @; _/ u% D$ L
        IntMasterIRQEnable();5 q, J& p- q; R& Z6 k/ x( Y; N

- d; ]+ |! `" |6 {% y4 U/ `        // 使能中断(AINTC GER)  d* F' y* {5 u/ j5 X
        IntGlobalEnable();# u) z8 ^+ w/ J% m# a# c

$ z/ L- ~$ A" }# }        // 使能中断(AINTC HIER)) X3 G7 m  e! r0 T+ P' ?) _7 q
        IntIRQEnable();: h) Y. @. R1 N. \3 ~/ A+ D) N" n
}. N4 L$ o) @) D

9 b/ l4 l% s2 r: T: f
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/
7 y5 `9 t- |5 H6 M3 e/*                                                                          */
; r$ N6 E8 [7 _6 {0 v$ `7 d  h: u/*              中断服务函数                                                */4 |8 G+ b- z, F8 a/ a+ W! T
/*                                                                          */
3 h4 Q" v, h! i* @$ v/****************************************************************************/
0 T7 j, T/ }' f6 Ivoid PWMEventIsr(void)0 s2 f( d1 [6 S7 h8 f0 B) r/ F; `  k
{
7 g+ T! `. B. Y3 Z* ~        IntSystemStatusClear(SYS_INT_EHRPWM1);
* B* g2 d1 s+ @" `/ v) V2 g: ]
1 w  s- I  C- ~& z0 D2 l    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);- F; O( Y8 d& ]+ W. _( }
}
  G8 x2 e/ B. s5 X4 d8 y0 y
, n+ f( n8 C* A, Q1 u, jvoid PWMTZIsr(void)
" ^; f) W% M' l7 M. v{
, }, h3 V. K' j2 u% k" c0 x8 @7 b3 l        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
2 G9 c: Q1 Y8 [: n9 B7 W, @4 Y1 [# n# x/ W
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);: X* u# M+ R  H; F+ ?, @! a1 x
}
$ b0 X: O( f- [5 e% R  ^) R
7 Q4 l$ N1 ?( G1 Z- a1 ~. b) Y/****************************************************************************/% j8 _9 o- A4 Q) P* b- ^
/*                                                                          */" O# \- c& U3 L
/*              初始化捕获模块                                              */
, U* o6 w, i+ _3 F7 p& |/*                                                                          */
* ^& T1 k0 w. Z/****************************************************************************/4 Y, [3 |2 J' ~1 U6 B- F7 |
void ECAPInit(void); p. w. _  o4 ^& x5 ]2 O
{% D9 f: R8 |0 }  ^4 {) D7 Z
        /*-----设置 ECCTL1-----*/
, k% E0 ^4 p8 b3 l        // 使能CAP寄存器装载0 R7 s  X. ^# w0 y
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
! p+ J  O# T2 z! ~& w. o" @        // 设置预分频值.; ?5 N# X# M$ a2 \0 s
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
* E( u* K/ c/ G7 F9 L$ |% n8 s% @        // 上升沿触发捕获事件; L2 s! ^4 ^' ~% u
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);" `" f+ I7 i; ?* k6 G( m1 Q7 z  g
        // 输入捕获后重新装载计数器值.! J) }# b3 F- {
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
5 s0 s3 x# p1 v% d# a
; b4 a. ^5 {" J# g: i5 u+ o7 j        /*-----设置 ECCTL2-----*/  @. Y% N. O3 G7 F
        // 连续模式9 n: m# P+ i+ g* x" i; v( `1 ?
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);% X2 A$ Y, O) g- l) ]+ B/ w
        // ECAP计数器TSCTR持续计数
8 H  W4 K( ~9 z        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);) p% j8 S  |" r" w
        // 禁用同步输出和同步输入
  @2 x0 ?" y  Y        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
7 d6 l+ O) Y+ B        // 配置 ECAP 2 为 CAPTURE 模式  D% \( J. c+ s, K" |* ]
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
' `0 M  O7 ^3 [* g, L  H2 b0 z3 L: a0 M5 O# O& k5 M" t
        // 使能中断! C2 x) h( D) ^* l' |& @
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
+ r$ q# {) L1 r4 _5 X}$ k8 z" d5 F# ?9 S+ `5 R

2 W& a$ y% }9 |6 n% T$ H/****************************************************************************/
, S. m* P0 @/ p2 H) \* a7 l+ x/*                                                                          */" A1 f% m9 F2 f( M+ l0 ~
/*              取得捕获结果                                                */
3 c. F6 m  J7 B2 h4 W' j! S/*                                                                          */" X# \; x% ]) k# `' C' _2 k0 j
/****************************************************************************/
/ [* e8 I% T- Q7 {( wunsigned int ECAPRead(void)
$ c, h7 d5 ]3 i) \5 R{. I; ~2 y6 `4 k" [8 Z% y3 {! `
        unsigned int capvalue;6 n) n5 d( A, N
        unsigned long frequency;$ i& |! a# Y5 `! p, f' J5 Y
9 [0 A5 Z3 w# i+ K/ B' N  ]# a
        // Event1 中断标志
2 w' c& |! ?( W/ l! t5 L' J        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
3 H, C9 A, G3 ~7 X        {
9 F& h! |+ E  c$ c                // 取得捕获计数) V, z1 d9 w. B/ f" m) r) M3 B
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);; W7 `& o7 m  m% \% v3 l
                capvalue = ECAPResult.cap1;0 f1 X1 n3 M- d5 r6 ?5 j
* x- {4 U8 e+ Z8 z, U' [7 x$ r6 q
                // CAPTRUE 模块 228M 时钟主频
' j: |) g4 c" |7 h7 N& C                frequency  =  228000000/capvalue;
, r$ w$ V, A( g+ q3 @0 ]" l                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);2 m1 j6 L, G( I3 |5 ]9 ^7 f

( ?  ?- E$ [  q' @) z* |                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
4 x" H; O0 y  p" s) ^5 v//                IntEventClear(SYS_INT_ECAP2);
1 t4 m$ p; c% P( g/ N: k) l1 [        }5 K1 D1 v1 F, c0 z) E$ b
        return frequency;
& }- W2 l( ^/ H9 ^: Y}% p$ K. X0 F2 X9 r/ P

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