嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家9 J) @. ^, T& h. J6 v

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
# F- N& E5 c7 I5 z3 }/*                                                                          */
% F2 }" a  E% {5 o- G/*              宏定义                                                      */8 @; ~; V' h' E5 \8 P5 x3 i
/*                                                                          */
( f/ D! [: y: r" Z1 M1 y& L/****************************************************************************/" H  o9 e+ V& p/ q  m1 }7 g4 o
// 软件断点9 ?# j# }& N/ d4 x+ N7 z
#define SW_BREAKPOINT     asm(" SWBP 0 ");( Z1 Q% F! L# q6 K8 c

7 p& M# B# ~  y) n2 p// 时钟分频, R& b. U9 f6 H% z! W* H- g
#define CLOCK_DIV_VAL     228) s% R$ ?" |2 m
% b1 W& H5 }3 G4 [4 d# R  r
/****************************************************************************/
* ~/ ?9 {- p5 K! F6 c6 Z) m% N7 `/*                                                                          */# S+ o9 J9 m) v0 `" n! [
/*              全局变量                                                    */) i* ^+ s: {9 D" Y! X5 T+ x
/*                                                                          */
. J7 c. Y; I2 D. c, h, f/****************************************************************************/% z. v( s3 N2 g/ P# t0 b' |9 N
ECAPCONTEXT ECAPResult;
1 n8 s/ ?1 k) x% d% S% L2 H" P! S! P) E1 e4 _, `
/****************************************************************************/
) n8 Y# W1 S1 Y+ A9 u/ @& Z+ A/*                                                                          */5 j  i% @9 y2 o) c9 y4 i3 `
/*              函数声明                                                    */1 W# S( ?# k5 Z) ]
/*                                                                          */% t& X; I: t- N9 p$ W. I5 R
/****************************************************************************/
3 `' |" e/ P9 t1 ?: Y// 外设使能配置
/ c) c: \* x- Kvoid PSCInit(void);
8 i* F4 R. g/ H7 g7 z4 A. I4 @' y
// GPIO 管脚复用配置
" F8 Q0 [- z6 ^1 f5 ^" kvoid GPIOBankPinMuxSet();# O$ c4 ?$ a8 C( i
: B2 i' s7 q8 H9 F4 D
// 产生波形
4 y  {- M* ^$ Q* \" ^; tvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);* i3 ^7 m9 ~% Q* R- K
void ChopperWaveform(void);) w! P% s, n0 W* s: H) N. D5 y

# @# J7 z; ?4 |3 k+ q2 I4 B  `: V// ECAP初始化和读函数8 J: g6 C4 v5 ]' g2 c$ J) c6 W  d
void ECAPInit(void);2 W0 b$ l( m; P! Q1 P. G
unsigned int ECAPRead(void);0 S1 ~0 x& J/ p) E' z
! U: o8 P! ~) @$ {) e
//ARM 中断初始化$ [8 H1 M! D1 N  ?! L# @
void InterruptInit(void);
' r$ \, h3 I* j" S& T* s6 V* {/ b7 t" d3 M# }0 f" S% a
// PWM 中断初始化4 C' ~! D3 c6 {8 v% A
void PWMInterruptInit(void);
( f, x' R. ?1 }/ X9 Z4 C  f7 [( W// 中断服务函数' V' e+ j9 R! ^& c  W- I
// PWM 事件
1 k. z5 w6 P" s6 o+ P2 }' Avoid PWMEventIsr(void);! b7 g( \) B8 [% ]. p1 F3 U( E
// PWM 错误控制事件
; U+ C  E  J7 y# H1 `  Q0 e, Bvoid PWMTZIsr(void);
# C! V0 z( \: O+ T: }, {
3 O& Y2 O) y6 ~$ ^! Y/****************************************************************************/
3 [) T0 m/ {/ r) l8 x/*                                                                          */& r1 N2 v6 x# l! T
/*              主函数                                                      */
( j  q$ f- C9 Q/ n! C& ~8 E/*                                                                          */+ d' O- T4 J. U. f7 e$ X
/****************************************************************************/
: C6 l/ S+ j% Rint main(void)
: M: W3 K- v! S/ ~2 N+ `{
, e) }) q9 ]2 h' N        // 外设使能配置
% s3 V$ E! W5 _. \- _" x1 ^3 J$ E- V        PSCInit();/ ^8 W% O# t3 f. f
) }9 z' ^8 ^& ~- J( Y
        // 初始化串口终端 使用串口2: Z. W: i) D0 `8 x3 N/ [/ p
        UARTStdioInit();' \4 l7 D7 U/ C4 e; ?' X0 V
       
: C9 D) B; t8 e4 X4 T3 b4 Z9 F        // GPIO 管脚复用配置
) p$ P0 g3 ~: d6 B        GPIOBankPinMuxSet();
1 N# K2 ~8 H  D4 a* G$ O1 t  M1 w$ P4 X' C* |
        // ARM 中断初始化
1 }! j1 k+ z* ~$ _        InterruptInit();
0 y  f" H1 U  g  T) O& Q
+ l7 L( I6 G  [9 e  \        // PWM 中断初始化
( p! K1 g( c! i" ~+ L" D) |$ m        PWMInterruptInit();( e: J0 z0 C& g
$ I4 x& G: w8 w' t! \
        unsigned char i;
( Z+ K+ E6 D+ w* ?  z7 p        unsigned int j;
$ {: V5 V5 V. R  c) u: n# K6 U. S8 Z9 p0 q# M  h/ h! n9 N
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);& y& R0 A: _: v8 B+ V4 u8 ^
        UARTPuts("------------------------------------------------------------\r\n", -1);
( J( j- A: z, R- y1 R        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
+ L: L, u1 W+ ]: g2 W        // 产生波形0 v4 f( ?3 ?0 e3 v# b1 i
        PWM1ABasic(25000,50);
; Q2 S4 p& U% ?- z  c* \
- ?, r7 k3 T, F: w2 D        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);7 E' u4 Y2 s  }, n& v9 K, ?! S0 m# s3 e
        UARTPuts("------------------------------------------------------------\r\n", -1);
$ i# f3 {1 n1 V8 O; Y  {1 d
7 S7 b6 S. R5 Q2 Z& d8 n
8 _( [. H0 B4 Z3 F7 f9 W4 V% U' n6 ^; m) x8 o0 N
        UARTPuts("------------------------------------------------------------\r\n", -1);0 B0 Y, T- @% L% @2 b' ^
        UARTPuts("                    C6748 ECAP Test\r\n", -1);
6 b1 g( D5 G' [% o        // ECAP 捕获初始化
: x/ n' x9 f& I" w7 P' h! o* W        ECAPInit();0 ?+ v+ y$ U# q9 O) i" i5 J9 t' ]
        UARTPuts("Initialize ECAP.......\r\n",-1);0 k6 z8 `6 Y) T8 O: q
        for(i=0;i<5;i++)
) o; [3 Z2 e0 W9 v/ m        {' e0 p7 K/ D- q) ^
                    for(j=0x00FFFFFF;j>0;j--);            // 延时# S$ z5 Q& m+ u- x
                    ECAPRead();& V2 ^. Z1 W! r" r0 m) A* ^0 S
        }
! v) p* R: B2 Y; O" Z% N" d$ b        UARTPuts("\r\n",-1);1 `+ k7 l. H' p2 D6 @5 x1 q0 _; q
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
4 H! j% @+ w3 ^) f        UARTPuts("------------------------------------------------------------\r\n", -1);
  i* W- q( l9 B; Z" w' E
( O9 q$ U) I! V/ V        // 主循环
# L1 Y( I: O3 P% a" I        for(;;)
* k. C% `- C0 e# `5 [# R' h, Z1 {& |        {2 H5 f1 u/ R1 I6 }* j  V# a
, q1 @( [) a4 X8 u$ ]  ]5 W! R
        }! S  q( D& g/ U: B
}
  ]. @" b, n/ l5 W/ h& E- G
6 n- ^" B: ^" w$ v% r/****************************************************************************/
/ p' j1 |, a3 n$ F/*                                                                          */
" f+ A7 j6 G" v5 c4 y/*              PSC 初始化                                                  */
, z$ v) z! e" Y* e) O/*                                                                          */
7 i( y  e6 i0 u3 @+ K/****************************************************************************/
, U4 k6 j4 [, E1 {void PSCInit(void)5 O, F7 y. y/ j+ {1 Z
{9 j( K4 f% J# L6 A
        // 使能  EHRPWM 和 ECAP 模块* U! g; ]) {6 }; p
        // 对相应外设模块的使能也可以在 BootLoader 中完成
, s1 \1 I5 G. Y! c' ?, o2 o5 S4 l    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);# V& c. S9 m+ t) Q1 O5 i1 T
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);5 ~& u' K; r2 u3 Y
}
; e9 m/ V! F# X% {$ T0 _1 K/ {) A! i
2 P# B- T) C& X* h5 u6 z3 O0 S. Q+ z/****************************************************************************/
0 i  p" H# n7 e! Q" Q" c/*                                                                          */( v& }( h; P3 T0 z
/*              GPIO 管脚复用配置                                           */
( F0 C+ @  ]6 ~! b$ F, D2 r, U/*                                                                          */
5 @/ ^. ?6 {8 @/ {2 C( I8 P/ S# i9 T/****************************************************************************/
/ w, |; K$ @  B2 svoid GPIOBankPinMuxSet(void)' J: `" G2 `6 W5 G* Z
{( y, B$ M- {1 B
        EHRPWM1PinMuxSetup();
$ K' f; z: ^& f% _
0 L( `6 B0 B3 j- H' w/ n- ]        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
2 U. s" r1 Q! a: y; a* g        // 作为捕获功能时管脚方向为输入2 J- S) ~) a8 h2 X7 \
        // 作为辅助脉宽调制时管脚方向为输出9 Y1 k6 M: H/ ^' d0 L8 C% r
    // ECAP2 / APWM2
! A1 `% m. ^: _/ U3 _  M+ W# F! ]        ECAPPinMuxSetup(2);, g- k1 R  i0 n+ f, f
" ]7 [' ?! v! q" L9 s8 M# U4 c
        // ECAP2 / APWM2方向设置为输入( Y! B+ r# ^$ d- K1 A3 A) E
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
- Y; V$ C- |1 r0 j9 z% ^}
( C, I& `& a. ^1 @, J' X
1 o* Y% w$ ^! [+ Z/ o  G/****************************************************************************/% k& C! ]. |' F% Z
/*                                                                          */9 M9 R# V/ b- B2 N6 w8 q
/*              PWM 输出波形                                                */
$ Y4 D* O% ?6 U) u! c/*                                                                          */
5 _7 {( G5 h9 K8 Z. g1 m/****************************************************************************/
' G6 K+ s( @& [$ I$ O, u# `6 Zvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
, y( I4 \2 R1 j5 Y, ?) U{
$ d  [; ~0 Z9 |9 S# i0 [6 y" ?, M    // 时间基准配置* I- [0 R: y, C" q6 r
    // 时钟配置! m( K% [. q1 [" {
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
9 M" V* [# {. D( R( }& n( G! D4 F) |  b8 w, l
    // 配置周期  d2 M2 T* y7 J! Q0 T* e
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
4 ^) [, m1 x+ |6 u3 W                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);; t7 Z2 }$ y+ t* K9 L9 J( ]  j

4 w; h( y$ F3 l- E% ?/ |3 W    // 禁用输入同步信号
! m( o* f$ z3 }# l+ c* ], _& ]    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
2 X9 G2 F. X6 S+ ]" a8 Y1 a) j2 c1 Z$ \+ g+ @
    // 禁用输出同步信号0 W* I+ |: U9 h
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
+ {8 a5 z* }; \- C% e/ Q# R8 a4 e
# V3 I& V1 ^! z& a) y* E* l    // 仿真(DEBUG)模式行为配置0 ^% V7 I6 \; F; E  ^; T$ b
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
* [  ]( W& V# |" }- c' T" m( ~3 ~8 |: {- Y' y& }0 V
    // 配置计数比较器子模块
- F6 w( @: w) _9 z    // 加载比较器 A 值, }4 P5 V3 G6 B3 e9 O: s, f( |
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
+ }; `0 z' G5 [" y                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
: O3 L1 W7 r2 W
9 c. P. ]* }6 g    // 加载比较器 B 值1 I2 |2 X8 ~- Y4 r
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,  {, `4 Q) z0 C) ?6 m
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);* J5 `1 E+ @) o8 ~2 H
1 M3 ^# c5 _' s: Z1 A' x" E
    // 功能限定配置(输出引脚触发方式设定)0 i: Z2 W/ u8 P9 v' ~
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出& ^( J' d5 J. q
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,6 r/ o5 O$ Y, @& _! B# q; [
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
% G6 Z# _* t" ?( S! K9 f                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
: U1 n1 P2 r4 f" }6 N5 o, w- @- r/ G
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块3 E7 c5 _0 i; y2 q0 I% C1 f7 B
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
( }1 x, {4 V/ W1 ?: }/ e1 z: C- Z2 c; g
    // 禁用斩波子模块4 z( A9 t( v6 i8 T
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);, i. m( {. p5 c# w/ g

- s( S3 _2 A" l4 @/ L: W: z    // 禁用错误控制事件
5 A% H+ ~; I/ l0 l, g0 J6 f    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);( g& r$ Q4 y3 }
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
9 e. ~/ R+ w0 F, Y) k- Q/ K, Q: h: k4 Q, W
    // 事件触发配置& H6 B/ w7 {3 F7 V
    // 每三次事件发生产生中断: n! U7 x" h4 [4 G# Z
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);; Z7 b/ r% Y: y' T( r+ f, ?
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
: C2 y& Y: k% k5 B; a( H    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
9 O3 G  d. t! C    // 使能中断
9 V, c$ g( z* G5 t. h* ]( X# [    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
  ~; R6 `! R5 [: d; g4 ]& k  z$ f$ @& x2 k
    // 禁用高精度子模块
  p( W6 y! b# d2 a, |  W1 ?, |2 q    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
% K8 s5 N1 P% D; @4 w& L- D* q% C  A+ Z# a# C7 t0 y$ J! L
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);. W) z9 q% v& F% k0 P0 H6 ~: I
}1 z- s# c" O- a

& v& ^6 _; |/ Cvoid ChopperWaveform(void)
' v. T/ R1 Z: u" G' }% k  ^* d{
( A7 D+ [9 t* g* ?    // 50% 占空比
, f# [- W3 ~) q* \$ U4 i' p) c! p' ^    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
; K) C4 V+ i2 F9 w. g    // 4 分频8 t3 q6 h/ M/ i5 R' l
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);# L, E  ?: S; Y5 u
    // 单个脉冲宽度
+ B+ y2 ~- [  y2 {3 F1 h    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
( y, Z  Z- f. B2 H# Z    // 使能斩波子模块& h+ d3 _2 a; i
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
0 [' e% i5 H# }. K2 L}
- P7 D; H# I! b3 d9 P$ a* w6 r# ?/ n8 |4 ^( ^' o5 m
/****************************************************************************/
0 J+ _7 y& }2 A, X) j/*                                                                          */2 k! w: f, g. z! Y6 `* J
/*              PWM 中断初始化                                              */
+ E% i" u6 y% @" K/*                                                                          */* l( n4 x8 R2 V, G; C
/****************************************************************************/. Q4 u0 a8 g! G4 D0 d
void PWMInterruptInit(void)
! a% m4 \8 l( H+ ?, ?$ \{
# h; H8 R4 L& [+ M        // 注册中断服务函数) p9 X: z! Z; ~8 d1 s5 m: M. ]
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);, }2 k# S3 f" E  o! y
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
. b7 D9 h2 D! ]2 e2 @7 _" S1 _- {' k$ _" M$ _
        // 映射中断) @, r! {, x. [5 ^- M# R
        IntChannelSet(SYS_INT_EHRPWM1, 2);
" r" x2 P' f. y9 @1 B# q9 s        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
+ Y; a$ h, H7 s  ?  X
: s6 o6 c7 e% J' ?: L        // 使能中断
9 e* g" N6 F+ p+ o. b        IntSystemEnable(SYS_INT_EHRPWM1);
; t9 b: m1 J) B$ e- O+ G7 z# C" \        IntSystemEnable(SYS_INT_EHRPWM1TZ);& f1 O# y( B8 @
}4 N4 n4 M0 C/ I
9 ?! ^' s8 t! v- E8 |0 g, V' S7 o
/****************************************************************************/
. `- h6 e  h; @! g2 r: n/*                                                                          */- I' K+ ^( ?. s! z0 o3 o4 M6 v
/*              ARM 中断初始化                                              */" G, V2 d3 O* b. j' g) x
/*                                                                          */
6 b: w2 M7 p7 M/****************************************************************************/9 @( v3 p5 [. Y
void InterruptInit(void)+ w6 {  M" z5 P( @7 h# u: x
{8 X3 d" C) ?" g9 ?) I* `  e
        // 初始化 ARM 中断控制器3 I; j) d( _: O* o1 P9 u& N* D
        IntAINTCInit();) i( `9 O9 Z* o% w/ b' ~
% M& x! Y  n/ j- V; [- e# C& r7 c
        // 使能 IRQ(CPSR)* U8 v  o& }: R% s. g9 L
        IntMasterIRQEnable();5 N, u9 P3 C" H& i
% Z. K* m' I4 H9 E- u6 {7 y: m
        // 使能中断(AINTC GER)( [, x# C: D3 T
        IntGlobalEnable();
6 c4 |' }; s  C# ^% @
0 D' r/ N7 N+ q        // 使能中断(AINTC HIER)
$ n4 K! ?2 m" c! \% a        IntIRQEnable();' Z' j9 c0 f" E( [
}
2 C1 n1 ?0 `) a) r+ H: r
# a# ~+ I+ z: k$ f6 c0 j+ M
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/
* K' H; i' }9 I& V7 t6 D" x/*                                                                          */
, J  \+ q. Z4 {. |1 i) g0 i/*              中断服务函数                                                */
7 [' g. c$ J( e  |6 ]1 s: `; B/*                                                                          */7 ?, ?% ]3 T. i8 J
/****************************************************************************/
  F  @% c4 c: h2 wvoid PWMEventIsr(void)
! K) p6 c0 _) D7 [  G% b  @{  ]5 b9 o0 X: {- {8 @/ w! S
        IntSystemStatusClear(SYS_INT_EHRPWM1);/ z7 R! A6 y2 W5 w

8 U3 q2 e& Q" C. p    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);$ b0 X# f& n3 X: o! n; @5 O
}- F' g; y; ~+ K" U- h; G
2 r' m  C  t' Y1 {( i$ N
void PWMTZIsr(void): i6 |  ^" _$ D0 I. n/ [5 h
{4 u. s* J( H$ a$ y4 g
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
# R) P# \8 m  k3 a( t. j2 |( A
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);8 L6 P6 [" Q& V" _" [( \
}% \( A' H4 Y7 u' j4 G4 C

- F3 d- M4 u6 s( F% X2 m/****************************************************************************/; o+ g7 [2 a* ~3 T9 u3 l2 P
/*                                                                          */0 c# x0 e" s4 A: d
/*              初始化捕获模块                                              *// \: u# u2 R0 h* @! Q  y
/*                                                                          */3 T6 ]. V$ l4 n' O
/****************************************************************************/, N0 K& H# ?. t9 `8 R4 P4 e
void ECAPInit(void)
; W4 B- Q/ L9 L; y3 |3 z' ~7 U7 v{* J% n! e) F- e& N5 G
        /*-----设置 ECCTL1-----*/! t1 N" E6 |/ q4 t
        // 使能CAP寄存器装载
0 X! O4 N2 v; X+ d# }8 _1 q        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
) p9 F* r% I9 B2 d5 H& P        // 设置预分频值.
! D5 l! i* T2 m        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);! i# {  U" J# t0 B9 P9 ^, W, E! B
        // 上升沿触发捕获事件4 g: o; i& S; C: C
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
3 Z' s1 f# K8 E        // 输入捕获后重新装载计数器值.  p' P  N# }9 M- W2 Y- k- P+ q
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);5 t4 V; V0 X6 C; Q; P
- @0 |! L' k3 @9 V' @$ X
        /*-----设置 ECCTL2-----*/& ^* Q$ C$ W% e. E! y- h4 B) f
        // 连续模式3 h  B+ N1 y* I8 c
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);/ T% F$ M6 {& W7 W
        // ECAP计数器TSCTR持续计数
  ^/ `9 J8 K: g6 c7 G0 _& t1 ?4 G1 @  r        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
+ d/ u6 K/ x  v        // 禁用同步输出和同步输入
- |+ I  g9 I: O- J, g# ?4 C2 ^        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);/ F4 R9 l6 _2 j+ c$ {3 ?) h
        // 配置 ECAP 2 为 CAPTURE 模式  O: t8 e4 |* k, d* o7 \! ?1 K0 u" t
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);3 K7 t1 T5 T. K  R; B( \/ w9 D

& G5 ^; V4 m& h        // 使能中断/ O% J0 F' U/ p: Z* H' d
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
* h, T! I& a% H3 ~) @}
  M% Y2 }0 {# h6 Q; q8 E8 D" Q$ @, o7 i2 v1 B3 \+ r! Y6 y7 w5 h. U8 w8 L2 E. B0 E
/****************************************************************************/& f% S- [$ E2 |- k2 g
/*                                                                          */- \- _! m' Y: R: \% O
/*              取得捕获结果                                                */
3 w; s* ]5 p! c  N2 I5 I" a/*                                                                          */
5 X6 l* v: [3 C" P& S* `4 I, b* W2 X/****************************************************************************/
6 i) w# n- m* @8 o9 Hunsigned int ECAPRead(void)' d$ M: u' ?' H$ ^; M
{9 D* q: E9 L/ y" l
        unsigned int capvalue;, h' E8 B; b) d3 s: x5 q" e
        unsigned long frequency;) r% h6 a. J6 t& f2 x8 g
% @1 d5 M" f) F# S4 K' l
        // Event1 中断标志
, j7 h) \  ~' T. N1 ~. n& Q        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
% X% z, i( a' @% u4 e7 ]        {3 j& k% b( Q4 x5 a: K$ X# h
                // 取得捕获计数1 r, ^' H3 b0 G  |
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);2 F8 Z* v1 S# _) n
                capvalue = ECAPResult.cap1;
' R  [# ?0 X! R* F
( ?# ]5 K: y6 m# [                // CAPTRUE 模块 228M 时钟主频$ K: d( K  `& H  m
                frequency  =  228000000/capvalue;
! h8 z6 {; A, v7 f( U                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);) [7 [; c5 Z0 D6 O; o3 @  v
: J1 O# @' ^  Q' u% N7 L) J: L: z+ y
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);  E& j% E# L. I' R
//                IntEventClear(SYS_INT_ECAP2);
/ ^- S% q* B4 C) [9 U        }
0 @0 L8 X4 x0 _) j# w5 V        return frequency;
: k' S9 h; a) J/ \1 f}0 k$ ?1 F( w5 |. g) ]) B

作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
& [0 @. W$ X+ d4 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