嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家9 F. s) }0 y2 f- b

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/; |+ u! X* e" s; j' h1 D
/*                                                                          */7 S. t& H+ N4 m' w' D
/*              宏定义                                                      */: k5 \& ]5 f6 m
/*                                                                          */
! V9 F9 ~, F% n/ T* T: X4 M1 i/****************************************************************************/
$ g. U# N( q" }7 }5 t// 软件断点3 M- E2 u- ~9 H9 ]) a- e/ \9 q4 ]
#define SW_BREAKPOINT     asm(" SWBP 0 ");
0 Z5 k  E; }7 r! ^% |  }
8 D2 \7 W" X! I, u3 Z$ g2 ]// 时钟分频
3 ]6 j& n5 K" R8 l* [) k: T- F#define CLOCK_DIV_VAL     2286 u7 d& J% ?. F# `1 o3 _
  Y* f9 h) P- [+ d( y
/****************************************************************************/
9 P) r4 \+ l+ X# p& g; Y/*                                                                          */
( l$ j+ O" b% k! r/*              全局变量                                                    */4 W' ]! h% S3 }; Q9 N( t4 A2 `
/*                                                                          */
5 b$ o7 F4 w1 H! T/****************************************************************************/
/ C% X% k3 y. q3 i7 b! {' A1 E( ]ECAPCONTEXT ECAPResult;4 F2 L* [: T4 G" [

# f* i4 I- U) q. I2 z0 W4 k/****************************************************************************/
# V7 Q3 r! m6 B/ ^; e2 o# d/*                                                                          */! j0 N0 w9 t1 W, L( {2 Z# h# T
/*              函数声明                                                    */. t8 L+ m4 A5 o* Z1 i3 A
/*                                                                          */; |2 w/ g0 o  g2 b( X. J; |- n
/****************************************************************************/5 s1 M( Q5 k, T8 b4 @5 |) ~& s& y
// 外设使能配置3 U& `+ g  [2 d3 R5 h. D4 R
void PSCInit(void);
3 _1 {( \# K/ [
: o9 q1 l0 t% m$ a9 e6 u// GPIO 管脚复用配置
: m7 J/ A& @& G% _2 q# Vvoid GPIOBankPinMuxSet();" c+ z6 H& T9 v  t0 U

" ?) S* W* Q8 R// 产生波形
& [7 ]: @5 g) U! E0 U( [void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);8 }. M. S+ f7 L( L
void ChopperWaveform(void);7 F. }$ s% L& [3 T
7 \( j) p0 H0 V# G1 R
// ECAP初始化和读函数
. ^$ m% o+ R8 J- xvoid ECAPInit(void);6 @- t  Q! e( X" j/ y3 l
unsigned int ECAPRead(void);% d$ x& e- w) o0 l
, f' ?* A  N, U
//ARM 中断初始化
+ s) f- g; P7 P/ u5 ^: A* j. fvoid InterruptInit(void);1 C9 G( ]* Q/ d" H5 M8 x9 R

6 L) I/ }* k  P// PWM 中断初始化
# U6 d; M. z* s6 `. `) L' Tvoid PWMInterruptInit(void);
, j% s0 W  x  @: e& D( d// 中断服务函数
' ^, r8 V; G% i3 l7 l1 V/ W9 l// PWM 事件! F' ?$ G0 l7 Z7 o
void PWMEventIsr(void);
/ o0 {; e  e8 B1 C) ^/ |; S  G// PWM 错误控制事件
' t6 l* s. |2 ~) a" g4 i4 ?: wvoid PWMTZIsr(void);
. U* r0 N% a7 R  [& p( k2 H' \% d, s! f8 W) R8 u
/****************************************************************************/0 z9 u5 d8 _# V: {1 [9 K
/*                                                                          */
3 O+ Z& Y! {6 e; {! e7 C& n# v/*              主函数                                                      */9 P* o/ c% M' i0 n5 u" E
/*                                                                          */7 |. W. f5 o: Q. g- k, s9 X$ @
/****************************************************************************/2 ^/ r& z0 s9 p: M3 d
int main(void)- f7 ]0 u, _0 N  e. T7 g
{  ], a/ V; z) F1 S5 w/ e- R
        // 外设使能配置5 Y! a% D; d% `! |+ T
        PSCInit();' K6 V" m' R' w& [  \$ b
% O, v; M8 @. _: I0 {& m1 T) P
        // 初始化串口终端 使用串口2. j; W( _9 ^3 h& Y) @
        UARTStdioInit();
7 M6 q, E" I- V* C  s6 g       
4 D$ R3 T" i2 l% C& k% B9 U$ O        // GPIO 管脚复用配置
( g) f. I6 S' S! A        GPIOBankPinMuxSet();
5 |9 _; n) h4 C" t% Q
1 J7 o- J0 g3 u" S# L7 ~2 c7 B- W        // ARM 中断初始化5 e( A: [" O# j& V
        InterruptInit();0 f' v0 T7 T) \: m( D
% O  G) u* b1 ]: H
        // PWM 中断初始化
/ |- A% w; |8 _' K/ ]- Z1 x        PWMInterruptInit();  V* m& Z( l, f6 w) y% }, Q9 P

3 n% A# p; r, r+ l        unsigned char i;
% Y: _) c$ ]' \  z+ m- M$ q        unsigned int j;
- h2 c& v4 Q' ?* V6 j# }) S- [5 y1 O5 B: n% F* B
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
9 J- {# k- V) W% Y/ x4 a        UARTPuts("------------------------------------------------------------\r\n", -1);9 u5 P& W. C) Z7 u& s- X
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
9 b4 `8 H! n1 r" V% v9 x1 `        // 产生波形
  X6 I1 J% d- G) z3 n# M& B# X9 u& \$ I        PWM1ABasic(25000,50);
$ R) Y" ]  a0 V2 C2 v: ~$ z$ g7 |: P! M0 }) B" u$ t: z: X
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);, ^& Z, X9 y5 l5 O# c6 K( ~
        UARTPuts("------------------------------------------------------------\r\n", -1);
. g$ n# [$ z# j* r$ ~! T+ i. q2 L+ e% v1 ?( q

  k5 @- W1 h6 D7 I; m. h" @$ Q
# L9 Q; W3 z  r3 \& C: r        UARTPuts("------------------------------------------------------------\r\n", -1);
8 ]) _; ~- ^" `/ O! h        UARTPuts("                    C6748 ECAP Test\r\n", -1);0 }0 ]% O6 o1 W% V6 O
        // ECAP 捕获初始化
$ P3 W! V: x* p7 o: N$ ?+ k        ECAPInit();- W) @2 X* Y& H8 ?+ b! v
        UARTPuts("Initialize ECAP.......\r\n",-1);
9 \9 E! T3 ?6 G8 w+ d        for(i=0;i<5;i++)6 c/ u: \& p0 h
        {# g. z; C0 T. S- M) k$ o/ s
                    for(j=0x00FFFFFF;j>0;j--);            // 延时; l( P- g) v) x  b& w5 ]/ V" J
                    ECAPRead();
5 @$ w8 b' c1 O) D1 V1 w        }
/ m: [  O8 k8 m' u. o% }        UARTPuts("\r\n",-1);, x* a' U# @& d5 v/ P) `* }/ q
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);6 ]  S$ `: v  d7 x8 b8 ^
        UARTPuts("------------------------------------------------------------\r\n", -1);
* B0 W9 A! m7 `$ O4 H' l$ e' N8 u& k  a' p6 a7 F' t, ?
        // 主循环# B( o& b5 Q. h2 n( j% P, r
        for(;;)
% c! X7 L) u0 j3 N        {* y/ p3 _7 y: h4 G

5 ]  a, U" H8 I, R7 H& V9 L        }, r* @/ w# O8 @5 p) @
}
/ |6 m: X; i9 ?6 ?8 V
2 d7 q) Z4 H/ W/****************************************************************************/
5 I4 r: i* T) r3 U' \% c% Z' F/*                                                                          */3 K( A4 T6 k7 \) O- Q6 l$ t) e) F
/*              PSC 初始化                                                  */
+ k1 a0 |) d) h/*                                                                          */
( F* k6 u2 v( D- ]/ O' o/****************************************************************************/
  a' w  @5 b& J, I: tvoid PSCInit(void)
7 `9 C* L2 W5 H{
; |) u! q$ k, k7 F; c3 u/ u        // 使能  EHRPWM 和 ECAP 模块
/ V6 E! Z2 G% k& s" F        // 对相应外设模块的使能也可以在 BootLoader 中完成
% A, B" d  W; c; F) g, q- e; T    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);. b0 ?0 z3 n, C5 u$ @
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);5 ?% a% S  I; C8 ]1 f
}% L' d' U5 o. A2 n1 p0 B  _

3 R* J1 \: e. h/****************************************************************************/
" N8 o' A' r  {+ _3 ~/*                                                                          */
0 \" `7 T! _2 e7 [/*              GPIO 管脚复用配置                                           */8 J7 F. b- c5 d; N' M& o
/*                                                                          */
5 T' O+ ?- E3 T/****************************************************************************/2 j- F5 g+ A& N; F* @* t  _
void GPIOBankPinMuxSet(void)  o; M. i) r0 R0 X+ ?& v
{' f" i  U. R& y
        EHRPWM1PinMuxSetup();0 C" B7 Q. k6 c( F6 `6 I

+ s. o3 ]; k8 n2 g( z8 h        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
: r. E0 j( B) ?' g; _9 V& ~        // 作为捕获功能时管脚方向为输入
# f7 D6 I7 ^1 P/ S; L0 z$ u- C        // 作为辅助脉宽调制时管脚方向为输出$ z% K- m$ r7 l: \% D) J( M  m+ S
    // ECAP2 / APWM2
$ n; k- [1 |* |1 {        ECAPPinMuxSetup(2);
% S8 c/ B0 j* w/ I. J+ i+ f( K+ S& f# g! a; K8 A; M* D- x1 C
        // ECAP2 / APWM2方向设置为输入
" G. P& W) m& q; F        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]3 c4 \) d8 Y% q. G1 B$ F: H0 }8 r
}
( H0 Z5 h' @. t. y1 q& t
' s, P+ t  _% V' k+ S/****************************************************************************/0 r3 _6 V8 Y* b* H
/*                                                                          */; c5 q: A; Z1 S5 i" x$ |4 G
/*              PWM 输出波形                                                */
1 W+ n9 A' l0 a+ g" h/*                                                                          */
5 A4 u+ a& \! l+ Z/****************************************************************************/
1 o6 `0 L3 W0 }1 z; ]4 Z! _void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)* Z& d2 \" k8 e; _4 [. v1 R& y
{
* I" r. |. q9 B4 V) |    // 时间基准配置
* |! f; @! K* z4 ?/ Q+ v' I, c    // 时钟配置( H& P6 E4 {1 {5 d$ p7 S
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);$ W7 ]: d2 A; `, D" `5 i7 m, a' E

, N$ e. E3 }( {0 ?! g" K& s1 V. ]) e    // 配置周期
% d* `3 N/ n6 z" e    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
6 @; H) @7 i8 v: g! q" N                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
- L4 c; W) c6 J! F; B9 G
# g+ p' j1 g2 o* ^5 ]  W+ V    // 禁用输入同步信号$ o* T# R" m! Q& m6 _( B7 I
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);# m  B, T1 Q4 n* P; B% V* }
2 _4 Z8 K0 I1 Y% P$ p/ Y2 n
    // 禁用输出同步信号
  ]" N/ Q& J' Y    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);# V1 E+ o% I" _+ N

+ I' }  n: l; X" D    // 仿真(DEBUG)模式行为配置
& m' U% {( a. z+ r; W4 J8 a    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);2 t3 S+ L, P  Y6 P( s4 B+ {

3 o# z% q, I  |, ^    // 配置计数比较器子模块
/ _1 z6 e: a2 b    // 加载比较器 A 值* ]# Q% O' X# }( [' H
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
0 I+ R  I: d; s9 E                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
$ i- g$ L2 D8 b- F9 L4 {! }2 p( p4 h+ w/ Y. L1 k. h
    // 加载比较器 B 值( b5 N) ?9 u0 S/ m( J
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,! V! F+ d( x" o! y
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
  h; v8 i. o# w+ x( N5 T3 r. |( a: F8 B) I9 }; @) Y4 x  m
    // 功能限定配置(输出引脚触发方式设定)
6 `* L/ }; O; a' h    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
; `; s2 y: ]! U$ O9 _8 u! f+ P    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
1 w8 ]8 L+ T" m5 f% a& B/ V  }6 \3 ^                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,5 \; k! N/ }; `8 @9 ^, f
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
& D1 s6 a/ i7 m7 R" Y1 r) j
9 w4 `* j5 f- ?/ _; x    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
% H  {2 m# U- H; T, _    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);1 H& L1 u! ^# T% P1 E

- L9 N- ?( d: ?- @    // 禁用斩波子模块0 W8 d( ~2 k) J9 @
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
/ [4 H3 ], B; H8 A. o
- ~( C5 Y7 R& q9 {: Y' I' Y    // 禁用错误控制事件
; |* t7 P+ o5 R    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);6 z( d, T  |2 ?+ U) ^( @9 [
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);1 D4 N2 k$ c% Y1 S0 H, @3 O

* S/ B. d& A1 r2 M% g8 d: D    // 事件触发配置
: ?2 m. X9 w" p3 a" ?1 ]    // 每三次事件发生产生中断  ^8 [+ l. q( K: K7 L+ U5 s
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);1 x- T3 Z% L+ Q
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件9 U- o% D8 L: P0 ]- I
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);+ r$ B2 A' r& z  r
    // 使能中断& A4 M9 B$ N8 C! x' {
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
9 x. s* g2 x6 s% `* k* n3 V8 y2 L7 y
    // 禁用高精度子模块
+ a* ?2 {' I4 A1 ], ^0 ?' k7 W& S    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);" [% K' F3 B3 s8 t$ j- w

; b: n* {" a% F' ]- X    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
- q/ t: }# ?- s5 D6 n}
! e5 J4 o, Q/ h4 V% k. }2 O. O# _! q9 z4 ]! w
void ChopperWaveform(void)
1 |; O  g* v3 s4 a; q{+ U* ]: I7 l/ b  x$ J7 \% N5 I
    // 50% 占空比; P. G6 ?0 ~  X" a* J
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
6 {$ c/ ~3 c4 C    // 4 分频  f( _: ~( a+ j5 e4 u% t& _
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);- ~( l! s& N7 P
    // 单个脉冲宽度8 ~( }. g" Q& ^7 n
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);2 M- [5 j6 D% T% r& W1 Z
    // 使能斩波子模块
9 f+ W% J# D5 T5 C3 m    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
: w! B0 H, B4 E1 l4 w* B3 f}5 {) P- v( `' x2 I) S
+ p/ n8 u* r9 q9 G
/****************************************************************************/
$ o% R: e' P& x( ]) y( c: C/ c/*                                                                          */
/ ]& k' h3 N' }4 g: X: y/ [5 b/*              PWM 中断初始化                                              */1 t0 N; [2 @8 J% c5 X
/*                                                                          */0 y8 X7 s  e5 E
/****************************************************************************/! G+ @5 U8 R* ~* C
void PWMInterruptInit(void)
+ J( @9 f  I, X( M$ L9 l/ e# m7 g{
9 q0 G" ^# ~  M+ E0 {9 S4 }( o0 \, m8 ~+ [        // 注册中断服务函数) U' Q0 w  |: ?+ l. \
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
* V: N1 C2 e/ {% h4 ~4 V3 x3 ]9 n; @        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
5 g; f8 j4 _; b: f5 d" t+ v9 B$ T- k0 r2 a4 n% c) N
        // 映射中断  S4 w$ y, q8 L3 P% Y+ n
        IntChannelSet(SYS_INT_EHRPWM1, 2);8 I8 ]+ f, [9 K4 k& ~5 A. c
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);+ i( ~$ m- s' `3 U

, G% ^( w- C( Z8 s$ J        // 使能中断
, J9 A" f; m  B! x! z        IntSystemEnable(SYS_INT_EHRPWM1);
  y+ X4 c- E7 O. R) ?        IntSystemEnable(SYS_INT_EHRPWM1TZ);
7 B% V, t# R6 t/ i" H; u) q}
1 b: e2 c, l( l* Y6 T7 s9 P0 J9 N
/****************************************************************************/
/ N' ~& _+ Z. s- j/*                                                                          */
% L; E. \7 _' T) e/ j/*              ARM 中断初始化                                              */
4 _4 N( `, q( R6 T( E  W. ?4 a/*                                                                          */
' _. w4 Q8 D& A1 x3 i# N" _/****************************************************************************/
" {- b) V$ [0 n( F6 H6 l8 c9 _2 P7 f; Gvoid InterruptInit(void)
/ B! w- W2 _) G; Y2 y{4 p) d: B) `3 L, \8 Q  Q
        // 初始化 ARM 中断控制器- @/ }& Z- U* s% V" g% h: X1 x
        IntAINTCInit();& ?; k8 ~7 M' I. i5 g5 i1 O3 Z  m
1 q+ L$ d6 R* T& p
        // 使能 IRQ(CPSR)6 _3 b5 X; o, C& a: U- J1 [: M
        IntMasterIRQEnable();
& _9 ~7 F1 \+ `/ M
4 V) {& l3 E  A        // 使能中断(AINTC GER)
& h% k1 w4 B. u7 }/ A0 ]( Z        IntGlobalEnable();7 c$ ?# z; g8 @" B

7 |# V' U; Q" n9 Q        // 使能中断(AINTC HIER)
" u' B5 B+ Q9 a: K5 ]" L        IntIRQEnable();- ?( `. h; W* m
}( F) o4 [: ]7 Y% \/ t8 Q1 ]* Y4 s
3 ]# Z$ q1 k8 o" e

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/
/ ?$ `2 h/ q7 ^8 o$ `# h* W/*                                                                          */
4 S% o$ ~. b6 ]; j% ^" T. a/ R5 }/*              中断服务函数                                                */+ x& y  R" k  X. y8 b* @
/*                                                                          */
, V! Q9 D- N' b- m  ^, l/****************************************************************************/
, F0 d0 N: q3 Q4 \; P; y: A7 gvoid PWMEventIsr(void)
: h$ v# E  Y" }{6 ~& O# ]0 [& K2 P* r
        IntSystemStatusClear(SYS_INT_EHRPWM1);  m) r! v$ R) @6 @5 l' Q
7 y0 ?% K( \: `# L$ o
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
0 K9 D* \0 b; z9 E+ K% F}' J# Q9 ?) x/ ]: ^7 {2 \

4 ^8 D6 s& @$ Y3 Fvoid PWMTZIsr(void)
9 t2 c* A' I# m1 P, d7 S{
- j/ w# B+ A9 V/ s: m# |        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
. {. l6 K$ w6 c0 M. E$ G
3 T1 F& @- o0 W    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
: V  s5 E, b+ ]# ^* h, V/ Z}; @) C( p) F, ~

+ O: v) o3 W$ Q' b" I/****************************************************************************/
  e8 O$ I+ S+ N0 E2 {: ?% a% _  a( }/*                                                                          */
2 n: U, g$ S( g- y$ j! u6 }1 M+ t/*              初始化捕获模块                                              */
5 F! ^1 m. X# o2 {- Y+ O# z, _/*                                                                          */3 D0 U9 Z- a4 f3 p
/****************************************************************************/
) N8 G6 e1 f* D/ @2 ~% Yvoid ECAPInit(void), s( y+ u" Q9 g  [
{
- v8 l/ D4 X0 Y- z3 Q7 R        /*-----设置 ECCTL1-----*/- C; M5 l) ]# i3 r8 J, t' Z3 m
        // 使能CAP寄存器装载5 z& x2 s- d, W1 H
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
3 j1 g, o1 d! H* H. A        // 设置预分频值.
( p8 q8 K- p8 |% d* w$ T        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
# z2 q- n9 }' i8 F# I4 H2 f        // 上升沿触发捕获事件4 s" }7 D* m# V5 F& B6 {. G
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
# M/ O  ]$ d4 ]( m        // 输入捕获后重新装载计数器值.% |  |5 e9 j6 P# y
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
% {0 d3 q( d7 }3 l( ]8 ~3 c5 Q* i4 g4 T; b. S% n4 _! I  W1 r" M
        /*-----设置 ECCTL2-----*/
* `$ h: n2 ]* Q# }  g$ Y# ~        // 连续模式
8 q* L6 \6 z+ y1 N        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
* Y/ E  ^  T0 Y3 q4 z/ h" x        // ECAP计数器TSCTR持续计数( s# h' A" k- C, K
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
( ^  s4 o' n) w8 ?+ Y( r        // 禁用同步输出和同步输入
- \8 y0 `' B4 r$ d- p" [9 s' L        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);* t! z0 x$ R3 f) A5 r/ T
        // 配置 ECAP 2 为 CAPTURE 模式: _4 H" j8 W: w- @# L
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
% s% f! T$ K9 ?% k- l& b8 p
" t) n6 i2 n5 m5 R5 v        // 使能中断
0 k7 k9 O+ ~7 P6 Z, [) d4 U5 a+ B# _//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
( a# l* Q: g5 o8 T}4 d& Q0 g( q" B

$ d3 U1 K! j+ R) i( H- w5 W# X/****************************************************************************/
8 d) D8 [, k/ {& W8 Q" v/*                                                                          */
" b- h% B( Z! _* @4 z; r/*              取得捕获结果                                                */
3 G) w* n. {# G/*                                                                          */1 N; h, [$ W6 y
/****************************************************************************/* ~: }5 s! }2 X$ f$ d
unsigned int ECAPRead(void)7 V/ d. {, T6 y$ G0 w8 j6 B
{) [# X0 i. d+ w4 D. s
        unsigned int capvalue;
  Z2 }  `$ X1 P( y7 J+ h        unsigned long frequency;8 k: g# w7 J$ H3 w" ^& ?8 q

- T/ [. v0 l8 @) _0 j6 |  A        // Event1 中断标志; R0 D1 u. m7 M- ?5 ~: I& ^
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
' B- M) `: c6 m/ Z        {
1 y9 H# _5 a4 C& i( q9 ~                // 取得捕获计数
  O& `9 Y! s* F9 q" w                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);7 S; W0 s: s1 ]
                capvalue = ECAPResult.cap1;2 w* [7 A  K: E: a

: g5 x6 Y& f5 Y7 D/ P+ [                // CAPTRUE 模块 228M 时钟主频% {' ~/ N' G2 |9 }! @2 A
                frequency  =  228000000/capvalue;
7 S; D: Z7 i  a7 F6 R3 U* k. z4 A                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
7 G1 O4 f( G  w% J% m" }
$ N8 J8 t  N  p: ^2 ^; N5 R, `4 i                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
4 I7 w: g7 h. e5 n7 r' g//                IntEventClear(SYS_INT_ECAP2);
' }6 A; A- U6 p4 d( }/ V        }8 J6 G. J9 W" b
        return frequency;
/ f. u) w; S' C4 f}0 @# I9 L: _  D- x4 k! A1 d

作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
+ R$ x% f8 `0 v( Y3 B; E$ k" t[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