嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家2 X, r* o1 n& H) p1 t1 U

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/$ o) g) k: \- P% b2 K. n) X
/*                                                                          */; A# R$ ]) o2 \  K
/*              宏定义                                                      */
4 _4 z- c. w' _1 y7 h* }9 \/*                                                                          */
# {" V* q4 q" p4 n# z/****************************************************************************/
& F  g1 k6 m9 O5 d+ t// 软件断点, R4 P* V1 P& O* O  I
#define SW_BREAKPOINT     asm(" SWBP 0 ");
# e$ }; Z! P: a
. H2 P/ d$ E$ S// 时钟分频
' u) ], k7 \- ]# C1 e4 \#define CLOCK_DIV_VAL     228
! K4 G" L9 d( u+ f" o. {5 }2 _( B* O* J3 H- _* {' Z
/****************************************************************************/
. @: a* X- s% T5 e7 u0 Y/*                                                                          */) P  i, U: G5 p* \  g  S% d. w( W' Y
/*              全局变量                                                    */; {* B/ I$ Y$ l$ z4 D
/*                                                                          */' T" ~8 L3 n: P% m- N
/****************************************************************************/
7 h0 W. L0 D8 Q! J! X0 U  nECAPCONTEXT ECAPResult;
0 C" v0 _) R  h, J5 D* q( g# C; B  m9 {# j$ L2 C# Z
/****************************************************************************/
# G% u$ j; X1 |5 N' m; v8 h/*                                                                          */0 z- r* k+ ]6 o4 c& w$ C9 V( |3 w7 V0 e
/*              函数声明                                                    */& [, o: Z2 ?& ]
/*                                                                          */
5 C. _7 h3 x! I) G( [( u4 S% w/****************************************************************************/
) H' o# o" S5 D# A0 r0 ]// 外设使能配置- x0 j" A' d0 D4 U$ V" I$ y# ^+ A
void PSCInit(void);
& g, E+ G" l; `$ ^3 Q* E5 Z1 W
! ]; {7 d, T8 T; g$ R// GPIO 管脚复用配置
  C* n8 O3 I$ ^* {void GPIOBankPinMuxSet();
& S; H3 U$ z! |. d
3 f4 ?& p) N' G! p0 Z2 Z% k, b// 产生波形8 _2 K7 f6 Z2 n
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
5 t" @# o- o# @/ q, w, Tvoid ChopperWaveform(void);$ _& i3 d0 n3 n
% [& Q- A3 d6 V1 x
// ECAP初始化和读函数) i* v  t3 i; Z7 b/ v' j+ u
void ECAPInit(void);
7 ]- T2 H& J7 nunsigned int ECAPRead(void);
! K- h3 [8 I6 |" W8 `4 ^" A2 ]! k
  o0 w9 C6 C/ r//ARM 中断初始化
( @- k; S  I7 P( x/ Xvoid InterruptInit(void);- q( ^5 Z  ?5 ~6 m) @$ N; Y
7 X- D7 [; U" i$ l% t* M
// PWM 中断初始化6 R( Z" v$ i9 m% c, s! m! K
void PWMInterruptInit(void);* [' W5 X0 n9 F5 X# h+ }7 A5 U
// 中断服务函数
- ~, S9 g- J' R( |) T* w, v: A7 r# z* H// PWM 事件
) o% g- G0 G% _" M5 r: `9 Evoid PWMEventIsr(void);
6 s0 |; e7 x" T  ?0 D# B// PWM 错误控制事件
3 R0 a  w! j' c% dvoid PWMTZIsr(void);
+ {3 A, h  |, O. ^+ I& m* M4 {0 `* ?) `! n
/****************************************************************************/9 a2 \! O# N- ~8 p# }# s5 h9 x
/*                                                                          */( R2 `/ q, o; Q2 M* t8 W* H
/*              主函数                                                      */
+ B; x# u* x7 W/ Y9 U/*                                                                          */( b* p7 m7 o! X& E
/****************************************************************************/
  r- r. ^5 U+ b" i: fint main(void)
6 [7 ^1 }3 q, J$ ^6 s{
( r0 K  E7 U* ?. B3 A6 e6 p        // 外设使能配置9 U( P; \" O4 x6 P1 [0 I% l
        PSCInit();! u7 l: T  J# q9 N5 ]1 U

2 v; |9 c$ Q  J( h. v  j% |        // 初始化串口终端 使用串口2
9 m& Y0 y$ ~( ?( O7 z3 o& r7 u        UARTStdioInit();
7 Y- a; |2 W6 }/ }" O       
! B  W( m* {+ p: D6 q7 z        // GPIO 管脚复用配置$ P3 [2 _! d6 J$ D7 ]; M; B" j, t
        GPIOBankPinMuxSet();
, x; y$ `2 j& {  Q& T  g& R1 I; T9 I, s
        // ARM 中断初始化
1 X2 a/ f  ^" ?        InterruptInit();
" e0 o8 w7 ^4 k2 ^( s- G" i3 q! q: `  M3 b/ r6 r
        // PWM 中断初始化
$ |* E, \; o0 ]' ~        PWMInterruptInit();% F; w6 w2 K3 u2 D# u- f- a% H
% j5 p, }( n; X1 g6 p& R
        unsigned char i;! i* Q6 F6 z! }  a9 i
        unsigned int j;* C1 w; A1 R" Y% r/ ?% S

6 r! V8 Y& V$ R- ]2 m        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
, G( \3 p6 y! x: O        UARTPuts("------------------------------------------------------------\r\n", -1);
9 {8 W/ M( R3 M' b; B! E+ n  g% C        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);/ p+ X4 E! n3 S3 d  @; `# y1 ?6 B
        // 产生波形8 Q  [1 N% Y8 R7 g' w4 X
        PWM1ABasic(25000,50);9 }# a0 K) S* I0 P& t1 t) s$ H+ `9 E
( \0 j# D/ {& [% g. B. C# y$ Q
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
  ]6 T& I4 t% |3 X! @+ r+ J/ d& `        UARTPuts("------------------------------------------------------------\r\n", -1);
1 c7 w8 d$ L1 |' C4 s2 q
$ A% k) K6 T! m8 B
. {$ d# n0 a- a$ u5 O/ |# C
7 S! T/ ]2 _2 H: K$ [: B, `        UARTPuts("------------------------------------------------------------\r\n", -1);
6 Q. g, R( I# ~+ b# Z        UARTPuts("                    C6748 ECAP Test\r\n", -1);" L/ {, ~) ^8 s5 K" B( v
        // ECAP 捕获初始化' p( G7 g1 c" k( d3 m8 d4 [
        ECAPInit();
3 _. {( ?/ V& y6 b5 X5 X! ?        UARTPuts("Initialize ECAP.......\r\n",-1);  F% j1 l6 r' A! P4 W
        for(i=0;i<5;i++)
4 D+ r3 r/ u2 ~+ ?: U* G9 _3 ?        {
  I2 S1 l/ n" p4 U& ^$ R                    for(j=0x00FFFFFF;j>0;j--);            // 延时# W9 l6 J5 X( K/ ?8 t- j
                    ECAPRead();
& l5 c4 x4 O* ?+ S        }7 r: ~6 D# u1 s; d
        UARTPuts("\r\n",-1);1 Y3 E4 }& C$ {/ S( I
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
! o  A! ~6 c" _' A2 a  g7 f        UARTPuts("------------------------------------------------------------\r\n", -1);
0 B3 @) Y+ L) k3 r+ f2 a2 ^. x$ {$ |3 X/ X! B( Q. k
        // 主循环
5 Q! t+ T. E8 D/ U  N        for(;;)
6 R7 F) o3 X$ S- q1 c/ n        {% I- t, x0 ?: l3 ~
# w; W0 J5 T" R; i0 a: J
        }
  _) I: `+ l& ?. H9 [}
) F4 c# D! M) S) w
, p3 ~+ @6 @7 S( l5 l/****************************************************************************/2 z% l: ?! C/ l2 G; B
/*                                                                          */" b) ?; [3 d: f; \% u4 G" V! F
/*              PSC 初始化                                                  */) `# j- t0 |' |5 ]0 K' X
/*                                                                          */
$ r  `2 a" L2 Z$ u! A$ Z/****************************************************************************/
" y8 X) a2 D% d; wvoid PSCInit(void)
$ Z" @- g5 `$ H' n{; h% i, Y7 b- k- t7 c3 \" h
        // 使能  EHRPWM 和 ECAP 模块
, C( L3 J: y( d% t8 x* C. D0 K        // 对相应外设模块的使能也可以在 BootLoader 中完成  W4 _" G! R8 L: B
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);: n! ^; U0 z- H3 v% T2 A8 I
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);5 f& l$ q& ^7 i% R" W6 g$ r
}: Q( Q. U# ?! O7 i6 _# F# _
! H4 u5 |( w+ g
/****************************************************************************/+ L3 X4 U* S2 o& i$ k
/*                                                                          */0 T, G7 c: w5 I8 A
/*              GPIO 管脚复用配置                                           */
8 B& a$ ?/ Z' m/*                                                                          */( E* q  O% H! \! ?
/****************************************************************************/
: u) N4 L1 o1 h9 Z) {, ovoid GPIOBankPinMuxSet(void)5 f9 ?' G- N- c: a2 X* q, }
{3 J4 S' a2 @) f9 R" w6 N
        EHRPWM1PinMuxSetup();$ a, t& b5 H; u/ ~. n- S4 v
% w% q- Y/ |) N9 k3 j
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)3 h! \7 o  b8 \' w. q* `
        // 作为捕获功能时管脚方向为输入9 O! {/ O2 o( h- Z& G2 q8 S
        // 作为辅助脉宽调制时管脚方向为输出  t7 \. I% L0 p2 A2 C
    // ECAP2 / APWM28 c1 x& Z9 Z9 e) O2 o, j
        ECAPPinMuxSetup(2);
! f; \8 E5 d' \
. `- S& O) s/ o* \        // ECAP2 / APWM2方向设置为输入. X, G# s; }; M4 o. X* T! k2 y7 v7 b
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]7 M2 `3 B. X7 J6 F  y/ d6 ~
}) T+ G( W1 f6 w# R
4 \0 I8 F( }( o. S3 e- {6 r
/****************************************************************************/6 a7 h* z+ {; w  @4 v0 v
/*                                                                          */2 X# h; v- H& C3 L) ^6 _" v
/*              PWM 输出波形                                                */
$ a1 B( F2 a# G/ Y# L% V/*                                                                          */
' p6 }/ `4 |7 e) C/ Q/****************************************************************************/* O9 @- c, F8 ~  C( G
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)" ]& r$ H; s3 E+ v, W7 @/ `
{; X0 m* c* o7 l/ ~* N, D7 N
    // 时间基准配置
1 Z$ P  m- s$ |/ R' |) V+ v    // 时钟配置, {3 O1 [& u( r6 j
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);& k0 G  U0 J/ m6 i- `
8 v( ?* y! d7 A1 Q7 [3 l
    // 配置周期
8 F* i; J5 x# n! s) L9 \    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
2 {( {' |( B1 A3 s& G6 h                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
2 I3 u' b" G* M" f7 Z& _' V6 A. t( @/ f( {
    // 禁用输入同步信号
: ?3 ]) m9 X4 ^7 E3 ]7 g: u% ^    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
6 G% N* `# P* l* I4 o" K
( ^% @& d3 f1 \6 C    // 禁用输出同步信号
5 _/ K. C- t( {/ I% O: y# t    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);% z2 B+ ?2 T: N- H9 o
) M# m( Z8 d# F5 {2 @# w
    // 仿真(DEBUG)模式行为配置
# z' L; s# }% C* G# x* }    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
! x0 H4 ^, \! `
% X3 ]4 J/ V% f; ~' \' Y$ l    // 配置计数比较器子模块7 x: @" e# S1 v# M
    // 加载比较器 A 值4 Z4 ]1 s* Y: N6 `' X# u# m
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,. w' s( c4 h$ k1 P
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);! f! F$ ]6 L- N. t* Q
6 e+ Y% ?' _/ M7 Y: a
    // 加载比较器 B 值
) B/ `5 P: E8 {    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,' s; C6 K, q2 e; g+ J/ K
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);% @1 H% i9 _* V1 {8 X% h

4 g; t& r, n" [3 E/ h    // 功能限定配置(输出引脚触发方式设定)
' f8 m8 ]2 y& D7 r7 x' r! d    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
! g  z- r" F8 Z+ y! c' M% N. E    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,: d/ ~7 A( S- r) i& D! D! B/ m1 R' a3 T
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
2 s4 Q  F! q$ x/ B+ |* ^" I0 u9 K                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
1 m# e7 f  q# y" }7 {
+ a( ~5 m+ E# K& K# C1 q% E+ s    // 禁用(旁路,信号直接输出到斩波子模块)死区模块6 [. k! T( j- M5 L" t1 w, l
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
9 C* s3 e: J* b. W. F. y
. {1 _" L1 {7 j- |9 m    // 禁用斩波子模块  A2 P8 q4 ?5 F( T
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
) T5 c, T( S+ E
3 C: r8 Y" j  h! Q% c' |    // 禁用错误控制事件/ u) k  W4 O+ I. `2 l4 i
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
: A' }0 E" Q! I7 p    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);) P, G1 u. D: x1 Q. J
  S* m0 g& R3 N& M
    // 事件触发配置/ i+ Z1 ^- A/ d) e' `& n
    // 每三次事件发生产生中断
  r2 \0 v9 z6 k3 E* r) W1 F* W, r( n    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
$ _  V8 E* x5 ~    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
4 ]2 n5 r- x. Q2 [    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);; u2 m) J& s' I0 i( r
    // 使能中断( p, |4 J" L' n0 B! R
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
4 m: E6 \$ M5 O+ k/ O
8 X& z% |+ ?, y( S# U, s    // 禁用高精度子模块
# ^& B( d3 L$ c3 R    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
* B2 R# ]; [% ]5 S( X  N2 L8 I7 l& H, ^' u' g
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
2 b2 r8 @0 L. _( s+ Q}
/ T; S& o) ^# Y# b* x$ ?1 F% I: `$ U4 ]1 `+ v; t# l
void ChopperWaveform(void)' Z: r$ ~1 c9 `6 M
{& k0 X* @! h- x% y& a
    // 50% 占空比
" W$ U, r* P% j2 L5 b' D6 u    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);( J1 p( f. \6 x- C( a0 p. r/ X
    // 4 分频
4 ~0 `) ]- P; u- u+ \: R! w    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
2 y, Q. L. z# F, ]* C    // 单个脉冲宽度
: L+ D2 i3 W9 `& U6 D    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);3 C5 N3 F8 f1 g; t# h# [( v/ ^% {. [
    // 使能斩波子模块
6 z1 U1 [; r9 n' R    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);9 l4 h. t3 x: a* {
}4 p" x" g% j0 j% x4 n/ C
* S! w' {; s! s/ G) {: s& [, P9 _
/****************************************************************************/' x- H% ^+ Y9 F1 {6 b; Z/ R4 f
/*                                                                          */
5 ?) ]+ W  d( T4 d$ t- @/*              PWM 中断初始化                                              */& v) `9 J2 |& t' m
/*                                                                          */: @# z+ A$ M: O7 ^
/****************************************************************************/
; q9 R5 c. y* x' `void PWMInterruptInit(void)( X5 Q6 i( e: r3 D/ [
{' S4 S# d! c  ~( m& X( |5 V
        // 注册中断服务函数( Y; \* a4 P8 D, r2 e
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);. X2 R7 p0 k2 B
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
% Y% L, {; z/ s2 K9 O) ]
( j: k2 n8 ^, A6 |' ~# V0 s        // 映射中断3 w  \+ P9 d1 y, @9 D0 e1 g6 U2 Z
        IntChannelSet(SYS_INT_EHRPWM1, 2);% ]7 K( h0 J' M* \7 `
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);6 w5 ]4 [+ V. w$ o( S( w

/ |1 `3 v5 ]8 z! ]4 v7 i        // 使能中断5 y8 j% M' [/ O8 h% r
        IntSystemEnable(SYS_INT_EHRPWM1);
0 D, ~% S* @9 S) d% h- w9 X        IntSystemEnable(SYS_INT_EHRPWM1TZ);
1 C: d2 ~6 O5 ?2 V}
/ V& C, }! m6 ?" o3 \* L5 }
0 U' H& M: L% P" ?/****************************************************************************/
2 R& j, r. F% ?1 d& p1 M/*                                                                          */2 S- f, ^) N6 W
/*              ARM 中断初始化                                              */
5 [0 `" ^% |# Y  [5 k/*                                                                          */
& o. O  y3 i+ @2 b% Z$ ~/****************************************************************************/
# z: B3 b7 W' w5 X$ tvoid InterruptInit(void)) W+ S" \- z7 x8 C' w
{4 r7 M( J4 ^" G. V5 M# ~
        // 初始化 ARM 中断控制器; s' {5 m, Y. T! Y2 j: q
        IntAINTCInit();0 J8 W- O0 y" n1 m6 g5 [
& u1 b3 g2 g* V8 E1 b5 l- p
        // 使能 IRQ(CPSR)
& |. i  Z% g- `1 ~9 H7 @        IntMasterIRQEnable();
& I- @$ i7 f- s5 a& ?& C
' B5 N6 ^$ s6 S8 U6 c# K        // 使能中断(AINTC GER)
7 T4 @% @0 Z' M+ Z" _2 p$ ]: y, s        IntGlobalEnable();( X6 D% p9 l3 ~  r  P6 P! n* E

3 a0 U6 @/ }- u        // 使能中断(AINTC HIER). ?: O5 M# W: ]! c' V
        IntIRQEnable();
3 ^! z! T( K+ S8 T}
/ S8 r' E5 ]8 B2 P2 I
4 B# l/ `$ S0 r7 [4 {9 }1 s' U4 C) {
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/; Z) s# u# o3 P% u+ R/ J* n
/*                                                                          */! l2 R4 Y( g: \2 x1 k" x9 Q2 O
/*              中断服务函数                                                */- y' D) {3 W% w/ V4 l+ L9 a: Y
/*                                                                          */
; g8 D7 x/ T. V& L/****************************************************************************/& Q( V! p+ {+ W3 ?7 t- Y9 S
void PWMEventIsr(void)+ x+ h" o! |( Z- }
{7 x8 P/ ^' {, L3 m& e7 F! [% _
        IntSystemStatusClear(SYS_INT_EHRPWM1);
" V. M* W8 Z; v% ]; {& a% l& I; N$ N, |$ ^0 N3 |9 ^7 E
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);& w4 d0 K7 R( E3 O: F6 ?
}7 o8 w8 _0 {& f9 v$ [

+ K& o5 _/ W8 |void PWMTZIsr(void)
' U# n& l7 o9 i; |6 g{
0 l/ e& b% m6 C9 S; P" ]8 f; Y        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);6 N6 t' A, `# D. C

. g) D! C8 }9 Z$ e% c# l    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
5 \3 F9 N& ^8 L2 t}
% L% Q. C7 g4 ]; F4 u+ y$ Z' w6 {3 l0 }3 ?$ v" L
/****************************************************************************/: b% ^; F+ F9 J5 u% w
/*                                                                          */1 k$ E. J- `. Y7 i% @& n7 B
/*              初始化捕获模块                                              */
# {8 _1 i3 d5 ]; i  w/*                                                                          */1 i+ Q/ {3 E0 U2 ?! \
/****************************************************************************// I8 V$ Y  f+ t- C% U6 H, Y: Y
void ECAPInit(void)
6 G1 Y3 Q. Q/ Y{
) v; U  f3 X1 K' W. k% o: |        /*-----设置 ECCTL1-----*/! D5 H" F% B( f6 O( ?9 B
        // 使能CAP寄存器装载& f. D7 A  G1 Q8 s; a
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
& {9 @& o; [' }        // 设置预分频值.# r9 ~7 ?/ |1 b
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);+ u# v) A  ]! o  Y
        // 上升沿触发捕获事件
5 s( i1 e) q+ {        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
. K$ K* E6 ]3 G        // 输入捕获后重新装载计数器值.
/ `; Z& b: O3 ?        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
+ D& u% G; B0 l! v0 F& O8 Q  \$ V( k, C
0 h6 u+ A$ [! e5 T- @$ G3 i+ `% O        /*-----设置 ECCTL2-----*/
. h+ @2 j0 p' C. }        // 连续模式- R# w9 e; U7 s$ @% g- ^
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
) K( h: }1 |1 q* M4 r( X6 V        // ECAP计数器TSCTR持续计数& v; y& {+ P$ N
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
3 ^/ ~* }& H) x' o6 E4 ^        // 禁用同步输出和同步输入
+ b4 [. a# K3 x        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
4 W; Y( |$ a: M! H        // 配置 ECAP 2 为 CAPTURE 模式7 Q9 S: I, E9 k
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);; i& W+ h! ?* j3 E; m
3 r( O' l. E- R! N% `" P! T' @
        // 使能中断7 W3 T. H2 D& w$ `: N% k
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
9 m; f5 K( b) V! T! |; J* W9 ?}4 s1 f) Q. |4 W# Z0 j
) s8 H$ G7 n; y! B) T# o
/****************************************************************************/
. c" \$ i' X0 f; D/*                                                                          */
& H; Q6 a2 g  X5 U# n2 R/*              取得捕获结果                                                */
  I; u* H3 @8 {+ z! e+ t: n- O/*                                                                          */
! T5 q5 S. @" n. I5 T) n" R/****************************************************************************/
; l/ S( l2 o8 O8 Gunsigned int ECAPRead(void)
3 x' z0 }  [: Y' P. Z7 O% N{
5 D, }! H& _; r( P4 Z        unsigned int capvalue;- K+ f6 \7 k6 O# U! j2 H
        unsigned long frequency;
( g* {( \4 a0 X/ v* D8 P& w3 J
9 ?# y' S" U2 U. U% f        // Event1 中断标志) z. x& i5 @, d0 ?/ K8 c
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))0 N% Y6 H  M! r3 W9 b
        {! U" S; k3 W7 t" S) |
                // 取得捕获计数
5 h. i: X6 s+ w: }! J                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);' c; U2 ~8 U; _( q& n2 P2 F) N9 b
                capvalue = ECAPResult.cap1;6 b; V7 l% d4 I6 W$ z) B
5 h  c2 b& o& `
                // CAPTRUE 模块 228M 时钟主频
% }. [  u/ ]; T+ q  y                frequency  =  228000000/capvalue;
( ^( x' f; K; ~6 g4 }) U4 Y  X/ X                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
8 x: u8 S; \$ N1 M$ U0 Y( y
4 C: H7 ~" {0 P                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);) m* e) ^, Y$ }- T; H
//                IntEventClear(SYS_INT_ECAP2);4 s7 N8 ?& r! ?3 A' ^
        }
8 I1 v! m: F5 Y: l        return frequency;3 S) R. Q  C+ P/ D% y2 w% ]
}
& h5 `, B. r: b( F
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
, B3 C  W* Y: v* s* H% ^' z) [- d" V[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