嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家5 i8 B: j" k9 ~% P. C. Q

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/2 R  _1 F3 J+ c9 G& n  H
/*                                                                          */* D2 X, ^. o& v' j
/*              宏定义                                                      */
0 a8 B0 ~" V1 U: e* a! n/*                                                                          */
+ C% l; Q1 d6 z% M( C6 U9 r1 N/****************************************************************************/8 T; c3 V8 A" ^1 B
// 软件断点- R/ h8 b/ `* |9 H
#define SW_BREAKPOINT     asm(" SWBP 0 ");
- ?& Y6 L8 O* l6 E: Y1 i8 Q# b! K/ l6 B+ g1 E- S3 d$ T: x
// 时钟分频* a+ q$ x7 A/ g: T9 [& K
#define CLOCK_DIV_VAL     228
* w/ I% r# e. S! X% O- q# s% w8 ]  B$ D6 u: M0 |
/****************************************************************************/0 Z: g( r( j2 |* J$ J
/*                                                                          */4 X. m3 J& f, a
/*              全局变量                                                    */
( L% R. H7 _: H4 O, o3 j2 C/*                                                                          */5 p1 b0 s4 D7 k# F. @5 u' L, B
/****************************************************************************/# I! o2 T/ h0 X) d
ECAPCONTEXT ECAPResult;
6 ?; a/ }) a: S" O, I0 k5 u
2 O  ^4 o0 [  @) o+ K3 J$ y/****************************************************************************/3 ~9 P4 }# k1 d7 y2 Z. g
/*                                                                          */8 Z( V) ?# i3 I$ _! Q
/*              函数声明                                                    */
1 o0 Q8 y) ?% ]: [& G/*                                                                          */
& s# M& ?9 j$ {4 C/****************************************************************************/
; g' S4 |8 u3 O" m5 W5 g8 v// 外设使能配置& M0 l& ]5 |, j  F2 [
void PSCInit(void);: I% s- W. Z3 `! C( C6 d, S

/ [; F0 Q- N) h, y( J, o// GPIO 管脚复用配置
; s  J/ ^, R3 V4 S9 c' ~9 Lvoid GPIOBankPinMuxSet();8 ^& W6 p) j# t" S  Q; R% l
/ q7 l: H$ z; j1 }, q8 N
// 产生波形$ @- U6 v0 {( f! h5 M
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
6 |- D- b5 \7 J" S, r$ l! z$ ?, zvoid ChopperWaveform(void);+ w  V6 P% ^( q! G

& T/ A. x" C. t  ]! }$ p// ECAP初始化和读函数! V( X* ?+ k# u! b
void ECAPInit(void);9 r: f7 m, J. T
unsigned int ECAPRead(void);
" y  L8 s6 Y" K3 ~
8 A& K- i  a) {- t1 u//ARM 中断初始化! @9 M  T% U/ d: j2 P+ B  _# S6 |
void InterruptInit(void);: S- e4 u8 d1 D

: f) z. V7 Q$ O8 s) F" ]' q# B" x8 O0 v4 M// PWM 中断初始化
/ a3 X9 T% ?% R3 |8 svoid PWMInterruptInit(void);
2 K# }" \1 c$ K% m1 O5 W: V// 中断服务函数
1 [! M( z$ e# |& I- f// PWM 事件
% j! M0 V8 B5 |$ x) k; ~void PWMEventIsr(void);, w6 w4 g3 b9 j# L% {" o
// PWM 错误控制事件
2 u: N6 v" @3 Y; ?1 ^' wvoid PWMTZIsr(void);, ]; a' Z8 z3 }9 ?
  J) J5 C+ F3 P' F% H
/****************************************************************************/0 h. U8 d0 N3 u) p
/*                                                                          */  V7 g  w$ a# k8 p, I! c
/*              主函数                                                      */) F; p0 N7 R. {
/*                                                                          */5 P6 ], Y- {. F$ B1 s# u8 r
/****************************************************************************/
- K% n& M- ~0 `2 ?int main(void)
7 M% J5 }3 ^" B# a" B{
* B3 |/ l( K5 F        // 外设使能配置
3 N# T/ ?7 r# e' o( k        PSCInit();
8 h# K6 H  u. S. F9 ?2 Z" A2 B
8 [$ w, T) x" D+ \4 g& W7 O        // 初始化串口终端 使用串口2
7 ]  E0 O$ D( U6 i& x$ ~        UARTStdioInit();
: }" l- j! F) }       
7 [4 \9 I# Y8 B% m- x        // GPIO 管脚复用配置
1 O5 j, K6 ~0 d! K& F4 S% a' p        GPIOBankPinMuxSet();  v9 u6 a3 J; a6 Z
( ^# I' v: [) g9 Z7 O; M
        // ARM 中断初始化
" `0 g4 E- \' s4 x        InterruptInit();& i6 e5 m2 j: p5 K7 y" k

% B8 p' Z7 {) _5 c) J3 X! v: u4 f/ J        // PWM 中断初始化% m* v5 j& d3 j1 z, e7 }* P
        PWMInterruptInit();
& B) h7 N# m- t- i- h1 [# @0 b" L3 k2 d+ [
        unsigned char i;. w5 x" W7 d+ t: s1 u: w& a4 [
        unsigned int j;
( X! F" x, a3 W+ g. E4 j7 b
2 b0 X/ I1 R: |/ J6 B* Y        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
' O7 I  Q5 R! K. O; e        UARTPuts("------------------------------------------------------------\r\n", -1);
0 `4 A8 w6 J- F* S5 u2 d        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
" }( Y- V. l9 K( L' b% r; }$ n        // 产生波形( o& O! X! P8 N2 ~4 j
        PWM1ABasic(25000,50);- m9 X: b7 Q2 ]4 c. U4 V  @4 ?) M1 j
5 n4 t7 e- e/ Z  Z( }
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
- b% Q# z' C4 i6 N. _$ P9 k        UARTPuts("------------------------------------------------------------\r\n", -1);
& l+ r7 }. T: R
1 u0 Z- v& ~. ?5 X$ T' Y9 e) S
: _5 r; @: r7 {8 V' y
4 q. P% w' h7 t3 A6 c        UARTPuts("------------------------------------------------------------\r\n", -1);' Y; P; L0 ?3 O
        UARTPuts("                    C6748 ECAP Test\r\n", -1);
8 M5 ^! m. z- B) R3 O$ s        // ECAP 捕获初始化
% T9 r) y6 H  C' N2 E# b; Q# `        ECAPInit();0 \! i7 Z2 e+ x* ^+ F
        UARTPuts("Initialize ECAP.......\r\n",-1);
5 i) N/ |# O4 ?9 H        for(i=0;i<5;i++)
5 j$ u, z! T; m8 c: K1 o        {4 P& k+ @$ o; e) J+ [/ d
                    for(j=0x00FFFFFF;j>0;j--);            // 延时
9 Y( b$ H1 T/ ^$ v. w) k                    ECAPRead();+ `' R* n( n# c) p+ l
        }; w) \. I7 s( L" a( L5 U5 J. `
        UARTPuts("\r\n",-1);
6 E  j' ^6 q+ O; n0 H( O- C        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
" W1 @+ [& t1 Q: k" b        UARTPuts("------------------------------------------------------------\r\n", -1);. c! k- w: I0 y2 Y7 m

' P/ m- B# I- |" y% P* v        // 主循环/ L6 L+ G% F- c2 V
        for(;;)* k. q# I; x/ B& G$ b& d
        {
" r1 {1 K; P( c2 i& y" z( A* A( e" E9 o  Y* r& t  i& D' G
        }! ~' S: j/ o: U3 g. o' W7 M2 E' g
}/ O2 W) P5 q/ H: Y7 v% }

& h+ Z5 f9 i! w3 d4 j) w/****************************************************************************/& n3 ^( ?- v& T2 `; Y8 f
/*                                                                          */! E$ Z* W" @. v# s% L) _: `
/*              PSC 初始化                                                  */
, S$ M& u$ H, Z  b/*                                                                          */
4 H  ~8 w& Y) m! N* s/****************************************************************************/3 r# Q/ S; f2 E3 m7 z4 o
void PSCInit(void)
, r) V; a. d1 D1 t4 f& D* v& j{
8 u$ x1 {7 @" v; R" b+ y9 c: Y        // 使能  EHRPWM 和 ECAP 模块
8 c) n  O& l9 y0 j3 f; l- ~        // 对相应外设模块的使能也可以在 BootLoader 中完成% x& f3 h! w/ H1 g6 k
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);3 s1 [9 e; t! h. O5 }
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);# O; r6 A% Y+ \& G4 b
}
$ |2 M: n2 }& V1 d2 a$ M8 K) i2 T0 ^* \" Q+ Y
/****************************************************************************/
/ ?# I4 k0 s0 x/*                                                                          */: S. y5 z/ {  Y& u  p7 ?" t
/*              GPIO 管脚复用配置                                           */
/ m4 [' H) s6 K/*                                                                          */) B) A7 l- d& e; }
/****************************************************************************/
( n0 e9 Q. a) M7 H4 hvoid GPIOBankPinMuxSet(void)) v; i' S- X% J$ b$ g+ t2 F" E
{7 i. T- e6 h  N4 \  x
        EHRPWM1PinMuxSetup();+ T1 z! A) S# q2 S3 @

( w( Z+ t7 X& m) D+ p' A: |        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
3 O! G' w# |; g6 p        // 作为捕获功能时管脚方向为输入- ]$ t' ^6 K4 L5 o6 }) f/ Z) ^
        // 作为辅助脉宽调制时管脚方向为输出
& E& u* O+ `3 J& H9 o    // ECAP2 / APWM2
: F  p' b. {1 g( z9 w        ECAPPinMuxSetup(2);9 E; @% D' N7 S, s+ E/ d" }
4 @; `" O4 `0 s  H* ?- f- U' l8 k
        // ECAP2 / APWM2方向设置为输入
& X& _3 H, Y9 W5 u, D        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]$ u6 O2 m* r- g3 h! B3 V3 f) u
}# @6 x. M  H* S3 c  R+ |8 T
- F% M3 |; E4 r/ h. E" U8 z
/****************************************************************************/8 @, {* C) s/ s/ b) A! V6 F  L
/*                                                                          */
* S) a* C2 M9 U9 \! [& u/*              PWM 输出波形                                                */7 H% c( C* |. H
/*                                                                          */
; k. f3 }: E. z/****************************************************************************/
- b( C7 _1 T. p9 Q  R0 ~. f  ?: Ivoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)" Q' _& e2 d. L$ x9 a: U
{# v+ I: m9 p0 y- z+ X8 U! j
    // 时间基准配置
$ t9 x) d# A" j0 l1 K! b! d8 v    // 时钟配置
6 P3 }# p$ r, x, y# N    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
2 v8 a$ _/ n; M" Y4 e) `# p3 A5 @0 `  W7 z/ o% J
    // 配置周期
% }! y4 S7 N4 e+ ~( N, _    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
1 \' R; q" {* _# L. r8 V4 V" H) s                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);+ y* ?+ ^7 n6 R* z6 r
9 p, v1 n) ^* M( w5 m, Q3 Y
    // 禁用输入同步信号% [* |8 p/ T! N5 Z  d% x
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
: O6 W( C% j4 @$ q* |$ @0 T7 m4 L% Z: T* I% q/ _- i0 d
    // 禁用输出同步信号
" ?. g# |. G3 G& j1 z% Z    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
: \% }' Y/ I# {- t
9 V3 T' A9 Q, Y9 K5 j) D    // 仿真(DEBUG)模式行为配置
5 a. P  P6 }1 `  p; W/ A* N5 V) _    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);- e" y. f5 S) i5 y4 s: G6 @

( |& I, Y% H+ x$ r; Y! l- b    // 配置计数比较器子模块
- |1 C* p8 U2 P5 i# v    // 加载比较器 A 值
. }  M! z' N8 S6 _; t/ F  ]    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,+ f5 z, s# ]& `$ c
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);, f$ O+ i0 x8 V0 G# ^
% W$ `6 f) }0 O7 h
    // 加载比较器 B 值6 Q5 x9 V; o6 Q7 p
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,/ q, O2 n8 U$ t# B  U8 y/ d
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);5 e5 }8 H0 W& W

# }2 t7 g/ d+ `- ?, E. C    // 功能限定配置(输出引脚触发方式设定)4 n4 {# `" j- p7 B- G! _
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出" k- v* V& E" V
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
, y# n. h( \7 r6 a7 U( ~7 n( ^" q                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
9 ~9 F4 q1 q, u: j                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);9 z7 Q  \* O1 y0 H. V7 n
% {* h3 A$ x" i. g6 u
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块4 e3 ~3 M7 J; m3 `- }
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
* D2 X2 a; I4 l9 Q9 t: g0 o  z& W8 \# b
    // 禁用斩波子模块3 v$ _% q: l: T3 |4 `
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
' p5 ^2 D) m1 K3 J2 e
/ w* x; R0 L* P  c  M8 v& V    // 禁用错误控制事件6 H2 t' ?, _: U9 Q" W
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);1 D0 n! F7 _$ ^8 w; `
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);0 p8 [2 B( y8 D& Y
7 i8 w: f2 [- B. E
    // 事件触发配置# c1 }9 B- k; Y* r8 g) ]$ P
    // 每三次事件发生产生中断; E4 k  p: F& i. \
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);. U) t/ f8 q; v8 ^. P* H
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件) e" B; I; @6 I  z5 I+ E1 f$ Y
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
" o0 W0 ]7 d9 Z" ]    // 使能中断
% Q; y" J$ j8 k6 Z( E( i    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);0 _5 K) J" V: Y; }8 [, x* q% _

6 Z% N/ p- [5 X  i; [) Y    // 禁用高精度子模块$ T# e$ U3 s& v- S7 x( T5 k% L
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
  V5 \, F* W, ~& z# l
7 p+ X: p0 D5 X: p    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
1 q9 m1 C4 s: J) ^  m  d7 a}/ C/ U. D. S6 b; `
6 S% Z( P$ R- S3 W
void ChopperWaveform(void)
$ O$ A3 U  I4 j{
0 g! c$ p! s2 w, A# X1 a1 D) F    // 50% 占空比
4 |3 y8 i2 U7 C' C    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);4 n# p# R, R  ^5 x4 g
    // 4 分频
8 l1 X$ x: F* `) r# G5 X( U: m3 T    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);6 R0 W( P9 ~- q. e3 A
    // 单个脉冲宽度
& P/ q9 Z) j/ Y+ y8 h3 _- B, r    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
  e$ ?) g5 ?* P    // 使能斩波子模块
1 y- H' N, w: Y& N: \( k( a! E    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
. ?7 k% t- f# C}2 H( \2 v% A$ N
- y6 a3 i1 S( u' S- [* d
/****************************************************************************/5 f# h) Q2 `* O9 s5 G; `' t
/*                                                                          */
1 W% g3 _+ k: e2 r/*              PWM 中断初始化                                              */) H* J3 u( e" D6 \" o
/*                                                                          */
8 y& |/ c4 z! L- _/****************************************************************************/
. k/ B& d, J8 o  O: zvoid PWMInterruptInit(void)" V. r  e/ W: o2 q, h& }
{2 h6 V, X" R0 R) J  H: w
        // 注册中断服务函数
- J) u% s( @! K. m( h' K& Q8 c        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
7 v" E8 l' {$ R5 t        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
% V: b# G6 q8 y5 X' x
- F! N9 W$ }+ u) Q. ]' }        // 映射中断, F  k% B2 _1 I/ C
        IntChannelSet(SYS_INT_EHRPWM1, 2);+ |7 y' s4 T6 Q7 H+ P4 E' y
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
3 S9 ^1 I: b* \( D
( f1 R9 i# x4 C- M+ [3 z        // 使能中断
5 E. K  r6 x% g- ?        IntSystemEnable(SYS_INT_EHRPWM1);
; k) a0 b1 O8 I7 ?! B& g( L        IntSystemEnable(SYS_INT_EHRPWM1TZ);
9 W. k+ {+ p1 j; L2 V1 H' V5 L7 R}
; L& Z5 {" E& j% X  `/ ]+ U% C8 A0 s# i+ d2 @2 O! X
/****************************************************************************/* V4 S! o" e0 i& _, ]9 Y) o9 U
/*                                                                          */1 |! N- D; z9 u9 Y: G' K, K
/*              ARM 中断初始化                                              */2 h7 U/ ^" _0 X# v  y
/*                                                                          */
9 R0 o" _% t8 O8 f' A) m& t/****************************************************************************/
3 A; K. Y1 o7 d; lvoid InterruptInit(void)
- L/ t  f2 V$ z{" M; w# `' t# l# j' Z7 X; k2 D5 S
        // 初始化 ARM 中断控制器9 t2 h/ O: C& |  T( b' ~
        IntAINTCInit();: @. x4 [9 s  [6 ]" ?4 e

3 D, z2 @& t1 o* w5 m# t        // 使能 IRQ(CPSR)7 k  o( q5 M  r3 |0 _. X- o# E
        IntMasterIRQEnable();7 t# e5 v/ G- s1 j6 d% j9 }

5 U9 c3 W! _$ S) l3 `5 d        // 使能中断(AINTC GER)
9 o/ w5 ?( G/ Y        IntGlobalEnable();+ k, j6 L+ H+ g/ d  E! w- }
( {; _$ n5 a& s2 n3 @. J& n& T6 d
        // 使能中断(AINTC HIER)
! k: H4 f* f) e7 G        IntIRQEnable();
0 q8 I* y0 K; d$ B; I}
5 S; \! v" y  t5 Z
, [0 P  g7 K- g/ ^2 s
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/) a0 Y1 {0 M1 u! g1 ]
/*                                                                          */
' B" w7 _% Z/ G, [/*              中断服务函数                                                */
9 z, W1 x2 X2 n% L  S5 R9 E/*                                                                          */
8 b# w, m$ t+ ]* [: u! N/****************************************************************************/% Y! r) v- h: q5 Q4 w
void PWMEventIsr(void)/ v/ [/ h/ n/ |) a
{8 @5 J; s" ~; I1 _, d
        IntSystemStatusClear(SYS_INT_EHRPWM1);
+ V8 r1 n: t! O7 z$ ]7 W$ y8 ]2 F+ c3 [6 f& L" K( w
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);4 A0 T8 {/ o+ |8 F! w7 e
}
  f- R6 q# f; V; s! R+ b0 U8 z. i6 c: L
void PWMTZIsr(void)
7 O1 |; H' U- e5 n{
8 r- }, ?$ U# E" G8 D) Z) X% ~/ G        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);4 P3 B1 @1 J# K

" ?; p5 r6 _8 l0 D- S7 A' k    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);2 }; b' T- |5 Q- Z4 o- ~4 @
}
8 r: W1 ^; e0 l$ k! a7 }& }
! k% B3 ?* }- u/****************************************************************************/
6 C# q2 h2 R) ^1 `/*                                                                          */
, o( B: v8 S6 O1 m- e; S/*              初始化捕获模块                                              */* @! z- d8 x& j
/*                                                                          */: J& `3 j% \0 }  x# F3 b. X' M9 D
/****************************************************************************// e  R$ ?, N1 e/ h
void ECAPInit(void)
0 X1 `1 g0 B* `$ V7 O1 X7 ~$ z{% f4 I0 S% Z% [. x" ]' m. H
        /*-----设置 ECCTL1-----*/9 x% }2 K. t: e# S' B
        // 使能CAP寄存器装载
) ~- S. R. K7 l& M  {4 a' j# n0 Q        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);8 w9 I' z0 G; ?- P. D
        // 设置预分频值.
0 x% B+ n& @0 U. k, a5 u! |8 H        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);4 `  g! a/ l/ b4 P" J" j1 a+ k
        // 上升沿触发捕获事件- t, p" C9 U& {* j6 c. I' `8 k
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
7 E$ Q  B3 t7 @4 ]        // 输入捕获后重新装载计数器值.
) C& i7 e$ }  B3 B, W- C        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);; ~3 E) A: J4 c: [

8 B) [% i( Q8 `6 h4 f" v        /*-----设置 ECCTL2-----*/2 }' `9 ^& G5 u3 [
        // 连续模式
) E! k: @6 p5 s7 L        ECAPContinousModeConfig(SOC_ECAP_2_REGS);0 l7 l- u4 j5 J1 R" x
        // ECAP计数器TSCTR持续计数2 y2 f. d9 Y; c" K6 i" I# C
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);% S% `0 c5 s& ?7 G- n
        // 禁用同步输出和同步输入
" O* r5 j% F! ~8 E7 r        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);& [  i2 q9 d- [2 y
        // 配置 ECAP 2 为 CAPTURE 模式2 `! _4 Y2 x9 F9 t5 i6 `! n6 h
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
9 B; _6 `5 G# G- V* ]! y& ~
% R2 S( P9 S$ e; u1 x8 p        // 使能中断
! N& p! G* s3 o( V7 a! u, T8 C//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
" u  X) G5 `% E0 `1 N, I1 b( H}
# i/ S& p3 m# U1 @- [6 ]- c2 L, s, Y; y7 g9 p: i6 b# `
/****************************************************************************/* d3 s' |: O9 B/ I
/*                                                                          */
8 L, U% Y8 K  u5 ^! _/*              取得捕获结果                                                */
4 h* r5 \. k  J7 f: n/*                                                                          */
9 [; o5 a0 Z) ~7 M/****************************************************************************/  e6 Z/ Q9 n! \$ H
unsigned int ECAPRead(void)
) P& g: i( g& V4 `& _$ X{
; Q) U+ a# J5 G) ~1 c" s        unsigned int capvalue;
5 ~5 W- _) H0 S& @) U5 C        unsigned long frequency;" M1 Z8 r* a0 D0 Y) a- l% i

8 @; a! @8 a( p: Z- j        // Event1 中断标志
" v& u/ U) t9 Z9 h+ @' T        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
5 S1 K4 I9 F# I: G: H        {# e9 W7 f! @! ]: @* `8 P5 m
                // 取得捕获计数+ ?! k- K3 L9 x5 [" O. m# X! K
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);: a, j) q# o% W: |* W9 u
                capvalue = ECAPResult.cap1;
. k* S. b. n/ p( `' W+ B9 K( \+ m" @, p) r! D
                // CAPTRUE 模块 228M 时钟主频+ c& K( f$ ?5 C
                frequency  =  228000000/capvalue;
$ F. S! I' A& s                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);1 j# x3 S- f/ z( b

5 J# u, u* g$ U% h8 }" ^                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);  ~& w! N, s8 w* H: M0 ^: t
//                IntEventClear(SYS_INT_ECAP2);
* }1 X/ q, I! l4 W) p4 p( S- R        }. o5 k5 b( K* h; F4 b( ^8 D6 ~( K
        return frequency;, J0 U- |6 N5 V& R! @# }
}8 J3 K7 s. b$ j0 @( l# x

作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。6 X' g- ?" ~$ a8 L0 I: o! M( }
[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