嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家3 Z" Q2 y# A3 ?9 G

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/: X1 b4 H1 q1 b
/*                                                                          */
  S  U! l8 }5 D# n, j6 C" `/*              宏定义                                                      */
. N9 ^: t) [. V. b# J, ~: {. o) g' V/*                                                                          */
# e$ S8 M7 ~1 N( Q( _0 Y7 c$ x# T/****************************************************************************/7 h6 g  E) @  ^, ]* w% Y* ]
// 软件断点
7 x/ V7 ~% K! `7 b3 w* s& G* h#define SW_BREAKPOINT     asm(" SWBP 0 ");* i% }5 b+ I( {) j% Y

  D  M3 q5 Q$ U, y9 B// 时钟分频0 G7 l8 J- X. i! d+ z4 |
#define CLOCK_DIV_VAL     228
% x- b1 {1 H# E5 _% P+ `5 P- s9 m8 }( U
/****************************************************************************/
1 ]8 i) a$ q) ^, U7 I' ]/*                                                                          */
0 q$ {$ M. F8 ~- |1 k$ B/*              全局变量                                                    */
) c1 O/ F" `, X, H& o) x4 U/ P/*                                                                          */  k" c  K' N/ e) T) j7 j
/****************************************************************************/
4 w) z/ [$ S2 F! O; E9 d( }ECAPCONTEXT ECAPResult;/ n' |5 {( k! |6 T4 ~; Y

9 R$ B0 z2 w, q. H  x5 }: I/****************************************************************************/# I1 [- j& W8 m5 q
/*                                                                          */# {' n2 `: ^2 m1 V( K" N3 }
/*              函数声明                                                    */4 q$ L9 X) Z% Y2 f6 S. r
/*                                                                          */
) g8 A$ C% B' _% P4 `/****************************************************************************/
+ F. Y. r. u. A* o' Y3 }// 外设使能配置
0 y! |* `0 I6 d0 j) H) {6 g/ u# q( rvoid PSCInit(void);* i. I6 i" K9 a! I! k
. n/ p! w! w5 S( \
// GPIO 管脚复用配置
! ^+ ]9 s! \' b; K3 |' Q+ [void GPIOBankPinMuxSet();
0 B; H% \) `' Z8 \+ m% |9 @1 Q3 v# ^# W
// 产生波形
! Q% U* `& ^% \/ o3 Z. jvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
" Z/ {( k* [, k. I6 j: E# Lvoid ChopperWaveform(void);
* Q# V: T! X/ E' C: a0 E" i$ N3 E4 U9 m
// ECAP初始化和读函数# Z. u% z- _, O6 g
void ECAPInit(void);
5 ^( T0 j- o% a- }3 E* J% Dunsigned int ECAPRead(void);$ V2 j% I5 }  |0 X$ B: g& M

& S9 [, `/ y& v% ?2 E5 _$ t" J//ARM 中断初始化' @4 y: D. x6 E5 [( i  ?& ~4 b; F
void InterruptInit(void);
9 g' C/ T. N0 q" m$ \
$ ^2 P( O; K' I, A// PWM 中断初始化. U3 `7 \; f" f8 O* _# I
void PWMInterruptInit(void);
. |+ }4 e7 [2 |$ V// 中断服务函数; v5 \1 U( @! ~! q4 S% o* m
// PWM 事件1 [' X3 H5 k  _7 u- X  K) a- d
void PWMEventIsr(void);; D% s9 R- {9 V' V/ F
// PWM 错误控制事件, I  A3 j* {( B& S* L) d% p
void PWMTZIsr(void);1 i- P7 J: C: @) M- c) f6 h

/ l$ {* r4 _( i) s# m/****************************************************************************/
& B  J0 n% z6 H5 s) x/*                                                                          */
) E+ h5 h. b: W5 t/*              主函数                                                      */
  P5 [2 B8 W4 A/*                                                                          */" B$ j& a3 N8 V0 M, U* N/ X; m' W
/****************************************************************************/
4 p! s9 A) P& J+ ]int main(void)
, {4 [! m% B6 g- B{
+ x! o2 w$ A+ Z; e, h' S' y% y        // 外设使能配置( N9 s* F# Q: w# A, z' b. m
        PSCInit();
5 J4 |/ X) o1 T9 q% t5 v* A. I% x' ]# X
        // 初始化串口终端 使用串口24 F; c9 Y* B7 ~2 O# P6 m
        UARTStdioInit();. x* b8 y- r/ A: w2 h
       
& v$ i  `# W) P3 e        // GPIO 管脚复用配置- s8 v1 @3 ^  y; n" g
        GPIOBankPinMuxSet();
9 f0 b) V- O. t9 a. @: u' \$ x5 O8 D9 G* ~% d/ ^
        // ARM 中断初始化$ H3 {3 y2 J- U
        InterruptInit();
8 H) V. R; e0 y) ^0 p2 ~# V0 D3 c# \* @" Q
        // PWM 中断初始化2 c; r4 C/ U& J$ K
        PWMInterruptInit();6 i4 C& z7 J" }1 |& @# C: e

/ @+ X, i2 ]7 H+ K9 P9 E        unsigned char i;6 J1 s+ H% A% A7 Y5 `
        unsigned int j;( {' b+ c6 i! ^  M

5 y8 p0 H" m/ g5 L% n8 o        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
6 D; O% Y4 I" m        UARTPuts("------------------------------------------------------------\r\n", -1);% Q! s8 C& O3 E2 _+ z+ y
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
$ E( _! C/ T0 [% N2 M        // 产生波形9 m/ q) N. m, y  E; B5 a
        PWM1ABasic(25000,50);
: e7 `8 P& _8 y. P1 `
- j3 ^$ `2 m& K: r1 O3 b        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);5 |- J# t& z# d0 q5 e/ `
        UARTPuts("------------------------------------------------------------\r\n", -1);
  x& |: _0 j; y9 S. Y  N$ t! j" a- ~  J! H( n
  J9 O1 @: ~; A. E- S
1 b% R: j9 ^; {: w+ [; \
        UARTPuts("------------------------------------------------------------\r\n", -1);
9 O& C; F% \, s9 L0 z4 p5 Y        UARTPuts("                    C6748 ECAP Test\r\n", -1);6 R6 k3 g# o+ I6 k( ^
        // ECAP 捕获初始化
9 a( @. O0 h. l/ `' g; `4 J) E        ECAPInit();
0 n+ b3 `5 |9 \0 t) Q: C" K( V        UARTPuts("Initialize ECAP.......\r\n",-1);/ f4 g- [3 b9 x5 ~7 E, e
        for(i=0;i<5;i++)9 i( b$ F- g0 E( m8 H/ E; {
        {, {2 b* f: R3 D  L* L
                    for(j=0x00FFFFFF;j>0;j--);            // 延时: j; z, z& y& u1 T6 ~8 E  r
                    ECAPRead();
- M/ K0 C4 D# Z        }# i4 O9 y* D) ^5 J9 N2 B: Y
        UARTPuts("\r\n",-1);7 e  g# H- V& D6 o- W/ Q
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
% J9 C: f9 [5 ~6 e, y8 K. V6 g        UARTPuts("------------------------------------------------------------\r\n", -1);  s1 L1 ?& d5 j3 s* r! a
; J' Q8 e, {1 I0 f# K
        // 主循环
+ T6 c! e$ `' `        for(;;)
) }( g/ s8 c: C! d6 o; @        {
+ R; ]3 Z( L. e* [2 I5 }; x1 W( K6 P" T. o
        }, d/ y( L  P7 ^" `
}  l& u/ Q, f3 q3 a1 d: B- j4 F
0 n4 n* j7 Q' ^/ K3 F; o" d
/****************************************************************************/& f) m8 T: q0 Z" q4 r% K; [% u. z
/*                                                                          */* @( s. e( L& m! U* ^
/*              PSC 初始化                                                  */
+ @, U: X( F7 X9 d( N! @' m/*                                                                          */0 N$ d0 K2 S- B
/****************************************************************************/- B. |( ?6 [* @4 `; V' b
void PSCInit(void). j( F8 m' [; X
{
: r9 O- L3 P, q# U3 O9 d$ h        // 使能  EHRPWM 和 ECAP 模块$ x8 H: m# g& O2 |
        // 对相应外设模块的使能也可以在 BootLoader 中完成
- X( n7 L$ a6 P+ G/ L% ]3 `- E: s    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
! W/ t- H. r+ W, `    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
! N# g1 g; l  W1 P7 ^}9 G4 o, J; H, h1 u7 ^6 _2 x

# E+ j- y9 |- ]2 c7 Q9 g/****************************************************************************/
- N+ s; s# F  M# e( h$ I' K/*                                                                          */) n( J  ^% `: O2 w6 F
/*              GPIO 管脚复用配置                                           */
  ^: x9 F( h( j" R9 X/*                                                                          */
) F, I# F4 c# f8 ^1 a2 t- h/****************************************************************************/: K$ J1 Z/ _4 ?6 w+ c7 U
void GPIOBankPinMuxSet(void)
2 I# K8 d4 D6 [5 M% H{
% U3 q7 \, p" N" B4 u        EHRPWM1PinMuxSetup();
9 Z8 R( v6 Y0 C  Q  W8 u  @$ I; c8 T6 Q
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP); w% Y2 V8 v3 R
        // 作为捕获功能时管脚方向为输入
* s  {- b. M3 G( O) C        // 作为辅助脉宽调制时管脚方向为输出
0 E3 E  v% V8 x: W8 l    // ECAP2 / APWM2
  e! ?. `; J/ w4 d7 `/ d        ECAPPinMuxSetup(2);- s$ y* |2 w% J$ g5 z

- q( F6 ~6 F) o3 f/ k* D        // ECAP2 / APWM2方向设置为输入" U) d# ^" D, Z/ f5 u
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]/ G9 q; h7 G- e# U0 z/ h7 h9 n
}
8 _$ t0 u' h8 N$ R5 R4 Q, E+ D% Q- a! V: J) W/ O
/****************************************************************************/  C. x$ g  T! ]! |9 \
/*                                                                          */
. Y. z* n. M9 _/*              PWM 输出波形                                                */
5 E9 [! E9 f" W5 I$ k/*                                                                          */
4 F2 |; q0 E8 F/****************************************************************************/8 Y2 d% l: L$ P) e% s. U
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
0 h5 M1 r9 ], _: }, [9 g  a2 H: O{
; ^, t! q& W, O" S; J1 w    // 时间基准配置
% O( ^' }* x) t: s/ H  x7 s1 {8 `    // 时钟配置  O8 y$ Z% E6 }/ I: Y
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
2 @" U6 o. N. }# d  X" N: L7 o
    // 配置周期: e7 t' {; f- k4 C
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
3 M9 Z9 N& h+ O9 r. S7 ]0 b  P                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);; D# x* g  O6 m
, s) i3 s7 q( b, \
    // 禁用输入同步信号7 a8 ~" p; q5 d8 ^
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);( B& D3 G, l/ z' m: y% T4 Y( m
2 W4 p6 B+ P; V9 b; q8 F7 u+ t
    // 禁用输出同步信号+ J) G" U, t4 K2 ]# u+ |+ K
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
! o. i; ~4 Z  ~( e7 V5 B2 c* X9 U; T' M( e' g
    // 仿真(DEBUG)模式行为配置
$ t8 M" Z+ j  d0 Z    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
/ C! q6 T% }# s" P$ e3 u* r" f0 `6 b& `% O8 k
    // 配置计数比较器子模块
0 i- x9 x; O( H6 h+ z) f2 j    // 加载比较器 A 值
, J& ?0 W  i5 w    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,+ W% U" v1 J  _5 `) {+ Y8 {
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);" L, n+ \! m6 P; \3 [6 {' |

# |+ @4 t2 c$ \    // 加载比较器 B 值2 y/ T% [) {% X% ^
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,+ a$ e! G6 H% a( G
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);! K. F& x( t+ I- X& k% L3 h
: `$ g' D. J- R) L: d
    // 功能限定配置(输出引脚触发方式设定)
9 J! I# I' ^, k9 u2 X) s3 Y0 g    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出  W; n1 v! j: s/ D0 ?" k+ [4 @, P
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
, U7 Q4 `4 W6 w0 s0 h                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
) [- Z! b$ f( C2 u+ n/ I% f9 V                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);' w5 {; I* L+ i( V9 T

- j* P) e2 }- q2 i    // 禁用(旁路,信号直接输出到斩波子模块)死区模块) `; s1 ]2 m) [; V3 l/ ?7 V2 H
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
$ K9 Q. j8 @9 C/ F0 C- @
& E  }$ A. j$ w" b, s    // 禁用斩波子模块# a" e" v# I, k
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
' K% b1 }" p0 A& l2 ^; c6 i! }# k; p! R8 {
    // 禁用错误控制事件) m" X" P2 K+ W6 e
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);. H5 E2 [" \4 i. @" J0 |
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);. d5 }5 ?4 [$ G  t3 r

' ^+ u. {, f/ ]4 L0 u/ {    // 事件触发配置
9 M0 h+ p' Y4 O% f9 |    // 每三次事件发生产生中断0 R5 O3 \8 h( Z( A% ^3 n1 Z1 S7 S! z
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
- x  w, {( o  L9 X. a    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
5 ]- w, ]. I2 {4 u    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);' s( w7 J( u6 `- g5 g& j
    // 使能中断8 W( v7 g: Z4 a
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);5 r; T5 a5 D) K4 Z6 m1 B/ A! L

# Z- X5 b9 c! J: `    // 禁用高精度子模块% M% P; v0 E! j5 I
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
8 H- d& u6 B- b# k$ n. e1 b1 O6 a6 T  r; [( B; ~) U- k' ]
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);% L1 h9 p$ B- X5 e. O! B
}
/ Z" w/ d; J; V( w
1 b* f5 n: V% g8 S9 g; D! Z" H) yvoid ChopperWaveform(void)% i# v; f' |  j; ]/ r
{
) ]+ Z8 `1 H6 J7 t2 p/ c  Y    // 50% 占空比
/ A) J7 z. ]) U0 W/ p* ?  F1 ?    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
. V8 n" \# C$ R! _! p/ _1 `/ J    // 4 分频
/ E/ z6 W; M8 Y3 ]5 A    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);9 L9 q+ g4 F6 H+ T
    // 单个脉冲宽度
: W/ a3 E2 E% `) f8 o( _( ^# s% Z    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
5 `1 c# ]8 a3 b4 H& b  W    // 使能斩波子模块
  g! D4 K& U5 K$ a    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);8 R9 h' u, a/ {" ~* t0 m) i5 r
}
9 K% v1 v0 P& c9 t0 o# M4 |' T! q' N9 i0 S7 J
/****************************************************************************/: j5 \* u* b- t3 d% J3 N, d
/*                                                                          */& F1 D& G. b; T
/*              PWM 中断初始化                                              */0 e$ o7 V# E+ @: g1 F2 y8 l
/*                                                                          */
; w: j" m6 }( J. Q, V5 f/****************************************************************************/& I9 v1 G; t8 }) V* f* c' H  o
void PWMInterruptInit(void)
! U, y0 p; {2 b2 o* z{( B3 Q: }1 q1 T8 I
        // 注册中断服务函数
! Y; z* Z& b6 U) T7 z$ Z) m- l        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
; D) q* e  o2 o) P( V3 s        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
$ M: G/ Q% h5 L# x$ g8 a3 H- k3 b3 G8 P+ q0 q! W" ]
        // 映射中断
' b) o) K7 Y& y6 N* O        IntChannelSet(SYS_INT_EHRPWM1, 2);/ s7 X$ v- w% j- l  }  i  c
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
1 l! K3 t/ {# d( e
+ J, j  |% @0 g) U& ~  x        // 使能中断, B. t1 y0 H2 m% N, Q  c5 z. h( J& v+ x
        IntSystemEnable(SYS_INT_EHRPWM1);
4 I: U& B5 e5 T* h, F        IntSystemEnable(SYS_INT_EHRPWM1TZ);
- V6 Q, V1 w8 r/ N- t}
. z% O  S6 L9 {# W0 b2 T" N; O& V
4 d. c$ i; C( o; N" p, y" Z/****************************************************************************/
4 j8 Z# n5 Y; A3 P! b9 k/*                                                                          */
6 f& K. E" o5 J/*              ARM 中断初始化                                              */$ T* R5 F5 Z) `9 ~. z
/*                                                                          */0 B. P( ^! D0 V, O
/****************************************************************************/8 q3 m; i) `  V. X' m% K
void InterruptInit(void)
/ B2 `: ^; _2 R/ Z; Z' a+ h{
1 n  |3 e. t  D' C" z        // 初始化 ARM 中断控制器& z4 F) a# u+ b! e8 o, n5 B2 ?
        IntAINTCInit();) }* B9 M, f' J: F( x4 F

$ d) z- L- ^, F  k" \# f/ [) B; E        // 使能 IRQ(CPSR)
, g- s* [  G6 B/ {: W& p" L+ ?        IntMasterIRQEnable();( v1 |/ d! A/ v6 Q9 q) T5 Q3 D
& `( R( t9 X! t7 ]1 m
        // 使能中断(AINTC GER)
% c! x$ D2 ?! t+ x9 P1 R9 o6 R! h1 m        IntGlobalEnable();/ H1 v& l/ V# H( Y, w
: q4 V+ N' I- i' q3 i
        // 使能中断(AINTC HIER)' K9 u# I" e( G
        IntIRQEnable();/ [$ `) U8 r9 Q; D$ A- A
}" K9 y* l; M( _' }# t

3 n- R" ^. t8 a6 e' m7 {
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/& T2 W4 X) d% q4 k' i* v
/*                                                                          */
9 y4 o+ F4 d0 F  z- M! h+ Q3 z/*              中断服务函数                                                */7 {; {6 u- _( Q6 N6 h+ o- V
/*                                                                          */3 D* u$ i& Q6 ]6 D- S. f* c
/****************************************************************************/
( Q" g0 _" Z3 x* A3 R( k9 J3 Uvoid PWMEventIsr(void)& C. e9 k9 Q6 h2 U& F
{( [3 z3 l8 z  B  c. `9 i
        IntSystemStatusClear(SYS_INT_EHRPWM1);
8 L% @) w2 W0 M( T6 W0 B; J7 k3 i1 a/ y- y( x* d# p
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);0 G0 d' n2 Y: X# T( C0 F9 y) ]
}
7 T3 {- r5 Y3 n1 j' m/ @
. s" s% w4 Z) t. M3 k- I" [. evoid PWMTZIsr(void)
  I7 c& F' }. o$ p5 F{% w7 s/ v, }- J  ]$ H
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);6 I) [1 ~! U" `" e0 J1 a4 L2 [

2 B5 k7 D8 i6 C& v4 o, f5 Y    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);  |; z3 }( N$ H9 p0 Q- x
}
! |) I# ?6 [0 a: @7 ^1 D! h2 S$ x% Z8 A+ O( P: |6 d- H' ~, J
/****************************************************************************// T# u  u0 N) c2 |6 w
/*                                                                          */2 h# E# I4 R) t- W/ {# M
/*              初始化捕获模块                                              */. I+ K, B: P: I3 ?
/*                                                                          */# q! |3 W# A+ ]6 G
/****************************************************************************/. G! }4 P) p( ^7 v! p. d6 F* j4 F9 o
void ECAPInit(void)$ N! q, X6 R  a3 ?& C6 j: w
{. X; v  {- |" J: ~8 x2 S6 a5 X
        /*-----设置 ECCTL1-----*/
+ h; s& I6 K; w/ `& M% Q$ p        // 使能CAP寄存器装载
; P$ p8 P  k3 t        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
& a1 B$ C% w- R! Y9 f) |" v0 |  k        // 设置预分频值.. Q* L$ t1 z+ _4 a8 O
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);* I$ y+ Y  H. K4 [6 g$ f2 O) d
        // 上升沿触发捕获事件
. j( z* X+ l, d7 ^) F' i& {        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);/ f& X9 Y% x! m& f
        // 输入捕获后重新装载计数器值.
4 B# b0 Y6 d4 u) ]        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);, O+ I, h; v- O  w( j

# I: n% x  \: o2 N        /*-----设置 ECCTL2-----*/$ K+ l; B  R3 x8 A* a
        // 连续模式
4 S3 N) U3 q0 k" C6 K) x" G' l( b        ECAPContinousModeConfig(SOC_ECAP_2_REGS);- o) [0 v! r2 p- @" [& D' b
        // ECAP计数器TSCTR持续计数# S9 K7 j/ X" V* w% ^) R- V
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);1 j( K7 p& }" p2 s6 I3 ^7 \' \
        // 禁用同步输出和同步输入- I5 |; D6 R/ [* Y$ G
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);6 Z- T5 y& W9 @4 e  h- m
        // 配置 ECAP 2 为 CAPTURE 模式
& t/ E! Z, ^+ n        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
* R1 ?8 `/ E6 {1 Y9 Z
( g+ M# {, o7 I( _2 Q; p# l        // 使能中断
* [4 V6 M0 G% S4 `3 ~2 x//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);0 O5 X: Z8 Y: z
}. v8 [5 }, S  B( n: S0 e& C6 Y
+ o# R  y$ U3 ~& g& \
/****************************************************************************/! U, b. |: h# _( i( u
/*                                                                          */
# h6 Y- I2 T4 N6 U+ O2 X- D/*              取得捕获结果                                                */; [! \" A' V6 K. i- z/ A9 T
/*                                                                          */
9 q" R3 `6 g( l2 o/ t3 K) y/****************************************************************************/
% [/ O/ P4 X: g1 m) w9 Q% kunsigned int ECAPRead(void)
3 E+ r) {0 W# }/ O+ c9 f- [{8 E$ l$ z9 R9 z' m1 I6 ]/ S8 ^  ]
        unsigned int capvalue;. D9 z" S& S! d  ]) T
        unsigned long frequency;4 P6 y& s5 }0 {/ }( n' U
) G/ D1 X6 J# s
        // Event1 中断标志
8 U1 {9 d% {( N( x$ K) z) `        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))$ T7 H) m- @: G5 j( T
        {
3 M2 V6 r- z$ w+ |, M6 h; ~) ~                // 取得捕获计数
: k1 d1 T0 `+ H9 Z. [; E                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
( q' I- ^$ m: k- x4 o                capvalue = ECAPResult.cap1;1 V# \9 W; G5 g  J6 n+ g
* j- k( {+ n5 G) Q; r! i
                // CAPTRUE 模块 228M 时钟主频8 P1 P: p' Y5 m! s8 o/ V5 @
                frequency  =  228000000/capvalue;
: F9 y: U1 `4 D3 U2 r9 T( @( y5 \3 P" a                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
, h( ?& y3 Y: C! h# z! \) |- x% T
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);2 ~: B& X7 R) d: ~: w" ~: Q
//                IntEventClear(SYS_INT_ECAP2);
8 |% V5 d! ?. D/ O  m' N        }
3 u* s4 V* `7 y4 o  w/ |        return frequency;
, _) G3 E; u% i" `}
! f! V3 V' G5 Q: x
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。/ ~* {# l) ?& w7 a7 Q! `% 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