嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
; m3 n2 M  ]5 x. M
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/. e4 q0 V' [% {( o
/*                                                                          */5 x) y; M* a$ R% I! E1 }
/*              宏定义                                                      */% h% T0 b5 u, T
/*                                                                          */
/ |% t0 F% P/ A$ g" F5 F  @  F/****************************************************************************/
8 A: C# Z. t8 u/ b// 软件断点1 {6 o- |& e$ R
#define SW_BREAKPOINT     asm(" SWBP 0 ");: y& d( A7 G8 r, Y! @$ o, j
6 ~. f- p9 Q0 t" F, A4 W2 G) Q: y8 ~
// 时钟分频
: ^1 j/ _% h; R. N% E. ~#define CLOCK_DIV_VAL     2288 R# H( X" D" e4 d; G1 T
- o. G% c, G4 O4 u; P1 h
/****************************************************************************/( X! J: Y3 X2 V# W1 a( H- w  t
/*                                                                          */3 R1 y$ N- b+ u. u3 f
/*              全局变量                                                    */
. }: K8 u+ ]) {7 K6 y/*                                                                          */
4 V4 Q9 L2 A5 w/****************************************************************************/( }" L% Z# ?" M' s
ECAPCONTEXT ECAPResult;
- j) N' p% [# ?( D% O- h+ y- {( s$ s5 A$ G1 P2 Y; e6 C% m
/****************************************************************************/
) v% n& A4 c1 j& ^/ t/*                                                                          */2 n& c# K# X3 `9 V& n' o$ \5 o
/*              函数声明                                                    */- b* Y/ D. H1 L: c% {
/*                                                                          */! B5 S2 J+ P1 j0 ~
/****************************************************************************/
1 G* S, _$ v, v* k/ s7 O0 f2 a: |// 外设使能配置
4 v5 R9 ~% f: {3 q8 y  y! uvoid PSCInit(void);
& Y9 y; u( N& v7 x; Y* K" k( ?, u6 f7 z7 z# [3 ^
// GPIO 管脚复用配置3 L1 |* _7 \5 Y2 n
void GPIOBankPinMuxSet();
' V0 n: q  U/ m9 R( }
) w: F# o  ~, \& N- C// 产生波形$ C# i, W- J6 r, e. v6 k
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);$ H+ n& m# h& j: j2 I9 z
void ChopperWaveform(void);# ]5 j8 S+ T2 Y; h

" G* X  ?& \; X* @: L// ECAP初始化和读函数. n5 |$ V' i6 h; e" H
void ECAPInit(void);
8 _" C) [1 F, q8 v* y' ~) ]unsigned int ECAPRead(void);
# `# D( `" @: }' M& u3 o' _. u6 p  u! D5 f5 m. M. Q- P2 s: ~3 D
//ARM 中断初始化
) G3 M. j7 S% i  p, H+ v5 ovoid InterruptInit(void);; h9 W1 _, G4 ~+ V3 `# a

" l' |+ D, ]4 G7 i3 F; Z// PWM 中断初始化) R  Z$ K, c' j& k$ ]6 z$ L
void PWMInterruptInit(void);+ d) r9 q2 ~$ _+ w) X; l
// 中断服务函数* V9 S( e* L$ A
// PWM 事件$ Y) [0 ^$ b5 O: n8 B# S
void PWMEventIsr(void);  B% I& y4 Z; v1 _4 I, L
// PWM 错误控制事件
. Q' c% G5 j5 I- L2 a: Z, Avoid PWMTZIsr(void);
& T3 E# F  _1 H. J
8 U  p) h6 x5 L( J2 k( h8 o/****************************************************************************/
: [" p- n& y0 e' _0 m) k* |$ u1 K/*                                                                          */
# L0 b, F* n5 x* b% q/*              主函数                                                      */
) H" p6 _- ]; y$ E+ w3 z2 @/*                                                                          */0 q5 w/ f# ]4 I. f, a, k
/****************************************************************************/% ?- o! t3 A, c" N! @3 m
int main(void)
3 o9 K+ B% J( b* Z% o1 j{% r0 ]5 B/ l" C! [
        // 外设使能配置
( U! A& _* \2 b4 H        PSCInit();- c. {8 J7 s- \% k2 L, ^. W3 D
1 @$ H/ Y" v% \; q
        // 初始化串口终端 使用串口2) W  I' z# p( [# S, n8 F
        UARTStdioInit();
( }5 b) ~2 ]% ~1 r$ l       
# x" ?* S- l- J9 L4 C- a        // GPIO 管脚复用配置
7 v# l) p( S' @( H+ |        GPIOBankPinMuxSet();# C; x  S) _; w2 d: k
+ f8 _% M' W$ U' d) i, a+ @6 t# ~5 F
        // ARM 中断初始化( U8 \( k: \2 M3 }/ p3 c
        InterruptInit();
2 _* F( }+ J. b' l- \% [, ^. v+ D4 P4 u
        // PWM 中断初始化- g3 Z  f7 `  L. n
        PWMInterruptInit();6 i. O9 J6 B4 F7 d) A2 ^# C
, c2 v1 a* c) }5 a. ~- S
        unsigned char i;! I2 T- U+ J4 W
        unsigned int j;
/ ^# d( [3 C4 q" k7 @7 @0 m
- j6 F5 t2 S2 S8 T        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
5 u4 p1 ?$ C0 {: O/ P; V* W        UARTPuts("------------------------------------------------------------\r\n", -1);( T: D& I# _% N7 R3 V
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);- M, Y6 A% C7 H& k% ]; ^
        // 产生波形' e* D5 u& n6 L
        PWM1ABasic(25000,50);
1 {5 u$ Y/ W8 M1 {& d0 X
5 G7 B# ?1 G- ~, I: ~& j% d        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
4 U4 y' Z4 ^( t        UARTPuts("------------------------------------------------------------\r\n", -1);
4 j9 O- g8 ]: @& p7 u" V
) `: C/ Y4 y2 Y8 T+ c4 j; ?% @: g" D0 C# D: r: ~& y

  y+ c" T0 G: U8 Q6 w" q' c        UARTPuts("------------------------------------------------------------\r\n", -1);& |- S  ^1 s: g$ \5 N5 j
        UARTPuts("                    C6748 ECAP Test\r\n", -1);
! J% @/ F+ d4 V& s4 d" n+ L        // ECAP 捕获初始化
" O% B9 x, v& q2 `7 \        ECAPInit();
6 i0 F$ ~) t3 d9 _" E1 }$ {        UARTPuts("Initialize ECAP.......\r\n",-1);
0 ?5 R/ `2 \/ A7 l/ f. Z        for(i=0;i<5;i++)& R" c7 I1 m3 Y+ ?
        {
) c$ \' I* U. W5 F% u                    for(j=0x00FFFFFF;j>0;j--);            // 延时
' `: n0 n  \9 ~- k. x$ b" H. {! ~- _                    ECAPRead();1 h! z1 O3 h% x1 Y; _! S, p  m+ C0 |
        }) R# \( U0 U8 A) m1 k. C8 D0 I3 o$ l
        UARTPuts("\r\n",-1);' L' b( b* n# R
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
4 ]. a$ f" o9 H, e8 O        UARTPuts("------------------------------------------------------------\r\n", -1);
. B  M8 o6 V. [$ G, P: {- {4 Z8 A! B! N9 v& k" e+ L
        // 主循环
/ o) U8 \' n$ k! \* [' D% w3 Y9 {+ d# a) D        for(;;)
( v8 i3 E, J1 ^0 W        {$ i  i# E: q! i
' [  G* F0 g" E* i; U5 M
        }' c+ n  Z& l/ |# G" E
}. u* t0 ^2 s7 [7 Z
/ u2 w3 s% W( z
/****************************************************************************/! c- w0 \2 n( v! q5 s4 [
/*                                                                          */
3 r+ A: h; p! B: S: X* T; z. V/*              PSC 初始化                                                  */
# X: [, ]! p2 F8 H1 U/*                                                                          */
  N' u9 x1 j1 t& V" n; q( g/****************************************************************************// \+ r2 L: G, j0 H6 [* n- p0 g. H/ Y
void PSCInit(void)
5 y- M4 P3 I7 r- N{
; |% e1 D; K, P4 C/ r2 O9 f) B        // 使能  EHRPWM 和 ECAP 模块1 n8 `9 C9 k0 S7 u" i' j# c3 }: U$ u
        // 对相应外设模块的使能也可以在 BootLoader 中完成7 C: C/ D: }7 b9 s  F, A) _9 j3 F
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
. [) B# A% U. m# e* ~( N: P- l; L    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);- {, m1 S2 d0 j: Y( ?
}
) r% M) D* O; U% |
8 w% p1 |7 m" I# A( b* J/****************************************************************************/! C8 \. z. R& \
/*                                                                          */- Y6 U4 Y% g: O
/*              GPIO 管脚复用配置                                           */) U& l0 O6 q0 m  W) L
/*                                                                          */" J- E: T# ?4 k9 G
/****************************************************************************/
- h/ e! m( d  S1 E* P8 s8 Pvoid GPIOBankPinMuxSet(void)
2 E# I- N  I5 q. y6 d- ^3 |{
* S- h3 E; S* D        EHRPWM1PinMuxSetup();
* s& d8 k+ q3 w
, F. A  @! R* z2 r9 g0 x        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
( g2 f- U" a$ d* V2 {        // 作为捕获功能时管脚方向为输入
1 ~% C7 f6 L0 J: q: Y        // 作为辅助脉宽调制时管脚方向为输出
% M2 M( }9 p2 P4 |; r' N    // ECAP2 / APWM2
6 j, V9 z9 L) `- N7 q8 k        ECAPPinMuxSetup(2);4 ?: G1 T$ t. A8 S3 n  D' s# r

. L: P$ h% J5 ?1 {. h# x        // ECAP2 / APWM2方向设置为输入9 c7 C/ `0 k) _8 r3 f
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
( |5 x# p: K# M8 S1 x" k( S2 s3 M}
& }" c, |/ f0 |1 e  P4 `& r- U* }8 f( x; |: H
/****************************************************************************/  g' S2 w2 R! z2 M) A
/*                                                                          */
5 I3 \' a- G4 a9 U7 z/*              PWM 输出波形                                                */7 `$ D4 G- N$ j# B
/*                                                                          */( E% u$ z' i  w7 T
/****************************************************************************/
) B; Z; \/ f1 S0 Gvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
/ f4 Q! T4 d. M0 y6 h  K{
3 ~! K" x! a0 {4 {" O    // 时间基准配置8 z5 @, l5 D* W9 Y* @3 f
    // 时钟配置. z& o0 T! @9 D4 f* ~
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);& x5 N* B$ z. ~) p- e

, U, K* y6 I$ q( k3 _- e# e. _4 I    // 配置周期
$ Y9 u, A9 y! `7 T7 z    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
9 W+ D" U' s+ V0 {, ]                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);; o  I. v1 r& @4 O8 C" v5 w9 i, X- D
# L3 b; U6 Y" ~6 [- A
    // 禁用输入同步信号+ n, J' g0 w, h  j8 A
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
/ [/ O- B$ F1 a( c+ X- k, x
# b! M, Y) N/ H* \# N- ?    // 禁用输出同步信号8 [  T7 I6 K3 K; s
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);. U% C7 Q1 X7 T' ~

8 r3 p/ ^' t7 p& m! r, L4 V    // 仿真(DEBUG)模式行为配置
1 v& F+ C% G2 s0 i' |1 \7 t8 C    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);9 N3 v+ J$ r3 j# h
' S8 C4 w3 W: \' S  g
    // 配置计数比较器子模块. L* l( K5 X) C1 ?
    // 加载比较器 A 值
3 x! v" x/ E! w9 [$ h  z    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,& {& k: D: J9 Y& l& e
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);- a5 j, r% r; ~9 f: t

- ]& z& x+ i: U5 s    // 加载比较器 B 值
1 ?7 U6 Q6 C+ z% q# @) ]7 g    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,; a8 d) y* H4 u+ V
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);+ T' ^) f5 z! l0 M- H  H6 S3 p$ z
( q. L; S- [2 C) ~( A! E1 V4 X
    // 功能限定配置(输出引脚触发方式设定)% U% c" N3 w) a. A) n& q4 X' ]7 l
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出- ]1 U4 Y% s% u7 U+ {6 u6 a
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,$ l3 X0 }5 a' |6 t+ S
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
2 e% R; X6 m  M* [                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
9 w% z+ X3 Q( ^
/ {  j1 e$ p6 b    // 禁用(旁路,信号直接输出到斩波子模块)死区模块# z! o7 A1 G- w' j7 q1 f: M
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);, X- r, b$ {  V* F
% L  D$ I6 o2 U
    // 禁用斩波子模块
& ]. c  B% a, q7 a. {    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);1 J5 h& X9 F8 \3 _' k% j
& B4 |& J/ F, g2 K& r: ]
    // 禁用错误控制事件0 c9 K- _; ?& I) }" H, g
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);9 u/ K' ^/ {! K0 F
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
: v4 `/ X7 H4 `% t. V0 B& L9 o9 x9 Z
    // 事件触发配置+ Q2 G. P6 n4 f; S( e' @' @
    // 每三次事件发生产生中断- L% ]. _4 i4 ~- Q& t+ q
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);2 B" U5 T0 x' z5 u1 C5 b
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
, S0 X, ^. c) n8 X" Z% P6 B    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
+ H6 w( T; s8 D% C, ~    // 使能中断+ w- H4 {- e5 H" [3 ]7 y0 F: ^
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);. X: _# _: J8 A
8 Y- T7 g6 S8 w
    // 禁用高精度子模块1 u2 x$ k0 `" S
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);1 J7 e% w3 |* }' I0 W+ N
: X6 t- q3 o& a" M' J+ ^3 ~
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
5 p3 v' O! `; `+ n/ o}
, m  m7 Q! p! S9 D: |2 f1 @" `" o7 U* Z! |1 q9 E, ]7 d9 G- c% n& g
void ChopperWaveform(void)
: s4 {+ f2 q. ?4 C  A2 w+ F{
( A. {1 |& ?, e8 N    // 50% 占空比" `7 |, S8 _2 ]4 r6 B
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);, Y5 N9 U5 A0 M- s/ i" q% l* @
    // 4 分频
7 L  }1 B: k% J8 D2 s    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);( j5 ^* \/ }, Q+ L" ^
    // 单个脉冲宽度
1 _" ^6 C6 ~9 g( z, f/ P    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);" k% k7 c* y+ L+ |( d+ C; j
    // 使能斩波子模块7 ?& w. L- K7 z) V4 I5 Q- X; m! w
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
4 \$ Y- `9 u! M6 R2 N}
4 V: E+ i) }* S2 v6 ?9 R7 d# B. X& Q. ~7 x. `- [( J$ Z$ V" I
/****************************************************************************/
4 Q) J7 \4 f  M$ q0 @. r( M/*                                                                          */
3 u' w* F% J- V. F% H5 a3 B3 C/*              PWM 中断初始化                                              */8 \1 b2 I6 Q( Z" |5 Y. K/ [
/*                                                                          */
: b, L) ~2 W: q; r/****************************************************************************/, L8 D. Q3 h/ D, f
void PWMInterruptInit(void)
9 T4 q/ O6 `  {$ g- X* u{8 O6 O' U+ O( F+ f
        // 注册中断服务函数% u% w3 n7 {: y7 e* l: T) O
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);! [/ ~" M' x/ J+ @1 {
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
" {1 F. B9 @5 Y
# {. R4 N  Y( C8 Z% z3 w4 c! w5 o        // 映射中断0 H  w) H" S( K0 D' ^. d
        IntChannelSet(SYS_INT_EHRPWM1, 2);5 G$ J# t% e" z& }! I
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
, N8 h" ^8 Y7 Y& ^6 s; o1 \
$ o% T+ c" w" Y# w, D( }0 g        // 使能中断
/ Z4 l, I+ W# O- ^  [" N9 `3 i& m2 }        IntSystemEnable(SYS_INT_EHRPWM1);
2 l" S9 |* a  |6 i' h1 m! k        IntSystemEnable(SYS_INT_EHRPWM1TZ);4 p0 w/ R( f; `
}
3 E* |7 r9 y, l2 y: }* E7 o( |4 F$ B5 U' q& H* u, y; Y4 U8 H
/****************************************************************************/9 |/ f0 ^0 a+ |# e7 N
/*                                                                          */
. h" I/ W$ b2 E* b' h/*              ARM 中断初始化                                              */
8 k4 p  W' S1 s( |' z$ z  u7 M5 I/*                                                                          */. C* k$ ]3 \5 b( v7 ?
/****************************************************************************/- i" E+ g! S5 X- I) G
void InterruptInit(void)" _1 E- f, p& l8 {
{
& O' @* J6 A* O        // 初始化 ARM 中断控制器
5 V/ @1 ?* S2 L# U! V, {1 n. a) Z        IntAINTCInit();
: Y1 u$ X3 g# D- @
' l% H8 a  P: b4 [6 u/ s/ C        // 使能 IRQ(CPSR)
" L2 E. l2 j; p& O: m8 U$ J- u        IntMasterIRQEnable();
6 V0 D: s$ `9 c$ S: l; h; B, l8 y& P/ X+ [* n0 ?! D$ C  C6 W
        // 使能中断(AINTC GER)/ i5 J- z$ ^7 p+ [
        IntGlobalEnable();' w' m* k2 i, N) b

  @2 Z$ z; a& c" b5 |4 N        // 使能中断(AINTC HIER)
/ Q' k' v) F6 C, P2 Z* ~6 z! E        IntIRQEnable();
8 U: U/ ~+ s/ I}% p# V8 `& ~9 J* R9 E% m( y

2 G8 k$ \5 d2 ?
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/' v( I( Y0 N1 }+ [) E+ U5 p
/*                                                                          */
) X2 F4 y" y2 t# V4 z/*              中断服务函数                                                */# ^4 d( h+ {9 k! `( \! {! P7 z0 Y( K
/*                                                                          */
3 \% \: M+ ?7 v) c/****************************************************************************/8 T2 J+ ?6 Y2 u1 |% y1 C
void PWMEventIsr(void)3 J5 D- v# G1 G5 R# f  M" B
{7 ~8 o  _. c- x
        IntSystemStatusClear(SYS_INT_EHRPWM1);
0 P$ P: q: y% W# Q" s) \# U: q% r9 e/ s
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
$ r+ R" h$ i1 a. ~$ S6 C7 }+ w1 x$ U}, i" W& n$ U( n% R5 J: q  e

- q/ k4 L  T4 F8 ^void PWMTZIsr(void)5 \# G" l' {/ ]% e
{
( l3 _) p& ^0 \+ g5 t# ]$ t8 m! Q        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
+ q! {9 W; ?, O
0 J4 f2 {2 N& t1 t    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
4 m3 B) K; z- z1 o: ]}# F2 n" x1 b, X
" T4 B/ g) T3 s+ h; \' T
/****************************************************************************/# [7 l1 |, e1 t3 H$ F' N
/*                                                                          */, g& s" C( b2 ^. C
/*              初始化捕获模块                                              */
# s1 _( \7 c; s- u  K/ D/*                                                                          */- B# e$ s$ p0 O8 x+ A
/****************************************************************************/1 R1 }9 i5 E0 |0 U7 w
void ECAPInit(void)
* j' ^* ~9 G8 D. s3 q; c{
7 B, m& {1 U, f2 N2 k0 s' p        /*-----设置 ECCTL1-----*/
  o9 O5 K& g# ~# s- k# z7 F/ j        // 使能CAP寄存器装载
' G" L% r1 b+ T7 y8 v        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);$ W; j+ f0 v( H$ {3 K( {5 h! G
        // 设置预分频值.
& M5 M2 t* P( P8 U/ S        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);" \" G( R& K& x8 M' n
        // 上升沿触发捕获事件
, H" ~: r% H* ]9 S        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);. q, B: p& X; U; y& c1 M; N6 h
        // 输入捕获后重新装载计数器值.1 s2 ?$ ^1 ]# n1 T4 b
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
* C, O  l9 [1 L# w- O+ Z
2 W# j3 U3 p7 m- X4 v        /*-----设置 ECCTL2-----*/9 b) K6 g4 d( |* N" x
        // 连续模式
4 I0 m0 a7 I) i( b( _6 q3 p* f* @        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
# d7 x5 D& p* b6 y! {& A3 w: _        // ECAP计数器TSCTR持续计数
  [' h7 X# Z  K' ?        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
3 a) }$ S1 O4 v% K        // 禁用同步输出和同步输入$ B* \) A6 h3 j! d% U. M
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);) v! G) \# o7 u" V  S
        // 配置 ECAP 2 为 CAPTURE 模式
  F4 a" j5 N3 x0 _# Y8 A3 ~* [        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);- E0 L' G) u- Z' k: w

) T* M. I) C) \0 [        // 使能中断
1 }' l( L  K* Z, {! _//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);2 E5 O$ u. S+ ~
}5 H/ A0 O! {/ L
% G( _) @, w1 d6 J. l1 e
/****************************************************************************/9 t/ t' z. w# H4 a( F2 n
/*                                                                          */9 Y: i3 B6 a; ]! f& j6 B+ f
/*              取得捕获结果                                                */
5 w6 v& H/ g2 @" `/*                                                                          */
/ a" I' q9 Z  e8 U" E% u( \, ~/****************************************************************************/
# K8 @& A% H6 m# }. o5 Dunsigned int ECAPRead(void). q1 f  g: e/ i. S1 b3 l! V: ~* v
{! ^, }; k! X* |+ x' Z( K
        unsigned int capvalue;
4 w. m& Y3 w# m- `        unsigned long frequency;% E9 h) u: d; Z8 B8 m+ f$ ~2 R
# z6 k- }6 t- E' R, M: m8 X9 E8 V. c
        // Event1 中断标志3 q* M+ q/ E# P) z* d5 b; L# c
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))0 i  |# \' O) U9 ~) m, G* T
        {+ ~6 j* E$ z/ ], B" j9 F( u! e
                // 取得捕获计数7 G2 K' C& m- b6 h1 g5 }* y& P
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);( R  x) f2 }; Z4 _. ~0 N0 M5 L$ I7 K
                capvalue = ECAPResult.cap1;
9 m9 \& o$ ^6 P8 n8 ]( y. A5 ]0 O- e
                // CAPTRUE 模块 228M 时钟主频
1 i9 w: ?" k( r1 f3 ~  h6 T                frequency  =  228000000/capvalue;4 r7 _0 O1 w, G3 Z" {
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);# C4 q3 L/ H% n! F! G4 k% M
0 b# c1 _% O( t+ j% x0 `
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);. t1 _" }- p* C" X
//                IntEventClear(SYS_INT_ECAP2);  E- L/ D1 d$ I. p0 J
        }
% K# F+ h' k& D& ~4 K  J3 ?. H& C        return frequency;
) l, C* `& O( ~8 ?; O}
0 Q' i+ {1 a8 v0 w8 e
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
( Z' w& T3 w: a# N2 g" e[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