嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
% P; @+ z  Q, L, q" d
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/- d. h1 g( I" b. |2 x( A
/*                                                                          */2 N3 p5 V1 c3 i0 W+ P- T
/*              宏定义                                                      */
2 |3 C$ d' ]9 q$ n, i% s8 n/*                                                                          */
9 u! z/ ]3 O* {/****************************************************************************/
5 l, m/ _& N- P: U// 软件断点
- w  m; x% ]$ ^1 r9 _# [3 B#define SW_BREAKPOINT     asm(" SWBP 0 ");
6 p" v8 I2 N5 Y; j  C1 g: N( e, U
: {; M8 M9 h6 q! K// 时钟分频
4 q. o/ A1 ]- q, E" D#define CLOCK_DIV_VAL     2280 X+ W( o8 ]: T- P& a" }# r8 b

. ~, ]0 v/ z! _: e6 |4 U/****************************************************************************/: p! ~# R; @4 v- r, i
/*                                                                          */+ e9 p3 \* v$ a' c! x5 M6 E
/*              全局变量                                                    */: |; k! ]  O) \$ L4 Y
/*                                                                          */
# I3 h  w9 \' C7 J. _! P  Q. i7 U/****************************************************************************/; Z7 R5 M/ V4 c2 ?" h5 F
ECAPCONTEXT ECAPResult;
0 Y" T8 |+ O: n' F0 H% g6 z; M( d6 U% O& M
/****************************************************************************/$ i; ^* P4 r9 {! k
/*                                                                          */
, g3 c% c- F% s; Z  s  G/*              函数声明                                                    */
+ j+ }; h1 t' z! G. y. J/ J/*                                                                          */
# ?' e, d5 H8 T) o, s& X/****************************************************************************/
- {4 D) u; \: t% s// 外设使能配置
( m8 [5 \* L  _$ _' ~) W; n6 ^void PSCInit(void);" _$ i3 i7 E7 M7 g9 _9 k0 J

$ Y4 k7 q$ a! O2 o; R9 ]/ Q9 _// GPIO 管脚复用配置
, m! q5 A+ ]5 s, t/ }5 A; evoid GPIOBankPinMuxSet();
% T3 H$ b. L" l, _: m, r) ^; M) `' L- E: y( y9 p
// 产生波形
# S7 j8 r, q( B5 b  s4 |* Vvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);7 t# f# Q4 N( y: @
void ChopperWaveform(void);
  r1 c- A+ d- F3 {- E& Z9 |- N% @- r, c4 |* y4 w$ y, }3 x
// ECAP初始化和读函数2 Y$ b* W" g+ g, Y+ I, G: m
void ECAPInit(void);( V( o* \  L0 V0 h/ R
unsigned int ECAPRead(void);* |& s# c5 s* D

7 `2 [! X5 [8 }, T//ARM 中断初始化
& ^$ i# ?- T' i4 h- [! evoid InterruptInit(void);+ L7 a0 e! [! p

4 R' ~5 e' \8 p9 z// PWM 中断初始化( v7 C+ r) H1 H% u+ h7 i) T3 [
void PWMInterruptInit(void);
+ U" Z, O5 P- m: D, e. {// 中断服务函数8 n* I) `- w: l1 z0 q2 h$ W- C, m
// PWM 事件2 o# X1 m6 w+ T+ h8 S) o
void PWMEventIsr(void);6 e7 n4 w5 G/ {8 _7 l2 g3 N! D
// PWM 错误控制事件
+ N" y+ |- ~$ X5 s/ Bvoid PWMTZIsr(void);) N7 s& \& l1 b* u. b
. k$ M- e& t% f
/****************************************************************************/
( @1 z) A$ n' ]0 H/*                                                                          */* v( a0 s1 h% G. S- B
/*              主函数                                                      */
- R1 Q8 z- E  P+ ^3 @/*                                                                          */5 r/ q& P1 N) B# u
/****************************************************************************/5 f0 k" ?5 E( F7 B" `
int main(void)8 Y  j0 ?* K% a2 p/ {$ S
{
) J# ]9 r6 I/ y9 n6 r. w9 ]* ~/ |        // 外设使能配置
6 [+ E+ y# a' z        PSCInit();
, }% u, M" Z5 Q0 n7 n5 g& E( D& E% B+ L5 v+ |2 G" r4 T8 H
        // 初始化串口终端 使用串口2: p) I% [" a' l) E/ G) U
        UARTStdioInit();- z- o' R% M0 R# z, H3 t8 s# r- o
       
( }  I: p1 }6 J        // GPIO 管脚复用配置
1 S7 e  ^, s' }. T6 I        GPIOBankPinMuxSet();7 x( y9 U( M7 [3 d# \0 W  n
. M3 G! t5 H# u  [( i2 o2 N* C
        // ARM 中断初始化- ^7 v. J2 O/ C! y/ c. s
        InterruptInit();
8 B+ g6 S8 Y9 I" e) H; I& \- Q
5 q% z% J. v) P8 d        // PWM 中断初始化
  |7 C* h6 }  n/ w        PWMInterruptInit();
% m. O$ D; }' V9 w* G$ b% N4 G$ ~) V1 M, X3 ]# Z( Y' m1 f
        unsigned char i;
. A0 G% P7 M  Z' [        unsigned int j;
$ o1 S( O6 l* A0 j2 ~- H
% ?2 @6 N7 m7 D9 D5 q        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);5 n& @3 ^1 c% C5 e6 G
        UARTPuts("------------------------------------------------------------\r\n", -1);' V5 t  M' k# b) z* K( b. ^
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);, [0 D$ t. L/ E. d* N5 W
        // 产生波形3 x4 z5 E: Z- x  ^
        PWM1ABasic(25000,50);1 d9 S/ ]  R" Y! s8 T8 r2 V
3 I# P0 R; t2 I; E9 ?& V! P; g6 q& ]
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);9 ^0 n/ f8 A$ q: h( w( u8 }
        UARTPuts("------------------------------------------------------------\r\n", -1);
/ `$ f2 W; a, t/ t3 ?
6 m9 S0 W; U+ [* E7 e. F; W% t2 t. _0 s- j* J' j( _
6 V1 a6 }/ K; h$ Z3 |
        UARTPuts("------------------------------------------------------------\r\n", -1);$ t* {3 y& C3 G
        UARTPuts("                    C6748 ECAP Test\r\n", -1);4 b* k) N3 l, ?, _' Z
        // ECAP 捕获初始化0 K5 l  R, F( s& e% F
        ECAPInit();8 V8 k' m0 E. A6 H
        UARTPuts("Initialize ECAP.......\r\n",-1);
+ }2 D1 M/ B( R; c+ b        for(i=0;i<5;i++)5 {) V8 `' U) P: u$ Z% `3 ^! k
        {6 f6 H  t' D, ]6 J: i* b
                    for(j=0x00FFFFFF;j>0;j--);            // 延时4 E, A. y2 a3 ]2 P+ h  ~& W: `( T6 D
                    ECAPRead();) S3 }6 N7 z. P; r5 ~% x( t
        }
# H) n$ p( ^9 Y" J: a        UARTPuts("\r\n",-1);
% P* e$ _3 U% j- K( J" z        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);; }; d9 v9 }% d
        UARTPuts("------------------------------------------------------------\r\n", -1);
7 g$ E! `0 g- Y/ _( V8 }9 I/ p0 U: S: w7 T' C
        // 主循环
. s/ ~: o2 R- {8 k) G        for(;;)* ^6 j, Z7 T  Z
        {
" B! v1 f+ m/ d/ s0 L' ]. d% M% n7 [1 e
        }
6 M# b) `, o% U6 ~. E* c/ }}# M6 n0 q3 \# q  C

5 x8 A" F; ]# R0 k. @4 e' T/****************************************************************************/
, [# T9 r2 J" B8 [, u7 `0 Q, O" ]/*                                                                          */
+ N6 S) m! N2 a+ S' N0 V/*              PSC 初始化                                                  */' \! [7 Y7 [! m) b
/*                                                                          */8 T) R5 Q! d8 S
/****************************************************************************/
0 a2 t& \: c$ |( G; p& ivoid PSCInit(void)6 ?( J4 q, ~& f3 }" k
{1 }" i- F+ n6 d2 }1 J' J8 f
        // 使能  EHRPWM 和 ECAP 模块
0 u* a1 e- [, O3 y* t% ^        // 对相应外设模块的使能也可以在 BootLoader 中完成8 M1 H6 Y4 Y" P- B  k6 H7 M
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);+ S. x9 q0 i# e+ X: |% Z  F
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
; q# {. p* q1 _" R+ `}  t3 _; w- a) q* Y' l
' S. P, N/ [) y7 ~2 T
/****************************************************************************/2 L, m4 t7 O/ ?
/*                                                                          */
' {+ u! u0 X. d9 b+ ^/*              GPIO 管脚复用配置                                           *// L, `4 J: g4 ^- E7 A
/*                                                                          */: o8 X& @9 x" k7 p
/****************************************************************************/2 C& v' z- u* I( W: _$ P
void GPIOBankPinMuxSet(void)
* G  l5 B: p, L9 v, L2 C) S" |{
# `4 L$ }, |7 F5 ?# W; r        EHRPWM1PinMuxSetup();5 J4 F9 J; F) ]2 C. p+ i
/ d9 U& m( V7 n% T8 T
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
& ?0 W  u5 K' h( w( F        // 作为捕获功能时管脚方向为输入
" _: ^$ s) w/ a5 ~        // 作为辅助脉宽调制时管脚方向为输出9 s- x2 b8 v! r
    // ECAP2 / APWM2
4 \3 L& e7 m( A* c: z. f        ECAPPinMuxSetup(2);
3 f1 P9 q# ^) F  t+ f, b! M7 E# H1 g& b' p: C# i
        // ECAP2 / APWM2方向设置为输入
) x; h4 k5 {9 P# e- M, |4 G$ P        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]- {( m6 i4 p* O$ x+ Z/ j9 N  x
}
7 d/ s6 Z: ?4 L! O6 t  m. `( o' h* @
7 U  x/ ^3 H% ?, J0 R% _/****************************************************************************/  O* m( h5 E& l9 K
/*                                                                          */# ~) g# T3 s: L1 a' [
/*              PWM 输出波形                                                */; I8 d/ J% ?: R; a. n
/*                                                                          */4 ?. R3 d7 u" w1 J& E; b, c
/****************************************************************************/
2 W  j; s# L' E1 w, O3 cvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
6 T" w! [) H8 |% h" G$ L: B% G: a{
7 }- A8 H) T6 |# U    // 时间基准配置
) W' _4 z  O' M" J    // 时钟配置
: s8 T: X  u( W/ q3 j    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);, c: r5 F. E, g9 v: b$ S, u0 [- |
" B/ F4 g$ d9 v" b9 p9 p. a3 |. P
    // 配置周期
, E2 ^- }/ H* V9 q    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL," f: s  F7 B, o1 y+ {5 K# s
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);" s- I; f$ v4 \
4 F' {& E4 N. D! U' y) P
    // 禁用输入同步信号
9 C! D4 |% ?' M+ ~) x    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
1 I2 C1 o  M1 \+ u; ~( T! {; W. U) E
! t: T$ u- V* B" U1 h+ T& W8 j    // 禁用输出同步信号
0 _1 \6 e& G& e$ G  l) |    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
$ f) c6 D) S+ B' Q' r* G. p4 ^2 ~
7 f6 H% d& N- v- Q) P1 ^7 M- ]    // 仿真(DEBUG)模式行为配置
! {+ o+ {9 j& @2 I, q! \  U, ~    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);) H, P  ~3 W% e+ c$ }

$ p" _* I2 Y; J6 K5 {1 s2 P    // 配置计数比较器子模块
% J! t6 O9 A# H3 f5 K, y: ]( H7 {    // 加载比较器 A 值
! S: F3 K8 f# U% u$ l  g    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
+ p% U( X& F  E                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
3 Z9 ]2 s  o) K5 d% o
: |! u* [% H3 f: t) o6 ^    // 加载比较器 B 值8 c1 ~! `3 d8 ~
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
4 j) A) l& [  R                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);$ Q( v6 s+ e8 ?4 G8 y+ ~& A  o/ N2 A
$ A3 T9 H# a: K  A
    // 功能限定配置(输出引脚触发方式设定)
& }3 }* ?  D- v/ r0 U    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出8 |0 x2 Z7 o; g9 l
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,; |; W" H2 J  l
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
! j$ Z  T/ ^9 E$ N9 ]                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
" [- \2 b. i  k9 d9 u& E5 N+ Q  q) O
: d& L7 ^! `7 N% y! Z    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
. L  X% a6 o! t7 t( v' c' N    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
; ]* q# t5 t. L/ r2 f
" B; l3 y: s8 ]2 ?* C2 C: l    // 禁用斩波子模块2 F. T& H% q8 u
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
/ n" _) }: ~, l8 x
5 H5 c1 h  T0 P  V* e    // 禁用错误控制事件# D) i$ ~4 j0 n& X0 i# O; X0 a
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);' {' h& n9 e3 s' W8 h
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
! S, z1 i- t& l9 Q& P  q& C8 K, M9 E5 ]8 x
    // 事件触发配置
! A. G5 [; {  z# n! O: x: `) B    // 每三次事件发生产生中断
6 C( m9 f4 y* X6 P) Q( Q% I    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
6 K1 f3 z! J' ?) e# g; U7 s/ {8 }# U% ?    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
) K$ ~2 q; Y! K0 `( O, O    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);. g, r- C% w" K2 h& Q
    // 使能中断
- B9 {' a* o0 ]- R3 h    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);+ s5 x  _& p1 t/ k7 Q9 {

' @' I$ K) z: M5 e" U$ R3 }! ~    // 禁用高精度子模块/ d. J2 v& P& o' x
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);! v5 B, b, L$ K2 T
9 `2 d+ Y8 _) g1 g; d4 q
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);6 f! V4 T4 Q: z! @( a& t! Z& f
}
4 {; @% o0 q0 \. q6 p
: q% w( K' _4 q+ Y0 H+ Vvoid ChopperWaveform(void)3 ^) P" f2 D. j# Q: z0 b! G
{
& e1 g4 {; k' l    // 50% 占空比
: D8 T& A' F8 S    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);' ?2 O. t+ f5 H8 k. O
    // 4 分频: ?- X8 T3 w6 I" Q: c
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);) x" ?% y# X! p+ u: M% p
    // 单个脉冲宽度0 S* [  d3 A1 l  K/ E4 o+ p
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);* z" s' O6 X8 b+ |. Z7 s' l# w) w
    // 使能斩波子模块  `( s# U! B1 j
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);5 P' t2 X7 T# |7 r- V9 U8 q- `
}
7 `" F  L( X+ q( H# r2 ]- r( Y3 N. {+ |9 C' B
/****************************************************************************/- O0 a* r4 |0 h# y
/*                                                                          */) \! R- b( D. T( _8 z+ \+ T- ]
/*              PWM 中断初始化                                              */% R" j7 N" U0 R
/*                                                                          */
+ s% Z! g! B, z+ V+ y7 M5 d$ I/****************************************************************************/" f% M; M  c5 |& T; ?
void PWMInterruptInit(void)5 k0 H6 S; J& w4 f8 S. h1 ?9 u
{* R/ j9 z1 B$ S3 \( m+ f
        // 注册中断服务函数
' C& L; H  d: r4 H$ R4 M        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
5 L1 b+ [) U! Z5 {        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
: L+ K! s! S% J8 [$ [4 M
1 r: w7 U9 A/ j% x        // 映射中断/ D0 ]( V9 a  h1 n
        IntChannelSet(SYS_INT_EHRPWM1, 2);
9 d; I, }0 @! R# v& u2 [        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
6 k4 C! ^' v: N5 C$ h6 o" c
0 k5 q& A( N6 ?2 ?1 x/ I        // 使能中断, H4 P6 s8 Q! [0 t4 `
        IntSystemEnable(SYS_INT_EHRPWM1);
  {: f2 E: \6 p  h        IntSystemEnable(SYS_INT_EHRPWM1TZ);! Z# [# T( |( W9 }# r. ]
}4 h0 D7 ~% W$ B% ~8 d* o3 Q

# q- A' l6 \9 ~& a% H/****************************************************************************/& J2 k) H% e; B
/*                                                                          */' [% G9 }' x7 [
/*              ARM 中断初始化                                              */
5 o. [& w: {" i, T/*                                                                          */
$ z' N8 u3 L6 C! C0 \  O/****************************************************************************/
- @- }, C9 ?0 W8 {$ @void InterruptInit(void)0 ?$ @. v0 @2 c( E* b" q( v
{
( b- L5 V4 @% j" ^" G% L: }        // 初始化 ARM 中断控制器
+ d# l/ s9 s0 P0 Z        IntAINTCInit();
4 l- n4 V4 h! b+ L% i7 c' t8 M8 }; r  K( ?9 y- [1 U$ E
        // 使能 IRQ(CPSR)1 J  M, e3 k& ^- M% i9 s+ w& a
        IntMasterIRQEnable();8 a5 M3 C8 X( j7 X4 p/ t  b* ~
  ^4 d/ a4 G. E4 K
        // 使能中断(AINTC GER)
) j# |' i: w3 q! R" b        IntGlobalEnable();
/ g3 n9 g8 i6 _  n6 p7 a/ o
& d$ ]  v# o; U' C2 |$ P        // 使能中断(AINTC HIER)$ O. h4 K: E- p$ A% ~3 j9 ]6 K1 D, S
        IntIRQEnable();
; w/ B. G5 e7 F  H, Q}
: N5 W2 D  V; ~5 E2 x7 j  X2 j
3 w" U  G! s/ T; K/ P& @& K  J8 |
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/: M7 P. a& ]% Y/ k* L6 P7 N9 y( N
/*                                                                          */% O4 I# i# y1 S; @
/*              中断服务函数                                                */
2 o8 t5 j" o: r0 `* p8 v/*                                                                          */) X0 k) f+ y, U# a6 D8 X2 D
/****************************************************************************/% c' m8 b7 L/ N) t
void PWMEventIsr(void)
/ j# L7 A' q* |) \! i{
/ _: }: t) T, p0 v5 I# f" J        IntSystemStatusClear(SYS_INT_EHRPWM1);
( b8 n& h; P0 |( q: D9 G' I% p; [# j1 @$ R
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
, o# J$ k$ s" S0 x; f0 a4 i5 u}
1 E+ g9 I9 j3 H: Q( Y# H
. v8 y9 W6 m$ I: Kvoid PWMTZIsr(void)/ g, v6 L0 a  j9 R
{$ O! k5 \, w: v9 a* |. K( X5 u
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
1 z0 K# e3 Z  g: T. E7 L6 R% A! C' F- \' O
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);+ r% r( a3 T; h& L+ W, f: W
}
: x' W/ r) ~1 s6 I& ?; H% A+ y0 O6 G7 e/ [, N
/****************************************************************************/' z+ t( B) ]7 z2 d; o
/*                                                                          */
" x; {8 ~) ^7 f9 S8 R, k5 o/*              初始化捕获模块                                              */; A# j" X( t# \3 R3 E& h5 a% G1 Y
/*                                                                          */
! u0 W1 S4 H8 [( [9 H' h/****************************************************************************/5 i1 `6 O! ?1 H
void ECAPInit(void)1 c/ L1 I% K/ b
{
" V) h& x5 C3 q, p+ Y" \        /*-----设置 ECCTL1-----*/
, h/ O# A* v9 |: W& \3 Z        // 使能CAP寄存器装载
( m, y9 F9 s9 {1 X* x+ K        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);- m- e* @; N: o$ R# {9 }3 V! i: V4 B) W
        // 设置预分频值.0 D4 T  L! a% W  N4 \
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);/ d) O  ]. @) ]" v
        // 上升沿触发捕获事件
3 F0 g7 x4 O2 g        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);3 [6 D/ W6 `3 I; s; Q5 Y
        // 输入捕获后重新装载计数器值.% J  ]. |: L! G4 M. ?# n8 G/ W
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
+ K$ o- q7 ^/ I% J
0 N0 l4 q2 K0 v( B: q5 d        /*-----设置 ECCTL2-----*/
$ P% w) r# O9 |$ ?0 y6 x        // 连续模式* x1 H% h6 X  R; v
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
0 [3 x( Y9 \% j1 [* f        // ECAP计数器TSCTR持续计数
" ?8 h0 Y/ k- u/ N        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
7 b8 Z. K# f' z: ~        // 禁用同步输出和同步输入7 \6 w; l' h8 d, M7 O4 U5 ]' _. Y
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);4 S8 K' x7 Y' m- l( u4 O, Q
        // 配置 ECAP 2 为 CAPTURE 模式
5 |/ ?  o5 i; z7 U/ U8 q# {        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);% g0 G8 j( x# I  N% W" U

! C" A+ n9 T4 Y% Z/ b        // 使能中断1 {/ u/ s/ I$ {0 a( S; y
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
. c& s2 G- ~% @# z0 i. v9 G1 i: T}- k1 G4 a6 U2 l/ ]

; `4 }. U- u8 {* [, Q/****************************************************************************/
( t3 s: h: x* F/*                                                                          */
5 f6 G' R( H8 W) a6 f( i6 S/*              取得捕获结果                                                */6 U2 v: M3 \" X! W, u
/*                                                                          */5 m; U9 k. g9 r8 b
/****************************************************************************/
6 B2 u$ l* }' T9 junsigned int ECAPRead(void)' Z* u+ o0 T+ B" s- o' b
{. p0 ]6 `8 g4 r6 i# [" w" ?% a
        unsigned int capvalue;
* k3 p- D% n, [2 B# D        unsigned long frequency;
5 u+ T/ x0 @% }" _- v
; t$ R* ^6 n. ?6 q( l        // Event1 中断标志
  }# r( y; v4 }4 S4 L: Z, E1 Z        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))1 w  v! R) k, ^7 s; e8 F  i* K8 y* B& [
        {
+ F' o0 F+ N& k4 u$ X# a                // 取得捕获计数
9 q3 J3 e1 N- s& ~" Q. Z9 Y                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);. Y% K0 `9 \: Z0 ~- o4 ]) {; }
                capvalue = ECAPResult.cap1;5 \9 r, {  E9 x
% v3 R6 M" g+ t+ c( S3 d1 F
                // CAPTRUE 模块 228M 时钟主频
! H9 D/ [, F' @8 q$ N- W                frequency  =  228000000/capvalue;
+ A0 H( R3 D8 J/ v% W                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);& F- U* i1 I9 e7 ]" C

8 d( O  x7 _! i. z6 b7 _                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);7 v6 f$ r0 Z3 \) E
//                IntEventClear(SYS_INT_ECAP2);$ w. [$ u( \  b4 z; i/ |* l
        }2 r7 `2 K, d5 O/ s
        return frequency;: {4 F& |9 \8 L/ g! a
}2 n/ ~9 k7 ^* R( s  i3 K

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