嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
/ O! s" K; X% [$ l- l* ?
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
' ~( o- D& \  l9 O7 w+ e/*                                                                          */
8 U# f$ n2 ~( }% n3 T/*              宏定义                                                      */
% ]8 S2 M' W% F/*                                                                          */
" m9 B" ?  d( H# [& ~* e4 J* Q; F/ [/****************************************************************************/- R2 D# D4 x( O3 W# ?. l3 H7 }# W
// 软件断点
7 v$ l, |- P+ `#define SW_BREAKPOINT     asm(" SWBP 0 ");
7 _% r! n3 Y* P; `5 o* a
4 T- L9 r) x. E+ X2 c, L// 时钟分频
6 f1 `, u) B3 s; M' ?#define CLOCK_DIV_VAL     228, k8 E- S) Z* T
% C& E8 F3 _- @
/****************************************************************************/1 ~3 E+ W# f# b2 R6 B; |" D2 {
/*                                                                          */& d! Z( L) u$ L8 b+ `  D
/*              全局变量                                                    */
/ @$ v0 b% p+ c& B/*                                                                          */# a" @8 V! M, v: d
/****************************************************************************/
5 ]# R& K0 a9 m/ [6 a- q1 f) RECAPCONTEXT ECAPResult;0 h* S0 v% Q& L% \! w" A

0 L; q' ^! `! W1 P2 y+ `+ ?0 I/****************************************************************************/! M9 @, C# L' i$ ?9 u. r" V5 k9 t
/*                                                                          */
( i* C( M* }8 O) W. T/*              函数声明                                                    */
1 t; T1 f( G0 y/*                                                                          */* r8 N1 T6 ~0 O
/****************************************************************************/
1 l& G5 Q4 h) F9 t' _4 N// 外设使能配置# f1 Y( U& @9 I
void PSCInit(void);! H, B7 v' D! t5 O4 L
+ R( p& Z3 K% `) a8 j( p# y
// GPIO 管脚复用配置1 F' e9 P: r# b! g
void GPIOBankPinMuxSet();- Z6 O- X8 ^' g7 u; v
+ I; Q) k3 C, ]3 U$ T, ^
// 产生波形
) c5 |. ^3 I2 Y, j' L" o, Qvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
* U; ~5 C$ a! E) M' Y* `void ChopperWaveform(void);- n2 S+ t# h+ l; w  p" a, X) z
8 S9 A+ H2 L1 |: s% ?0 M# t
// ECAP初始化和读函数+ c  d/ i5 ~) B# t9 j# }3 G8 C
void ECAPInit(void);# O, d5 v* e+ h, |
unsigned int ECAPRead(void);: G$ F- j8 c4 P( Z2 F

* ~$ m- b. J2 }2 ?, E3 D0 Q0 t//ARM 中断初始化. o+ p* k+ C, Z2 j' ]7 ]0 `
void InterruptInit(void);! b; |- ?  y8 A4 `) S' s! k
7 p6 K3 l, R5 N% |! C
// PWM 中断初始化
8 u  i; N" c- A+ b& @2 Z! avoid PWMInterruptInit(void);) B4 C) x  j4 o! i$ X6 E- B
// 中断服务函数' b( Q' t  ^* W
// PWM 事件) o$ P2 m5 D* b+ l3 O5 A6 T
void PWMEventIsr(void);$ @3 ^1 B  G% u( L+ H
// PWM 错误控制事件* V5 C% v. t9 J+ t# Q& l3 x7 m
void PWMTZIsr(void);
3 _+ C6 a! |7 ~0 H) N
+ c( `  _' E3 J( [$ i/****************************************************************************/
' _, A1 K0 t% q8 U- C+ \) K/*                                                                          */8 t6 M) I' Z+ v! n8 z; ^9 ?
/*              主函数                                                      */
/ e6 l. K* a/ h- @/*                                                                          */
) H9 i- e. a- O$ R7 @; A( z% r6 H/****************************************************************************/$ M, j! L. M/ |" g/ I
int main(void)
) y( a- [/ A7 A2 j{# ~& L9 v) q& y# d1 E5 g+ P
        // 外设使能配置$ F$ Q! j- G* n3 B" B
        PSCInit();& x; X9 U) l& V1 l& o% {
* T; b" ~. i& w/ B5 m% ?
        // 初始化串口终端 使用串口2
1 ~2 u  v6 J5 ^% U  F3 K        UARTStdioInit();  u; E$ t$ B( i) M0 S
        # q# d7 K+ q; W3 t3 I
        // GPIO 管脚复用配置
6 q9 G+ ~: p) m2 p        GPIOBankPinMuxSet();
, g' M( D* D4 ~* \4 X* a1 l& B/ N0 Z$ Y! a
        // ARM 中断初始化: s" f. r* T( ?3 A- F, i1 h
        InterruptInit();
' @+ s7 w7 j4 t3 v' U% ~
8 a- u( K& ^9 G3 i2 H        // PWM 中断初始化/ F1 B7 q5 ^8 s& P! L$ B' ^7 N8 x
        PWMInterruptInit();* m, `* C/ b- x" b1 P: |4 G+ ]1 l7 a

; ^- c; E3 [4 S: x7 [- ^  L        unsigned char i;- |' o2 ^# h( I# h3 Q3 i6 b
        unsigned int j;
7 |" C# M8 J9 q- F7 \' u, l* G7 z  h1 Y
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);* z: _  u+ x% z! \. N
        UARTPuts("------------------------------------------------------------\r\n", -1);
  ?* X* h, n; K        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
0 ~! l9 y, _5 o/ R: M3 F8 ?        // 产生波形
6 Y$ R3 @' Z* V) k/ D        PWM1ABasic(25000,50);
/ ]$ n4 v: A( V$ V# }3 \+ U5 ?9 z7 u: T
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
. y0 C( p0 q$ R2 n$ [        UARTPuts("------------------------------------------------------------\r\n", -1);
$ J: O8 e1 m& v7 U$ w6 u& N' u* @  h, |$ G$ ?5 y% ?
8 v% w) j9 h) l

' F& J: R4 P/ E! w- c* \        UARTPuts("------------------------------------------------------------\r\n", -1);8 [6 Y" N8 D6 `( ]0 D9 a+ d6 U
        UARTPuts("                    C6748 ECAP Test\r\n", -1);1 |* i: ]6 ^. _9 q4 ^: v4 v
        // ECAP 捕获初始化* ~0 f& m: y, b3 G; q5 h- O! c
        ECAPInit();
/ h9 n) ?; f% i7 n# z4 H  U  I5 z! \        UARTPuts("Initialize ECAP.......\r\n",-1);
$ U* j7 ~3 I* `+ ~, T8 |- B! [        for(i=0;i<5;i++)3 G+ E& i+ b4 z3 c: k! E' {
        {+ q" b5 ^0 F' L0 O* f
                    for(j=0x00FFFFFF;j>0;j--);            // 延时
! d$ f& B5 r) s                    ECAPRead();( f3 |) V! M/ x/ O
        }, W- c, y2 j* n1 i2 A6 w
        UARTPuts("\r\n",-1);
$ Q9 ~6 r. Y* ]8 V9 q        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);" N7 o, o+ u$ |% I' g5 {
        UARTPuts("------------------------------------------------------------\r\n", -1);  |0 s; M  H, S) D: J/ x# {+ h

( r5 B5 I! Q: S5 W/ w+ p6 B        // 主循环
) f9 ?( Y4 G- H; w        for(;;)' v: P  H% O' ?, X
        {" \* j/ \- [/ `$ @) `' d& l' `

. [, E& W4 z5 I$ r        }
" y+ L5 O+ F# G, G) U1 e}
2 W/ s( J/ G: [
* v( c1 G/ i5 [& c  h& H/****************************************************************************/
7 r; C0 V0 o0 R+ e/ y, z7 ~# d/*                                                                          */
, ?1 u! ~3 C0 Z; W, }0 }/*              PSC 初始化                                                  */
  ]& n3 `! ]: G7 {4 [: k6 Q& V& Z/*                                                                          */
6 c/ l0 R% `" m/ Z- ^/ y3 D( Z8 ?/****************************************************************************/
' l- M: f$ c5 t4 F- m3 ]void PSCInit(void)* g/ N( K+ f) X' C* R: m: w
{9 z3 u8 f4 O. W5 s
        // 使能  EHRPWM 和 ECAP 模块
$ w( P6 K' q- M        // 对相应外设模块的使能也可以在 BootLoader 中完成+ m% k) l1 n$ E. N' {0 c" l6 J
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
# p, L% P2 c$ a. \! Q    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
* R4 s3 C* l5 A3 T3 n4 @( |" z}
4 R/ P/ {: c6 t4 Y2 U* r; P; [2 B7 b; n0 u; s% F% a
/****************************************************************************/
' @/ T/ p% m! B" ~: Z( ?/*                                                                          */3 b( S/ }" o) h& q7 w
/*              GPIO 管脚复用配置                                           */9 ~. I/ T7 h1 k, _
/*                                                                          */; _2 ]  m1 i0 s$ h' y
/****************************************************************************/
: O1 d& @" `6 j5 m- `void GPIOBankPinMuxSet(void)
& S; ]  R/ J, l& M8 p{- E0 X* f6 j6 V1 I& m
        EHRPWM1PinMuxSetup();
) m1 U: s; B7 Z1 ]. m. q8 {7 N! A0 w# `" J
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
2 h2 \- K# T% A7 j        // 作为捕获功能时管脚方向为输入
. U1 ]6 S5 X0 n8 u0 x# k* u6 Y        // 作为辅助脉宽调制时管脚方向为输出3 j. c6 s6 R* [/ o" b& D' T3 q
    // ECAP2 / APWM2
/ ]( w! H# U/ J4 `, r3 T% I. f' }" @        ECAPPinMuxSetup(2);7 W- C  f. G  O7 q& t- _
+ f- r5 H" X. L/ i% A1 s
        // ECAP2 / APWM2方向设置为输入
6 U9 G6 O0 }) N. U; J4 F1 u$ R        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]6 i; U- o! z. S
}* [/ d- Z& N2 [+ N2 e

$ U0 c# G( u$ p( F/ A  ^; T/****************************************************************************/* J( u9 n( s" F) F, g& U
/*                                                                          */3 y0 H; V$ P' C$ [3 D0 m' E+ @
/*              PWM 输出波形                                                */
5 n8 D, g  f8 R2 v3 T, ]6 Y/*                                                                          */
7 V2 Z. t6 G5 f; g( |4 v/****************************************************************************/
$ \1 f" z3 `, r; S$ u' q1 P9 Xvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
+ K/ \6 j( J% e{
2 r5 l+ s5 E$ ]" X/ [/ B    // 时间基准配置
, k1 Q3 A  X! ?0 g    // 时钟配置/ v, P! ?" t/ Q# F
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);2 ^- p* p" c9 |" o/ l2 M+ w
9 Z. I! Z* B% m# _2 @' j+ g
    // 配置周期
; ?! z: O& H4 G2 Q    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,4 ^8 f9 c7 \9 G. q, U/ [+ z. [& \
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
% Q) A  I: q& z0 B4 r: T3 t% t4 n7 R, h1 e! c
    // 禁用输入同步信号
- M3 I- S0 T1 M$ d* t  `$ s    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
4 A: m4 n6 P: m3 t% p. O* E8 p5 h. o: B% n, a: z
    // 禁用输出同步信号
* n5 _3 j6 \2 I( n    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
9 M; W* r! n+ I% J
' [- j# h2 o/ R! {% K    // 仿真(DEBUG)模式行为配置
7 p6 m* V9 Y' D0 C% p. o5 S& F, r( J    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
" v0 ^) S$ m* n/ W+ R" R
, W5 W6 Y0 V3 b9 _8 D7 D/ B' p    // 配置计数比较器子模块2 f( I9 V6 H, r9 c
    // 加载比较器 A 值! p; N& d4 T; c  j# l. p# U
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,0 _0 [% R4 C" ?2 }. ^* @; `
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);9 d& k( J' ?* h0 a' V
8 P+ F% k: ~6 [$ s' d# S& y
    // 加载比较器 B 值
, v; e: W' y& O; i4 o7 K. X    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,% T; r4 R, h/ d6 y  a, p# Y
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);4 H' {6 f' _( H" _

  K& d, `& Z' k, T+ m    // 功能限定配置(输出引脚触发方式设定)
. G& \$ z: o( n) K) z    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
; r2 C, W! s0 S2 z    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
1 F5 d2 ?0 v0 c1 L                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,6 b" }1 `. ?" |# q
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
( h  f+ S7 e0 b8 j1 E" a5 b
8 s( J: K7 O+ p4 v$ c    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
2 e. v. y: @1 y' v    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
! i$ o9 Z4 K' f- Q! x
- T: h% p! `7 ^    // 禁用斩波子模块( N) R% ?5 U1 U8 q: x0 \% d
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);6 G7 |& c$ T9 I/ C7 I

( F8 d/ \  P3 n' G( `  u    // 禁用错误控制事件
( P: z# o" m! r" ~    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);7 ~5 `7 R( q* ~7 ^+ E, m8 Q
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
; P8 Z# P0 ]: Y  C% v. ?) F( l% ]: E- Z8 w) G9 d; Y- R3 a5 U1 ~
    // 事件触发配置
( W2 y1 ]6 A8 x, v  j    // 每三次事件发生产生中断- _  S' ~$ h  u
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
; C5 f) M4 @+ w. X# L    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
! C0 ^) L. _) r8 e- X: e    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);6 G7 j0 @! ~, k" W3 [) w7 @3 x3 \
    // 使能中断
4 J; i% B; X; W    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
$ W' `1 G9 Z4 v4 |* Q; S% p( U7 E) F; D: f3 Z  a- Y  N: L
    // 禁用高精度子模块3 A+ g6 k: O: @! p
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);( U' @+ h- w% Q: v5 G7 }3 a

5 v: P8 q6 p! T8 r) R    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);( Y0 e' N5 o# i; u- {4 I
}
, i) f' Z# ?' y
' V% K9 h2 Q% H  c7 T0 svoid ChopperWaveform(void)
( W; }; t7 e3 S2 |! P% _{5 W1 d" Y/ W9 @+ b: K) ]7 Q
    // 50% 占空比% C3 b  \7 U! e
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
8 I" D% E; U7 a! M6 u    // 4 分频
/ u% }1 w" _9 G    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
* q4 |% `- O7 T7 X% X, ]    // 单个脉冲宽度
; k# W( S3 H; V" l( ^    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
2 ^/ K' a4 w+ m/ I3 b" H# @    // 使能斩波子模块
2 N1 I" Z1 r- C; L7 u8 @% n+ }    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);2 r# M# m! \' _7 N) C
}
, l: O* V( p5 E. H) z( F
9 g0 ?# E0 s- t- m" q9 F/****************************************************************************/
9 G. o; S$ r6 g/*                                                                          */! c4 B. S8 Y" K* m2 @$ g7 W
/*              PWM 中断初始化                                              */
# m, J, U5 D" ?2 d+ |/*                                                                          */! H( V* t8 Z" v8 c2 O5 g( L
/****************************************************************************/+ D4 Q4 Y9 U9 o; s5 f/ P' z) B
void PWMInterruptInit(void)2 `) p; y& b: V
{
" u8 a& @5 G5 p4 n; M, g; C        // 注册中断服务函数
% {3 _- \0 [  i        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);+ y& P4 C4 h' n- G7 x% o* a
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);# a- K: S0 o+ I" o6 o

; U7 w) ?9 Q; B/ X        // 映射中断
1 m2 w/ r5 F! y5 W9 K- `$ {        IntChannelSet(SYS_INT_EHRPWM1, 2);
( j) B/ J9 K) U+ f7 i        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
( w7 i( P1 s+ }$ h6 [! e4 u# V; L) [7 F5 K2 I' D0 C  Y
        // 使能中断
- w% j/ Y! D) D/ R4 L1 J1 Y        IntSystemEnable(SYS_INT_EHRPWM1);8 \3 K) V# }3 i2 K9 @  u; D
        IntSystemEnable(SYS_INT_EHRPWM1TZ);
1 W4 G- s- `$ |" |( N* t}/ F1 }3 n4 H0 t) N" z0 s3 J1 R

0 V+ [& o7 w" B/****************************************************************************/
, c: Y$ G6 q$ Z0 M8 o, A+ y/*                                                                          */
/ l7 C) g" s! b# J8 c/*              ARM 中断初始化                                              */, p' ~, }+ q5 M9 g& i! Q% W( f: S
/*                                                                          */
4 f" I4 n0 c7 z! {- l! ^0 q2 [/ s, u' T/****************************************************************************/
' a+ D7 q4 U( z) Uvoid InterruptInit(void)6 t; x6 [  T+ t  [* J( [) b# v
{
: y/ G+ h) u  o3 v9 C( n        // 初始化 ARM 中断控制器
4 ^% }! A- M7 v3 P, k5 i        IntAINTCInit();
" F) ^3 B8 b6 e0 w0 j- V9 Q/ R$ z% V  o" [, h( x9 Y% F
        // 使能 IRQ(CPSR)# {. g6 J* x3 p
        IntMasterIRQEnable();6 V& j( r" w4 T' C' @- Z5 L

; w* J0 u; D3 S& C7 }7 X5 Z# X  c: Y        // 使能中断(AINTC GER)/ Q2 H6 ^. r5 N1 W9 U1 n) L+ h
        IntGlobalEnable();
8 R5 y. a9 m4 n; i9 y3 \
( P0 }! M9 r# Y4 a/ k  K6 m0 ^: \0 z        // 使能中断(AINTC HIER)+ a0 L. p3 Y5 N# a  x
        IntIRQEnable();5 C( ?2 X1 ?+ A' R1 k- O& M
}( N. V. F( U8 {* q
# `' j5 o0 H% ]! \3 X! @

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/% J. ?, D/ ?! H. h( s/ m* m
/*                                                                          */
3 q: O8 g; _: y$ G- u" V  s/*              中断服务函数                                                */
/ E) c% g  a! K/ `/ A) r7 N/*                                                                          */
: J3 l2 H# Z3 G. }5 C/****************************************************************************/; O3 r: }6 G7 y  H  D5 z$ }
void PWMEventIsr(void)' V3 Q" b: Y- }- i6 o" F5 m/ ~
{
, s6 P4 S! h0 v; s        IntSystemStatusClear(SYS_INT_EHRPWM1);, A/ W" Y, h0 V. I# ?+ p2 @$ I

6 Z% c  W+ n$ m. P* q; [8 W    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
+ [0 `0 Y- S# ~. g. K}" S3 j( j: Y" c/ j6 k# d

* ?& }4 Z& ~; S( u6 _. jvoid PWMTZIsr(void)
0 u4 ]! {0 n- D7 w1 o( N7 L0 {$ J{
; c1 |, q$ r+ m& P  I3 \        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
/ `/ b/ ~5 |3 ^) L1 h, g; A0 Q( N
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
6 u( ^8 R" z' H/ m}
' A7 _# d1 h. V/ U+ F5 f$ D" i1 w+ G. x% R* h4 I7 Q( M
/****************************************************************************/
1 k' j0 z; F/ x/*                                                                          */
" {. _% x% W; v* t/*              初始化捕获模块                                              */
' r0 u/ |; T# l/*                                                                          */1 \9 W5 a7 G; \& }
/****************************************************************************/
; ]: E+ r4 {- P2 F1 Pvoid ECAPInit(void)
% y7 n& D, `: |{
+ X' I% I) k# A6 T5 H0 j        /*-----设置 ECCTL1-----*/- v! g6 Z, b! K3 ], M4 j
        // 使能CAP寄存器装载; i1 S( u9 O7 @  Z1 [! X+ @. }) }
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);# W5 L3 p0 r( ~2 I
        // 设置预分频值.
  K4 F: v$ c  {' T+ s7 @        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
: i# e/ k- F7 g1 a. K* I' `        // 上升沿触发捕获事件* e' a6 R8 q1 O7 H. z/ s( m
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
/ ?* A: b( e7 _! X7 x2 g        // 输入捕获后重新装载计数器值.1 Z( ]* r# p; f: W1 v6 H
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
* Z' ]! w; j7 y# t4 @/ o# m0 r: u% f& V, k. _% J# r/ f% t
        /*-----设置 ECCTL2-----*/: H+ Y! X( I; U6 w) c
        // 连续模式
. N  ~' ?1 N6 S- V8 v* _        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
% x$ _6 l- ~( {4 O7 Q; X        // ECAP计数器TSCTR持续计数. P; H+ ~& t' \) t! ]: z( J6 a6 S
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
: c# B7 ?: o! L6 @9 G' F        // 禁用同步输出和同步输入8 u2 ?- N- j/ s1 b5 }
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);- g$ {2 r4 D2 X0 @$ ]' W
        // 配置 ECAP 2 为 CAPTURE 模式
( P8 h2 \, @- E2 c: K+ a' ]        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
3 t$ n2 @6 A) D! ^! p: o5 p
0 h( i+ g) }7 u# Z: }2 E( S        // 使能中断
& E8 f6 O/ r+ ~! }/ R/ u. S//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
  O& X( T% {1 g3 w# e% |6 j3 A}
$ ?0 L* X! L0 Q6 J" @% h. C
/ u/ s% k2 K, C9 S% G" x" Z/****************************************************************************/
6 K) w2 ]. M: Z4 p% B2 D  B2 B0 {/*                                                                          */* q0 m! G9 p' e
/*              取得捕获结果                                                */0 u7 l- y. T5 L; x" @2 G
/*                                                                          */
2 X. u2 ?$ m  D( {. O. Q/****************************************************************************/
$ _  {9 J( S/ R1 `unsigned int ECAPRead(void)
9 Z1 r% V& j8 S3 W( _- ~0 \{4 _, k+ Y% z$ \
        unsigned int capvalue;
1 X" w7 S3 q8 O/ ]+ m  _        unsigned long frequency;/ h6 o5 w8 L5 ?% C; m3 @
% N6 m, Q4 M6 ]5 p3 u  Q
        // Event1 中断标志
3 }% ?7 @% y& L# o8 n6 K4 b. w7 k5 O        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
% q7 e' i* O; j- w        {0 B6 z  Z" i% \) |4 C1 c
                // 取得捕获计数3 \- `* ?8 z  K" K& Q5 w1 x: ]/ t
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
8 h% w) [, L5 G: I9 r                capvalue = ECAPResult.cap1;) D9 g4 d) l! E9 s+ T- H+ n
) {* d8 M+ T+ u: z
                // CAPTRUE 模块 228M 时钟主频
6 i7 R5 D3 k4 o% T# b. k6 W" \                frequency  =  228000000/capvalue;: H2 W1 O9 C% G. G7 p3 T( a" }
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
) Q% C+ d, |& ~1 E3 x/ N/ q% x. {* @+ M* n. u
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);/ w# g8 K! Q" g9 T$ B; Q
//                IntEventClear(SYS_INT_ECAP2);" G" |( R6 L* r  V
        }
! l& Z& t3 Q' N& j        return frequency;
$ I4 R* G+ U' H}. i! ^6 m3 N- f+ Z5 I& O

作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。/ r# {/ c( ^, C" E* y, K) t% a
[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