嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
1 _2 o- j$ H% P( |& j% w
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/& m2 \. E' t$ X8 {& a0 I& D" U
/*                                                                          */
2 ^* J, h" w$ \7 `0 I/*              宏定义                                                      */" K7 |9 ]; C, h! n
/*                                                                          */
8 s6 K, L8 S& f# ~/****************************************************************************/: |/ J& e6 p& U8 |% j9 N+ n  m
// 软件断点
8 O- t& n6 |5 h/ ^#define SW_BREAKPOINT     asm(" SWBP 0 ");
" b9 N* z- p* S2 m9 x9 B2 D
% k# A: V- r: N" Q// 时钟分频) K/ {+ X. ^  Z( v
#define CLOCK_DIV_VAL     228# D! M" R) g0 Z& T
5 ?( ~- R! |' p6 @/ x6 V
/****************************************************************************/# g: P, y6 W$ y& f, s. x( Q6 U
/*                                                                          */  c+ a9 k# f# [
/*              全局变量                                                    */
9 _( V0 Q4 J2 R( e8 J6 k$ m/*                                                                          */* A2 @9 V1 [! \$ L+ Q, H( d5 v% ~3 ?
/****************************************************************************/, f" W1 F5 k$ U0 ^
ECAPCONTEXT ECAPResult;
0 d5 x" m- c) a! X5 W( @0 p+ t4 R8 o# l$ ?% |* E9 J
/****************************************************************************/7 s+ \  |% c! Q
/*                                                                          */
: _! T- v7 f+ y- F5 r7 g2 o8 T& \& O/*              函数声明                                                    */, |7 ]. j9 X+ ^( ^% S; Q) I% J
/*                                                                          */" F8 R( L$ N. x. L5 Q0 q  W* R: X
/****************************************************************************/
" t+ M* k! a  p0 Z7 n# Z, b// 外设使能配置/ C& H$ p8 i9 O) W
void PSCInit(void);# i/ p& N4 ]$ s2 z6 \7 Q2 n, R. R
- M6 h' U4 x/ p  J5 \
// GPIO 管脚复用配置4 P, z, P0 q# x  i
void GPIOBankPinMuxSet();2 e* D+ {) p) S8 g3 i1 J; ]

4 K+ o+ j+ J- r7 [" s// 产生波形' {& _4 F! ^! ~9 T
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
, K- T5 W& c, A, n1 u3 N) \void ChopperWaveform(void);
7 M7 F  [$ t$ {* s2 J1 J( z& w: T, P
// ECAP初始化和读函数% T: Z; N) b) a! l& O3 b
void ECAPInit(void);9 m& o9 L# C/ I/ c
unsigned int ECAPRead(void);3 R0 i6 P* ^/ \" B; @3 R
3 w. {: n: ~( I! ]9 e
//ARM 中断初始化
/ g  p* @5 G# A, P8 Hvoid InterruptInit(void);" `* [2 P" r& W, _* _5 r* Q
8 u/ l7 {7 M8 q. g, J7 Y
// PWM 中断初始化
3 B( Z, c0 V" g6 C2 f6 yvoid PWMInterruptInit(void);
& v7 F0 K' j! I9 g4 H8 ]// 中断服务函数) B' \; y* ~5 x8 h6 e
// PWM 事件" Q4 M# @- n! f; X) O8 i
void PWMEventIsr(void);9 j- S6 l2 d, ^
// PWM 错误控制事件+ X6 X+ h$ f% j: G
void PWMTZIsr(void);
. C/ X% N2 v3 c6 ?1 ~$ ~
+ F. v7 N  S: s) t/****************************************************************************/- B. p& _6 x6 a
/*                                                                          */- P6 D- w2 c5 j3 [: i: w9 P' f8 Q
/*              主函数                                                      */
  L. ~  ]) |3 J" G! @! F& `/*                                                                          */
8 H; E4 n7 B% t# {! o; I/****************************************************************************/) T1 l9 z% Y/ P$ q8 L. y
int main(void)
" X: `. E% u' `0 `  N# n- ?+ S8 G) a' l2 ~{8 ?0 e, \7 j$ @
        // 外设使能配置3 o$ f( R& W0 l( f
        PSCInit();
! ^- J# Z6 d- i% Q
4 t$ @- F" a& U2 L: I% K        // 初始化串口终端 使用串口26 k$ C0 `6 O5 R: ~% d
        UARTStdioInit();  J6 ^% W3 ?* G  g, L: B
       
$ N0 d8 n$ \8 j( X8 Y- G        // GPIO 管脚复用配置
  f7 H: _# y% b: B3 ~! F0 B        GPIOBankPinMuxSet();" J: L& _2 n+ {/ `, g( D

/ Q; @: w! F; d. L8 e+ O+ \        // ARM 中断初始化; u* N7 _8 |, H: K
        InterruptInit();, `* R$ |7 P3 j6 A* e% T

9 l: p# b3 b1 n  T# P        // PWM 中断初始化3 p$ w9 U' u- E
        PWMInterruptInit();
! s3 ]: t) B! ]6 a4 I0 y, g$ y3 D. z8 [" [2 F. M1 Y
        unsigned char i;
$ F5 i7 \' z; T7 Z% v        unsigned int j;
$ H- C2 q5 n, P0 Y8 H6 l7 \* s% h& ^8 E2 V, s
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
4 Z' i4 \4 S6 O8 w: N0 E+ u        UARTPuts("------------------------------------------------------------\r\n", -1);
9 ?3 N. |' o. ?        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
9 \4 d8 j; ^. x* y/ h        // 产生波形
9 L& e6 @5 V, p! y. o& Y, K) ?" Y        PWM1ABasic(25000,50);- J: a, A! @% N- z8 C6 g4 H
0 D1 `; N9 Y! Y
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
& z5 A$ z# V/ n        UARTPuts("------------------------------------------------------------\r\n", -1);
+ E5 Q! F& p8 W* y8 Z/ u  h- Y( ]5 }/ ?$ `& N) R% \

) z" v/ e$ C, G! ?; ^. P2 r7 `! O. R
, J2 l  g$ r7 w4 O. q( j        UARTPuts("------------------------------------------------------------\r\n", -1);
6 o) c8 E% Y; c        UARTPuts("                    C6748 ECAP Test\r\n", -1);* n. k. G- k( Y' L: ~; E/ P
        // ECAP 捕获初始化( V4 Z, I7 M7 J2 r. u
        ECAPInit();- p: j) \1 d" c; k* s# y3 |
        UARTPuts("Initialize ECAP.......\r\n",-1);
: c0 q% |% r5 ~. i3 x& O3 \/ B! B        for(i=0;i<5;i++)  n( ~7 j; E7 c" D. v% u1 T
        {+ ], j) y1 ], }  `" N/ D
                    for(j=0x00FFFFFF;j>0;j--);            // 延时, M9 v9 J# b  z7 S
                    ECAPRead();3 H( A4 e+ q# h. z# D, A9 r1 \- z8 R
        }
& D' ~* H( S9 ^5 [: k  \- `+ _        UARTPuts("\r\n",-1);
4 Q: ]- \6 m5 N! t. m        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);2 [5 U/ Q( i; Y8 g( \
        UARTPuts("------------------------------------------------------------\r\n", -1);
$ v0 A  D& g) a
$ v9 K% A! k2 ~: V        // 主循环
% P( ?! d1 P6 {8 G. \0 Y        for(;;)6 B; w& t/ S0 T7 m+ G
        {: u3 h& p) ?* r. W+ t
/ u. s3 D; g# @; ?
        }
) l3 _  w2 q6 r: `}
5 Q0 S) }# W( w6 ^& S( C6 U/ W2 M( n& C& w6 v
/****************************************************************************/
' P, L+ O) S: x0 d5 h% K; X: X/*                                                                          *// a  ?) a5 M; B  M$ K
/*              PSC 初始化                                                  */9 {1 G' `' H5 V9 Z( c# v
/*                                                                          */4 D1 f" b4 k4 b; I, z( ]9 T. F
/****************************************************************************/
& ~/ J' P( d! ^3 ]4 A9 {4 N1 e! Evoid PSCInit(void)
  e; n- u$ _4 h) K6 ~9 R$ X) D* i{
% y  q0 e, g& y8 t7 h  ]        // 使能  EHRPWM 和 ECAP 模块
2 e9 f! [" Q: o' ~! b! d/ J        // 对相应外设模块的使能也可以在 BootLoader 中完成! Y9 S/ x7 s+ Y) W+ Z/ H$ [
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
- _8 v' w' l) W. n+ J    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
5 v/ b' K0 n. E, s' b9 a/ O}
# h# s4 S- z: ]: v/ A4 P8 ]1 l5 @& Z3 B; o" `1 H! i! B
/****************************************************************************/( H6 q) U2 f/ k
/*                                                                          */  y! s1 v! S& h! R- r) U
/*              GPIO 管脚复用配置                                           */" H0 |& D* |1 Z' U" M# W
/*                                                                          */
1 G5 R6 z- n' G4 |$ `  p/****************************************************************************/
& C/ Z7 L8 s) C# u2 |4 qvoid GPIOBankPinMuxSet(void)) d' g' X# C8 |+ d, J7 h
{
" }$ x: Q. G6 b7 \% U        EHRPWM1PinMuxSetup();+ R( @3 C* Z0 B( h! a" J

: u1 e+ F/ M3 c+ v( p3 o1 ^3 T        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
0 \. t, f4 ~# k1 i1 W$ }        // 作为捕获功能时管脚方向为输入: E1 q) p/ i" A* u6 v3 f( l
        // 作为辅助脉宽调制时管脚方向为输出
9 T, E9 D) l9 Z/ C3 Z0 n$ W! R    // ECAP2 / APWM2# u% X# X, C5 M4 t- e; U
        ECAPPinMuxSetup(2);9 P+ g0 a: m* B: U" _
8 ~! _3 C) X) {) p. _* H
        // ECAP2 / APWM2方向设置为输入
; u+ ^: K/ Q9 @( p- F        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
* x6 A2 l6 z/ k/ N6 d0 W}+ g3 Z" o2 N% g% E, h7 E

* c$ U8 R! Z4 u4 J/****************************************************************************/! n, M  b. L  Y$ Z3 Y& g) N
/*                                                                          */
9 A* N0 v; L) Z8 I: I/*              PWM 输出波形                                                */
2 Z1 @  g8 A- e/ H3 l. _& r/*                                                                          */
* D; I6 d/ s* }) }8 y: Z, O/****************************************************************************/, q: w: X3 H, r+ \: H
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)8 Q2 k, I$ {! p* j. ^7 A
{2 e/ M6 J; l* `1 e: d. U. L1 O/ m
    // 时间基准配置
. a, E4 B$ {: ~5 D% T    // 时钟配置
' g/ w" |+ G* C% x. C. ]    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);5 k1 A" S3 y3 s8 _2 L# k

  s* `: ~  [8 x) r    // 配置周期
& N' ?/ [5 z3 W6 O    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,+ W5 R1 O5 F, e0 R
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);/ C# E2 T% b" R. t/ K0 u

( [2 C( p$ @% \    // 禁用输入同步信号
6 b* z9 d% q7 h1 n6 f    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);* {$ C  Z+ Y/ i, _  ~% ?+ N
; h. a- N" l% S/ m1 C; m9 L8 P- y
    // 禁用输出同步信号( k4 T; P& [8 t! I4 F/ f- J: k
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
$ m+ x  L- N8 M% ^+ H3 j! D
, J- p- w& M6 y6 u' n    // 仿真(DEBUG)模式行为配置: p, d# C! ~( }0 C" S
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);6 d( O, c- k5 o* ]

/ t9 q* m; \7 o4 h% Q; Q" L% A; g    // 配置计数比较器子模块
$ o; \; h+ p! T# ~- C8 [    // 加载比较器 A 值$ i9 _, K4 K2 R
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
" u$ V) S8 W2 z                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
# l* b7 `( x& h, Q; l& E0 H) A/ ?1 n, G
    // 加载比较器 B 值
" A- x% d$ E- A! E# l- d# d    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
# L% a; f& Z! V8 Y                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);5 m* v$ A1 C$ H& Y( x

3 ?8 C1 R% T& a6 s$ L% P3 @8 n    // 功能限定配置(输出引脚触发方式设定)
- V: K$ V: Z1 H7 c    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
% C# y! a; h# Q" A# I    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
1 `% V  M2 ~+ h& |' |                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,9 m6 B* j/ I# F6 r
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
- |, d" q/ }" m) X6 }0 @
. w! f  b6 b  n9 G/ b, S    // 禁用(旁路,信号直接输出到斩波子模块)死区模块: @7 |9 ^: ]- C( V! N/ O. m  s( K4 G
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);/ q% ~8 C4 K$ O3 X4 T- M

9 V3 F# l! U/ j% l2 G* p- T1 q    // 禁用斩波子模块" Q% ~  {  ?) v+ X: J
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
7 v1 x4 d" M1 q  U& a
2 d! \& r# K6 W    // 禁用错误控制事件3 U& h/ r2 S8 |, v* q
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);* D; [7 ?0 C7 \3 C$ [
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);# k5 u% p, n4 c8 U3 A8 t2 l

2 ]6 [& {: Y8 s, e3 V. S/ |    // 事件触发配置
$ B) r3 F8 x6 i3 I& U; A6 A    // 每三次事件发生产生中断" I  ]$ z9 `! h9 z6 ?
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);9 [) u6 e; r. a& m* a7 j
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件* p1 c& B# I4 b/ l0 I
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
* J8 b9 M6 E, C# [2 Z; g* a' h    // 使能中断+ }" e; s) i* g0 N. p
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);6 D( U0 @  M% r' e( x
+ c4 T9 e7 q" g! A. }( V9 p' Y1 [+ K
    // 禁用高精度子模块
# a! j4 q. F& Y* a, f, s& k    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
$ ~: K6 I  @  e8 J: F% o. y$ X: x
$ x3 R+ Y# w7 ~/ n' }    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
' F' i$ }* y9 m* t- g}0 x: o& P) j+ t' ^# g

6 i8 H. K( l; X7 ^5 d0 C0 Nvoid ChopperWaveform(void)
/ C% W4 X. A1 S0 v$ Z{3 y' T$ S. ]3 }# \' _' n
    // 50% 占空比
% U$ E* o# F& [" G# R1 J    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
) U# W$ E  V8 |7 L    // 4 分频
1 M. V0 q8 l: y: R    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
$ }9 V3 [, }5 e% S; O  a0 N    // 单个脉冲宽度3 R0 f4 V2 m" v- t' B3 x4 H
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
  d. M2 N6 u) g& j% [( e. O    // 使能斩波子模块
; L% H& m. c# T3 |3 d* F8 H- s% N    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
" `" n" L4 c5 v- \  e; j; h8 W}
/ R$ O/ v  {9 ?/ D, Z1 d' ]* ~# v* W) P6 \) \
/****************************************************************************/
# L3 _) r" t3 I7 L' N/*                                                                          */
% s5 }! }; F/ T. u4 j6 [/*              PWM 中断初始化                                              */
# f6 N) ]+ k* q& x  B. v2 p/ O/*                                                                          */
. ]; Y& ~9 F) Y4 A) L. y7 \/****************************************************************************/
# J! I+ D. k0 D% Cvoid PWMInterruptInit(void)+ r# H* a2 \/ V5 J3 O
{' f, q! t5 j" \5 c+ H: A
        // 注册中断服务函数
8 j* L5 Q# a, i: a0 A" N        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
) `0 P* n- @; g' O: u        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
4 W! ^- L3 G( X' T! r- `7 N
! `7 q* L* [  Q/ E5 J5 [        // 映射中断9 g  w. Z1 q7 H8 }
        IntChannelSet(SYS_INT_EHRPWM1, 2);! ^# X5 G3 {/ K6 x: h3 J" Z
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
1 f5 _0 G; i* t3 v1 l- s8 y0 t9 A
        // 使能中断
' _! Z5 |3 X- K" \" C" h        IntSystemEnable(SYS_INT_EHRPWM1);
; A0 I) j7 o. l! f+ s        IntSystemEnable(SYS_INT_EHRPWM1TZ);- s. R5 w* s  T% k. B' N* g
}& I9 a" k. J! @; u

6 B3 z. Z0 M% F% j7 S/****************************************************************************/# b7 L( b/ }6 c; s5 m3 g) g
/*                                                                          */
% _: s( e$ _: m% Y/*              ARM 中断初始化                                              */& ~7 T+ z4 E7 U5 E
/*                                                                          */8 C% ^( r0 i7 Z; O% R! r
/****************************************************************************/1 s$ {( `9 D0 Q, l
void InterruptInit(void)  Q; H2 p( `4 Z$ `$ ~% N2 w. |
{
8 n9 `! N8 x$ m6 `4 @/ D8 \1 v; Y+ K        // 初始化 ARM 中断控制器$ Q% d+ O+ {- n- I, X8 e3 K
        IntAINTCInit();
( F0 b, V' {) a3 Z1 t- O& r5 p* r% |/ [6 \! h, H
        // 使能 IRQ(CPSR)3 i/ l' C/ @! E. {/ I
        IntMasterIRQEnable();: \9 \* \5 U" j/ S6 i9 |, i

: }- t; Q1 S0 d% }        // 使能中断(AINTC GER)
$ n: W4 U( p# k8 f        IntGlobalEnable();5 y- B2 B6 ?. W

/ E+ j8 {' s0 S* K        // 使能中断(AINTC HIER)
7 Q7 B6 X+ t' a) h        IntIRQEnable();
8 {, q# b# N. t8 I1 t}
9 G8 E% c, F. p. |  x  U
0 t; u2 S  t8 W8 J, W' f, W, I* {- h
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/& P4 F0 |  B: q+ a
/*                                                                          */% j; N/ O' _+ X
/*              中断服务函数                                                */# m& V+ U, O! l" I0 H( \. U+ O! a0 N
/*                                                                          */
7 E5 m. I/ t8 u( R  K6 {/****************************************************************************/
& E' c) F  l5 _3 Q2 Qvoid PWMEventIsr(void)
" R5 c9 x  @% D: F# r9 J# D/ u{
$ e: \' [/ I7 ], w# s        IntSystemStatusClear(SYS_INT_EHRPWM1);# B) Q& ?" d3 w5 N0 W7 K

' C# G: J$ U3 g) J* l* i8 S: s    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);  `7 W0 f' |, b  v5 H6 v& K
}+ d  E% S& o# c; z0 m2 `; E# t/ o
0 R8 C1 ^' o: g/ E0 M) g9 s
void PWMTZIsr(void)! W6 u' t9 m$ t, l. @
{
6 k7 Z& r( b  ?. C  w+ k        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);) Z- I2 c: J0 X. G; F

" t* [3 K. \" J5 R3 T7 i    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
- J4 H& X3 h1 D- u2 _: t$ h, i}
1 X. T6 n' y4 }: F1 d+ f. O- _  d
/****************************************************************************/
! f6 l- A  Y$ X1 P3 k/*                                                                          */& O( V# l1 [: i$ K
/*              初始化捕获模块                                              */
' J# l1 @; }$ B! G/*                                                                          */
2 ?1 ]4 C# L# L( }- [  c/****************************************************************************/
( m3 q7 `# f0 ?9 @) ]% Tvoid ECAPInit(void)
" C; R: L4 h6 f: W{; z: o4 X/ m5 R: l1 Y+ C( u
        /*-----设置 ECCTL1-----*/) e' K+ d5 N& h& B, e
        // 使能CAP寄存器装载
7 Q. g# O. h) b; P        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);* L  s" O" ?' k- ^$ @
        // 设置预分频值.& b! G/ x$ X1 e$ J6 B% M
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);, Y; N9 A2 a  P; \1 {. A0 u9 q
        // 上升沿触发捕获事件
: w, o# I5 M  O! ~        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
, N+ k, n$ n8 X7 o        // 输入捕获后重新装载计数器值.( ~$ \8 X, [/ Q9 V& x- L
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);5 N1 k. ~9 v: D8 {8 m* N- {

6 ?4 o- J4 S5 Q' }# V/ p: \+ @        /*-----设置 ECCTL2-----*/
1 V! E+ a4 Y# N, [- Y" j4 k        // 连续模式
7 W* `: d3 ^1 M8 r9 a8 c4 V        ECAPContinousModeConfig(SOC_ECAP_2_REGS);- G* h- C6 ^; f5 v8 N( U7 \( G' H
        // ECAP计数器TSCTR持续计数3 Q9 e3 ^/ B* c2 A9 H, v" [: ^& P& I
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);# G7 ]2 k8 M; ?
        // 禁用同步输出和同步输入
; S2 w, X! \- d' ~* _        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);# m- G3 s4 I8 [& v
        // 配置 ECAP 2 为 CAPTURE 模式
% ~( j- l# K- e/ I6 s* r        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
6 T* Y0 w6 i9 f0 g- B! T
3 D) H6 r9 {- \. f# H        // 使能中断
2 T8 e  Y5 v8 L3 d//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
$ |9 u3 w2 _6 L; d  b}$ T+ d* h0 e, l
6 Z' |% E$ ]( U$ E
/****************************************************************************/0 T) j3 f/ c& ]* s- N* S
/*                                                                          */% T: ?8 a. e& t
/*              取得捕获结果                                                */( ]8 P& w7 Q4 v/ l$ t! K
/*                                                                          */0 `, T! c' r, `: N  d( M
/****************************************************************************/
( z4 }+ d% Z7 Y  q  [unsigned int ECAPRead(void)
  x0 H& u  M& K7 _{5 E: A+ A9 _6 X7 |* ]# T# k0 X3 L
        unsigned int capvalue;
# n* C% o/ N) ~! l$ P        unsigned long frequency;
! ^; c; d. |  {0 @$ w0 A
/ X2 h2 x9 T) m4 n        // Event1 中断标志
9 ~) e0 h/ c6 d* e6 U0 |        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))- {8 {! }  [3 h- {% d0 U
        {- B$ C9 C9 n+ H, `
                // 取得捕获计数
0 Y! Q% y7 {1 T) o  ^/ d, ]2 b                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
9 x+ K- m  F' u4 k                capvalue = ECAPResult.cap1;
" n/ v8 k1 M$ I9 R2 H; m
8 ~( A( {# ]* c, _9 O& |                // CAPTRUE 模块 228M 时钟主频  {* I# k5 C* A+ X7 a6 Y/ y. `
                frequency  =  228000000/capvalue;- \! d, k7 f8 t4 S1 d7 C
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);) T, I/ _! z$ V, P2 M0 ]& |% j6 n2 s  X: H3 D
6 \+ |7 Z8 m( R! i; r
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);4 `5 _1 D% L8 J$ r1 ~& t
//                IntEventClear(SYS_INT_ECAP2);
, w+ m8 m6 T1 L9 ]& G- p        }
4 C; |, J7 ?# V/ I- |' G        return frequency;
/ |& r8 l, f( U; u8 K/ c}; s' V  w" w) C" o! }, y

作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。/ v* A4 Q  n- Y( i/ c
[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