嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
9 y! r, e; f+ ~! S
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
2 Y. ~6 l0 k, K/*                                                                          */
2 X- V3 b! g8 s5 }: ^  c7 U* y/*              宏定义                                                      */
: ^# F" \* O5 W/*                                                                          */* p6 Z1 e9 `* U: g1 {+ e
/****************************************************************************/  I, b" T) @) c  q9 Q
// 软件断点
8 K  q' Z/ O! _8 G1 i#define SW_BREAKPOINT     asm(" SWBP 0 ");6 {" L. x8 J6 i# X
, P: Z3 j0 [3 C3 S) a7 r9 F
// 时钟分频
( u" o. S: I) s* O. K/ j#define CLOCK_DIV_VAL     2284 x0 V6 Y" g" n0 I  w4 `

. `, i. G/ n; |/ \# u/****************************************************************************/7 E" R/ ^7 B6 H/ E
/*                                                                          */
5 X- }8 V/ g7 Y3 i% n5 k/*              全局变量                                                    */
" |3 p* s9 W3 Z/*                                                                          */
8 O0 ^) a. b& J- l$ S( |7 H/****************************************************************************/( e1 K9 i, f) X
ECAPCONTEXT ECAPResult;- Q' Y# P4 a$ V1 `6 @! @

* c- N- k+ ?+ Z; c" T/****************************************************************************/. D7 [8 ^" w( w3 h8 Y
/*                                                                          */
. K; E8 h' f$ d/*              函数声明                                                    */
7 F& p) [* e8 H0 V7 I9 H+ `7 w/*                                                                          */
- x, C) V0 L% `; z- d9 w1 ^6 W2 i/****************************************************************************/
' h' q& u- C4 s2 ?" p// 外设使能配置
! p5 F+ i' ], i5 k. O7 l, [/ nvoid PSCInit(void);- Z3 p! R9 V( @8 e& U2 r- K
5 w. W' e9 D. b5 a, f/ n+ {
// GPIO 管脚复用配置; s# t1 M/ U; u
void GPIOBankPinMuxSet();
5 ^- D) r% W1 y- `9 r3 z) E' g0 {$ x: D: F6 g0 i# |
// 产生波形; W( g6 W0 @# i" I' P
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);* R: y- i% N1 W, a7 u+ n' N3 R$ O1 E" A& Y
void ChopperWaveform(void);( N) z( K' _3 S' e

( N" a) ?0 A7 B, l% C* h- s// ECAP初始化和读函数. S, ^. j9 {+ l4 t- [# `
void ECAPInit(void);
, b5 F0 E- D; kunsigned int ECAPRead(void);
; Y) \( b+ P. O2 R2 c' h/ q. Z: V' F3 t6 D0 @" q
//ARM 中断初始化
' w0 k) Q/ m8 Z9 P; Gvoid InterruptInit(void);( Q1 z/ v5 m4 y
$ s3 M9 I; r* V5 [
// PWM 中断初始化3 V3 o) u9 l7 k2 s; e. _
void PWMInterruptInit(void);
' }* B- P: P4 _// 中断服务函数
* m: ?2 p( w' v- p2 K$ v2 `3 g1 P1 p// PWM 事件
5 I/ A" Q+ J3 y" }; wvoid PWMEventIsr(void);9 J3 I* f; D+ M1 E, r
// PWM 错误控制事件; G$ W$ W- O5 F, P
void PWMTZIsr(void);
0 [8 W# ?, M4 v; W  P; U8 A) A6 O6 k* `4 e7 l
/****************************************************************************/
& c  \8 }# ]9 O1 g; P8 Y/*                                                                          */9 L6 v5 S$ b0 a# U- p
/*              主函数                                                      */+ W4 F# S8 z) B7 v! y5 ?9 ?6 Q
/*                                                                          */
/ @; @2 e5 Q9 u) R" M" l6 r/****************************************************************************/% s0 p% L( `: O
int main(void)$ w9 g! `4 @$ ~4 e; O
{, k5 p9 G& e+ ?# l
        // 外设使能配置! A; F* Q9 j2 M3 {9 {
        PSCInit();
. d3 Y4 L% K* b% \
9 i% B0 C7 d( }: [* |        // 初始化串口终端 使用串口2
; \: B2 [& ~* z9 C! [        UARTStdioInit();
1 B: [) T- r7 b) y# z0 }. S       
( A# g/ u2 F. B' n0 i        // GPIO 管脚复用配置1 s$ N' E; U' U7 x" C
        GPIOBankPinMuxSet();2 {/ M0 V2 x3 i  |( M7 H
0 u9 h$ _6 w( U) O
        // ARM 中断初始化
: A7 C- u. x9 f& m$ j/ R3 U        InterruptInit();
3 c3 G: Q) }! @+ K& G3 j# {1 L' E7 f% F/ B. O
        // PWM 中断初始化( Q; F8 n* F! C: ]
        PWMInterruptInit();
$ F8 B! A% J2 W
, [2 z+ ~; `$ R: w3 V        unsigned char i;
9 `4 ]% f6 K4 x' r. g$ P) D# P        unsigned int j;
4 Y# G) f1 ?# l: D. M
# }3 T" O: m+ f+ j- V$ j! G8 i        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
7 d7 l. Z) \/ y3 o( K        UARTPuts("------------------------------------------------------------\r\n", -1);; _* {, D- E# P
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);2 e5 u9 A+ B5 P( n: `- q
        // 产生波形; W/ v- w; x* \, P8 F
        PWM1ABasic(25000,50);- h  @+ B, H1 n% ?. v

4 F! v! T" r6 s2 f8 f: H        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);6 j7 p, Q: j1 P5 H
        UARTPuts("------------------------------------------------------------\r\n", -1);" ?2 j- f2 Y  n$ A* {

& u' B' K0 d6 s7 U+ m
  X$ U- X* j- S9 L
* H0 F, z- n9 P        UARTPuts("------------------------------------------------------------\r\n", -1);
* n  e. T; a0 N8 w$ e) R1 B' W. a        UARTPuts("                    C6748 ECAP Test\r\n", -1);
7 o# ]+ J+ S9 {* C        // ECAP 捕获初始化
* `( r8 {* O+ E3 p$ S1 Q        ECAPInit();* d" D  J, G, m$ u6 c; J5 Y) j
        UARTPuts("Initialize ECAP.......\r\n",-1);. d9 K! A& m; p! c- n5 T7 n
        for(i=0;i<5;i++)
; \$ X1 P% v  ]' b2 t1 Z        {- _6 R. F: H9 U+ \' N7 A7 _' ^" h
                    for(j=0x00FFFFFF;j>0;j--);            // 延时, [4 R" y. j$ [
                    ECAPRead();4 H: [5 R5 D- O$ r
        }; A' L" i  P' ~0 t3 k
        UARTPuts("\r\n",-1);
& g9 k; X" x1 h+ c$ k        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
  A) Y9 B% Q- p* C        UARTPuts("------------------------------------------------------------\r\n", -1);
. K0 \; k6 H5 R, y
# J6 y" I3 l* P$ o8 X, u        // 主循环  R, h  [' {% b& P; a% ?0 Q
        for(;;)5 c; J4 G4 o9 O6 k
        {
( ?2 Q3 t1 U& K  N; Z7 C4 h" _* M5 Y2 W* w" u2 D6 B
        }( f/ [' n# W) p: |
}  s# A+ P, B1 x2 C
3 K( a! Y  n, `( b
/****************************************************************************/- s+ P( K+ t+ K8 Q5 z) T" M
/*                                                                          */4 Q! C# L7 ?# `
/*              PSC 初始化                                                  */- t8 ^! f; c# a8 g: V& u# L! d0 x! O
/*                                                                          */
* Z7 N- G) k7 \* u+ K/ x/****************************************************************************// O) ^* v! @4 g
void PSCInit(void)6 E7 b7 u2 n# m7 s' Y
{# s! Z  K, _: l) D
        // 使能  EHRPWM 和 ECAP 模块3 M7 K: y; W2 g4 o
        // 对相应外设模块的使能也可以在 BootLoader 中完成9 B! C* W, P9 c2 d
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
( N/ W/ V$ v! B& T( u4 s/ O    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);, O  l* I( M1 F6 A) D5 E& R
}
( B, S! C/ L2 ^: I0 R
  B: P# O# k% r/****************************************************************************/
# s1 D+ W- K9 a+ d8 l; `& O/*                                                                          */
4 t6 [7 N+ \) p/*              GPIO 管脚复用配置                                           */( E) p0 ?' x. e
/*                                                                          */4 q' b% G" g1 x: ?
/****************************************************************************/
6 J& g6 F- b! V* f5 yvoid GPIOBankPinMuxSet(void)# B# q9 A- U( F6 ~
{
0 x, }& G+ u: [# O" d        EHRPWM1PinMuxSetup();) w+ r, |) D$ S) i" m7 d  R$ ^

- `; `/ D, a3 M4 u        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)1 a7 n2 e, c/ Z% q. E
        // 作为捕获功能时管脚方向为输入9 t2 w) z7 K5 S9 y; W  n4 X
        // 作为辅助脉宽调制时管脚方向为输出+ }+ K6 s- J+ \
    // ECAP2 / APWM26 \6 l6 l$ B" w# j
        ECAPPinMuxSetup(2);
( r* L' p9 r* ^+ W* W8 z& p8 g+ t- F" p' [) N' c  T- X
        // ECAP2 / APWM2方向设置为输入, x* P( m& D. |' x. Y  t' a" n
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]7 m; ?" v/ ~! c  i, M7 x
}/ X& f, G7 Y! V4 x: P" h9 B9 \( F; C
  V0 f2 U1 f  P) o$ D
/****************************************************************************/9 f+ W, b& h: Z2 @" a+ O  d% k
/*                                                                          */9 x% W0 q; ?. }8 F  h1 Q& b
/*              PWM 输出波形                                                */
8 F. p/ P; P, ^$ f( E/*                                                                          */2 J: {+ N2 [' j) |
/****************************************************************************/$ J* e- \4 L/ D" i
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)( K7 Y6 ^% e! q, O8 c9 T' I, s( G8 G
{
* ~/ f5 m: A6 ^1 P" l    // 时间基准配置8 i  A8 Z# s5 W- o+ b
    // 时钟配置. w$ s6 {. p/ _; g. P. G
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
& |, h7 u5 E1 f# b  w4 Z
6 V4 n% `$ a1 x' K/ X2 x* g" n3 [    // 配置周期3 o. {5 d% H1 n* {1 T6 c6 b
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
/ o  [' m% r5 j3 W# G+ g                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
5 f1 B1 J* H, r) e1 S
1 n3 ?9 @8 V0 Y+ I6 b    // 禁用输入同步信号
; B7 c0 j" Z9 W2 m7 a& B    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
8 s0 B5 R9 B" E$ i& H5 N8 ~
- y! u! o6 Y* h" P% y$ t% _7 H& e    // 禁用输出同步信号# i2 d! h9 Z7 w9 A1 z
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);% V6 Z3 u1 L7 w+ f& K
9 s+ S/ J% O4 R3 M# D
    // 仿真(DEBUG)模式行为配置1 x' {! g4 [* X9 l: k7 Z
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
0 A# Y( j2 D* r7 w# L) w$ ]5 d3 C5 c+ b: {+ e0 q* e* A2 k
    // 配置计数比较器子模块0 E5 i' D) {# j4 x0 Y
    // 加载比较器 A 值
: s) k/ U9 M. j: Y    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE," W8 X, `1 e% k. x$ Z
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);" ?4 R" N: o$ w) @+ v) x# p
& u$ y; x' m, X" H7 x. \3 \- f$ k
    // 加载比较器 B 值/ s- U+ a7 g) {9 u5 F/ w
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
  K% E: J- S" P: Y4 Y2 F                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);+ w8 t' M$ U% E$ |/ U( c

" `  v! B$ K9 Z) s! L; I% Y2 d* p    // 功能限定配置(输出引脚触发方式设定)
9 R5 q4 r) H- K! A  w    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
# n/ v* B( F4 L5 ]' T6 q( Q' f    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
# _/ E, {2 l$ R4 i$ H                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,+ @* U  G6 x+ b: G
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);' T2 u9 a& A" k1 |

5 a6 }% h6 D" L2 W# A1 ~' o    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
; d# E9 f. p5 E    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
# w. L; {" i" i# o9 `: N
$ \/ m) f. v  S; Z) c; e. T3 d0 i    // 禁用斩波子模块$ B! K' d* e1 Y2 O0 L
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
8 t$ H, C- L8 z) p, H2 P1 u  ]5 f- G9 J
    // 禁用错误控制事件
8 |, T; g* }0 t" n" F6 `9 u    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);  I0 W2 u% ?% Z; m
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);# q9 d& o- W  G+ K3 j! D1 E
+ ~3 e1 D% \6 q  X- i  F
    // 事件触发配置9 \$ G$ i' e' X: H% T
    // 每三次事件发生产生中断
: z8 M, j" G: ]9 d% E3 |* a    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);0 G$ _8 c+ ~2 p& y. f
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件4 u' r8 j7 s2 V- K+ C+ L
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);1 g# y: R& n: z# x6 d0 J9 D% @
    // 使能中断
) s0 H# N% b+ C    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
6 d' ]) Z! D) f( @  |" U; p! r2 O  r/ _& ?- H# }
    // 禁用高精度子模块
3 n1 g" x4 L/ X. F) W    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);& X3 M% o0 d. W# z% y* A0 {% ]

9 T9 ~, Y% w: c    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);9 A4 ~2 T3 b) m: i, v3 @
}7 f/ o( X3 k, N7 ~  |2 C
. K3 ^2 ]1 E- F1 g) E$ ]8 e5 z
void ChopperWaveform(void). X: t5 |( j2 \
{
0 U8 l$ I+ x% b% r    // 50% 占空比& f$ O/ P# Q4 F
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);  O6 u! [( V7 G
    // 4 分频
0 k1 v$ S' U5 g( I9 J& \    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);5 s. a- Y3 p# A0 R$ p8 D9 |
    // 单个脉冲宽度
9 Y% h! z+ N7 ]% `6 _0 L6 A3 h    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);. o8 e- `% e7 r% a( ?, R
    // 使能斩波子模块' s" S2 H( r# H  q  V
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);# l! i% K! {/ L9 t7 j- p8 p, `* m
}/ S0 P* O: k3 K$ M' ]) Q/ }* y3 ~
$ l; [8 I. n, C; p; }. v$ I. K- R
/****************************************************************************/
6 l- D& j5 y- m' Y, L; v* i! Q4 J/*                                                                          */9 |+ Z% [8 V2 k) W8 K5 Y- v
/*              PWM 中断初始化                                              */
4 I4 _2 \. Q% M/*                                                                          */
$ \- ~- z, a# D% W3 v9 ~7 O/****************************************************************************/1 D9 N, W# ^* l+ ?$ s. @- K, s
void PWMInterruptInit(void)
* I( g% T/ x7 d# v' K8 k& c' Z# {{
9 t, n$ ?+ O6 H2 C/ G        // 注册中断服务函数( j/ g$ ]. q! U* [! g3 _
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);' u# F( N8 }" F- {3 d
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
% P5 }, k, q! M- L' O: s2 L
0 z. f9 U1 k0 l% B        // 映射中断
; N' U! A* W" ?  X: H" K# C        IntChannelSet(SYS_INT_EHRPWM1, 2);
, j3 }' ?' T* m2 C! ~8 p        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
$ D- Z" x/ m% r, C3 C: l
5 L7 G6 r: E5 A        // 使能中断& m$ {- ^2 H# s
        IntSystemEnable(SYS_INT_EHRPWM1);6 y1 ^+ `! F! W( U8 F( Z5 R
        IntSystemEnable(SYS_INT_EHRPWM1TZ);9 u! C( l8 ~! K3 x0 |* ?% ~0 w
}( B4 c  A1 e3 q' V* F3 a7 B

( [  m: w* ~8 ^$ R0 L6 w: H/****************************************************************************/2 B( z' l- _5 y8 P
/*                                                                          */
, m3 U  Q! A' D9 ~7 S4 T+ X/*              ARM 中断初始化                                              */2 }- K( l4 ~8 [
/*                                                                          */' N! E9 W/ s) G9 b* W- f
/****************************************************************************/
% g, Y1 f' y- B/ I7 zvoid InterruptInit(void)7 x4 H6 W+ G* N4 ]6 p# E7 Y
{, R  g/ i# n, A% f8 ~
        // 初始化 ARM 中断控制器! Y2 [0 z( G; H; V4 A* K5 j
        IntAINTCInit();' B) ~) n% R8 @/ T9 m  |) s

6 w: F% W8 i- F- ]2 s4 D        // 使能 IRQ(CPSR)4 B5 N1 q& a) m, w
        IntMasterIRQEnable();2 K4 F7 }2 |- u- M% [! b: x

4 n, N6 `( v- H) c3 s/ I" y        // 使能中断(AINTC GER)
) Z9 i; y; [/ p- Y        IntGlobalEnable();) H% J, |6 i9 B8 X1 f

7 V! i. O$ m; O; C3 A        // 使能中断(AINTC HIER)0 k0 P+ f% x4 O* z5 J
        IntIRQEnable();
% j. l1 ]& z: r% `1 g1 z$ A( z5 W}
# C# o2 F. s1 `7 ~9 p+ c% s
4 G! v* s6 C9 y4 V* j1 F
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/
  L* [0 ]6 L( x: N/*                                                                          */0 c" R1 O( ^6 t! o; y/ t" g
/*              中断服务函数                                                */
  m. t# U" L7 M/*                                                                          */
% l7 @, X& }8 e& I. b4 M  t/****************************************************************************/
; j; x' R% P4 O* T2 z5 }void PWMEventIsr(void)
5 y& [2 E/ U+ w0 R5 ^% r{) M1 ^' O! v; [' Q& N, J
        IntSystemStatusClear(SYS_INT_EHRPWM1);  @/ g$ Q  a: d+ l( a9 i

7 S' w+ c8 w, s; Q2 s    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);% n. h  y$ `, g5 j1 Q4 v6 B
}
2 O+ ?2 v9 d& o9 c' s0 i: z
; n- A  p6 x( J5 Bvoid PWMTZIsr(void)
& J- _7 ]' b( r{
2 c6 c7 n% D. e$ I; G) Z        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);+ E# k) ^/ k4 Y6 D9 p9 F4 s, A
7 }+ f4 X" y( K3 j* M" l; T
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
, n5 l/ @# m% W3 q+ v5 O: y}7 `  J" y% p% {2 q2 z) M9 Q

) F1 A/ n, M+ t) k, t/****************************************************************************/
+ N1 p) Q; ^; q9 `/*                                                                          */1 G9 e! M4 q/ \/ O3 Z
/*              初始化捕获模块                                              */* X: Y. C/ O) O2 E( H! X* b7 F8 W" h# Z$ z
/*                                                                          */& l) C' Y- H' A; H$ A4 t# m3 \. S% d
/****************************************************************************/
5 M4 ]3 c% i  p) ?% W+ W# ~void ECAPInit(void)
" E1 U) u; V3 A. d& [% _( c6 z+ [{4 {: ^6 K) u( p5 ?0 @
        /*-----设置 ECCTL1-----*/  F- O. p; N: ~! I
        // 使能CAP寄存器装载
6 j; k" k/ c) `        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
7 [+ z) @. f3 O3 s& d0 u        // 设置预分频值.
8 R3 t: d% L' U' Y& H7 Z        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
5 K% B/ w0 b/ B. a$ M        // 上升沿触发捕获事件
& h) a4 E- d8 O) c5 h- C        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);3 f# S: b, }0 R+ j
        // 输入捕获后重新装载计数器值.
" g: w* C7 Y0 i5 [$ x8 ~        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
7 R" _# Y$ ], k  g8 }4 N0 Y0 T$ s& O* ^& q, S3 X+ f. C6 h
        /*-----设置 ECCTL2-----*/& H. T6 S: w: l8 C
        // 连续模式! A7 q6 F2 e/ P6 {3 }# n$ q
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);: s6 p+ F4 U; x1 L4 z& X! x" z
        // ECAP计数器TSCTR持续计数' p2 c4 @- w. w( Q
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);+ c% v9 ]4 N- @$ @( I( ?. ]/ q
        // 禁用同步输出和同步输入2 ], {4 ~3 x) N$ D8 j7 d
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);) Y# t" J' }3 k' B1 s. G
        // 配置 ECAP 2 为 CAPTURE 模式0 `9 B9 W9 B" l) q" y
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);/ v8 I  B0 G4 u' z9 [/ N
  C7 x5 m  \* P7 Y9 z: N! j
        // 使能中断
* ~% Y6 Z0 J" m9 }8 a* \//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);  m4 J, h! m  X* Z
}* S1 Y7 @6 O$ w# `2 u

2 ^) M2 l% f* H  O; M' c8 c* O  d/****************************************************************************/  M$ |" g, G4 E
/*                                                                          */! x3 p& I( M% r$ T& o6 R4 z
/*              取得捕获结果                                                */
! ^+ W" G' e0 x/*                                                                          */) |' m! J1 ^/ B# O4 u
/****************************************************************************/* s* m; D+ @; Y# I$ `% }/ t7 F8 p' X
unsigned int ECAPRead(void)8 n4 p, e- A: @# l
{/ a$ P/ w1 g" R/ f) y
        unsigned int capvalue;
, D! @: v. i3 u+ q& `( m& ^        unsigned long frequency;- t# \' X8 b' S" R
3 `1 L6 R1 n; F! G+ o1 e' q# p
        // Event1 中断标志
# _& [7 H( m; D" E: d0 u- j/ \        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))8 Q. R& [, `" @  Y/ T
        {
5 @: h. _$ S7 U) a+ V  g                // 取得捕获计数
! \# K, O8 m- y# s1 b' v                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);- t  n+ e6 y  h- a# G- Z7 X
                capvalue = ECAPResult.cap1;
" f+ Q4 U* U7 G; ]3 U1 m# j9 y2 I2 J8 y0 ^# `( f% A1 M; A
                // CAPTRUE 模块 228M 时钟主频+ e- B  s0 B2 j3 c$ W4 _: ?
                frequency  =  228000000/capvalue;# S. f3 a/ ^, l: G; Q& \% N5 y
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);" n) z( G# a9 _/ {8 z+ a& T9 q6 }8 |

5 D1 m. G7 f, H) g) U* i9 G# @                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);" m5 D6 k: Y% B( |2 o$ Z' f) t; V
//                IntEventClear(SYS_INT_ECAP2);- v2 j; |0 H& R! b3 Y
        }, v' a5 v% s# `$ f- H* {
        return frequency;
9 m: k' T5 ?  B! W; i4 v}; ]; l$ ]+ l7 L: w

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