嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家- l( L0 \7 u# e

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
+ |! P! J0 o9 i2 x8 C2 m/*                                                                          */
( s9 Q& M+ q, F/*              宏定义                                                      */4 Y6 {8 z- e5 o% q) i
/*                                                                          */
! L5 x5 c" [7 x6 o% z( |/****************************************************************************/
' S; Q( [6 w" s. y2 _, p( B// 软件断点
' f2 B7 X% k9 V5 r5 I6 w' Z#define SW_BREAKPOINT     asm(" SWBP 0 ");
9 J7 N( |' z2 a: [% T& u9 ?( [% C% v
// 时钟分频! i; W, W4 E7 S
#define CLOCK_DIV_VAL     228; C. {  `2 O! @0 F6 v7 B9 ?1 h! Q# N% L& Q
2 j; P5 b: ~) U# u
/****************************************************************************/2 ?; |1 \2 R' E( t( p
/*                                                                          */
" y) \8 V* z& D2 P' \) T/*              全局变量                                                    */2 S# S0 Q8 s- x6 e
/*                                                                          */
4 I) [0 B/ ]$ N  m6 M/****************************************************************************/+ a6 }( B1 y# z8 l
ECAPCONTEXT ECAPResult;! m! z8 w$ R9 v: D

4 C; q7 t+ s- P4 P8 R3 @9 s+ S/****************************************************************************/3 w1 [( {0 W/ r. l
/*                                                                          */
. H' ]& s7 a: Y3 Q6 x/*              函数声明                                                    */$ ^1 q  Y3 L- `, S* {, F, o
/*                                                                          */
/ V8 O; S+ @( M/****************************************************************************/
' @2 t1 T" s6 ]4 Y6 L// 外设使能配置/ M+ m/ N6 N# c
void PSCInit(void);- J/ t  p3 P1 X# u% V

2 [4 D- e* n4 F9 g! S! ?// GPIO 管脚复用配置
3 r* P  D7 Z2 xvoid GPIOBankPinMuxSet();
9 F8 S, N1 b" ?  ]" g
! U- K  W1 [& \% }// 产生波形
; a8 }- |6 Q4 G+ f+ r, Cvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
, V3 J8 C# t) L8 X5 r* Evoid ChopperWaveform(void);
. J" q& p8 F" [0 m- |7 k( @8 i. y  h
// ECAP初始化和读函数0 f9 \2 C* ?: X6 {- f! a3 w
void ECAPInit(void);
6 i9 n- c$ R1 N" z! U) w2 ?unsigned int ECAPRead(void);  G# V- f3 M  E
% F% |9 k* e; ?) x: O* C  v
//ARM 中断初始化' Y4 s5 ?2 D& Y% H% A. U
void InterruptInit(void);
  d& D) x" a+ ]% w1 t! e! E$ g  i0 Z. P2 U
// PWM 中断初始化) H1 a, M1 ]( d: W% P7 M4 L! w
void PWMInterruptInit(void);
$ j# R/ x% M: t7 O! n// 中断服务函数
7 m4 Z* w3 G8 p  |3 ^( n9 |8 H// PWM 事件
) E' P1 q. d6 @0 q/ Rvoid PWMEventIsr(void);
- X" [  V/ C/ f: V& l- g; G// PWM 错误控制事件
5 C) e' J2 c6 {8 R- Nvoid PWMTZIsr(void);
* |* C! A. d8 X9 ^' P$ ~" l9 N
# P& M9 e' m  }# q' Y8 B3 Y+ M2 K. j/****************************************************************************/
& {# p" x6 [5 o, x' I9 V; I) N/*                                                                          */3 N/ e- R9 A- v  ~5 V& O
/*              主函数                                                      */$ K1 R6 e/ H( k5 s" R5 ^% @3 z
/*                                                                          */+ d$ |) d# b! U
/****************************************************************************/" g( F# ^9 m6 y4 g/ P
int main(void)
/ _! J4 f; C2 C$ y) Z. R" J4 Z& \{
! T/ D7 t# v5 B- X        // 外设使能配置- |6 W. k7 B3 f& }
        PSCInit();
, F. R- j2 n. u' V) ]
1 o; d9 S/ b" |+ G' Q( V& e        // 初始化串口终端 使用串口2: O1 f  p7 q, V
        UARTStdioInit();3 C$ X, @  b3 `) ]0 r
       
  H8 U' E- g% {  x: G0 e        // GPIO 管脚复用配置
7 R7 `1 k. _/ u0 |        GPIOBankPinMuxSet();# |( v/ u  X3 w2 V+ l
0 _0 a" W1 Y3 T
        // ARM 中断初始化- {& j: h8 V8 F/ F
        InterruptInit();
# k: U) o, r- u6 J6 O6 b% @4 \% ?9 p- h2 {
        // PWM 中断初始化
/ ^6 O2 }% j1 [' I: k  c  U- x        PWMInterruptInit();
" l/ a( j8 c. g: w) ~) z! h. Z
' s, F8 p  j& r$ v        unsigned char i;: |1 E3 A+ d4 e2 O7 a5 b3 [
        unsigned int j;
* d0 W3 F8 m( w; T5 c# I; Y5 n
* k. n% a0 E7 g7 H0 U. S        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);2 k3 B. Q7 B+ }$ ^  {, T
        UARTPuts("------------------------------------------------------------\r\n", -1);
4 L9 b; t$ S4 M! b8 B        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
$ H, }1 i: h% y+ g# O. B, i! F        // 产生波形
7 O, Y% Y0 Q3 X  o- U# x$ D        PWM1ABasic(25000,50);% L+ j$ y" Z: U. P: [
- I1 \% ~, K' q8 k# M; o
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);; {; p& ?! c/ P
        UARTPuts("------------------------------------------------------------\r\n", -1);
8 q! x; k3 N* T) I2 w4 I
+ f; |7 w2 X  k/ T& R! Z! Q
1 P1 M6 U2 }, F" \% R$ E7 _8 W5 _+ Y9 S# Q5 [% |6 M
        UARTPuts("------------------------------------------------------------\r\n", -1);
6 u3 `8 w4 ]/ a! Y( R7 j% J# A        UARTPuts("                    C6748 ECAP Test\r\n", -1);
; L- a! Q% }# E        // ECAP 捕获初始化/ x( D) V/ o/ X
        ECAPInit();
' Z3 K3 _1 e5 h6 a' U4 t        UARTPuts("Initialize ECAP.......\r\n",-1);
5 z. M6 s; R1 P! [6 X* o" n& R+ \2 h5 Z        for(i=0;i<5;i++)1 `, i$ c) H5 @5 y# w: r
        {& A+ z/ F" _- U7 ^2 {7 L2 t
                    for(j=0x00FFFFFF;j>0;j--);            // 延时0 z" m+ @/ o. ?4 a5 N
                    ECAPRead();% b% I6 k" ~, F: v: v
        }
- K% a; ^1 c8 o) W! |& P  @6 J3 z        UARTPuts("\r\n",-1);
8 J$ P; s; `& q: @5 a' d8 I        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
* C5 D6 @: J* S        UARTPuts("------------------------------------------------------------\r\n", -1);& t* d* c* J$ u$ Q
3 I; [9 A9 e, w
        // 主循环% @8 s+ H" ?8 I5 \8 y
        for(;;)
) w: _$ d; w. l% U/ H1 O) R' {        {& A) |! I2 J7 C

6 Z5 e. {6 |5 B        }
# Q) q* [) O/ c+ i0 h}$ Q# s4 j- m0 g4 p2 [+ y

+ w. D* m% D6 N/****************************************************************************/
- a( E% G9 F: e% H/*                                                                          */- V4 C3 }+ V" d3 \, _5 o3 {
/*              PSC 初始化                                                  */
# ~9 w9 D/ k/ l) z! S- n  K/*                                                                          */
; H/ H7 a6 |, A4 h( U/****************************************************************************/
0 s5 z; \# ~  `5 Evoid PSCInit(void)$ S0 g7 n' v# D! U, ?2 U
{
5 @0 F% l9 K6 C; ~; j        // 使能  EHRPWM 和 ECAP 模块9 b4 b! O) R& M+ I3 s: `' i' }
        // 对相应外设模块的使能也可以在 BootLoader 中完成& p0 z8 k3 p" ~/ N( N1 c" \
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);/ p  \5 ^6 f& i3 R: Y
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
4 J6 p/ I; }( s- g5 {}5 Y; S2 ?& z0 j: f' U
* p3 a4 i$ _( u' a4 f
/****************************************************************************/
* l" B6 v1 M$ o% b( v7 h7 z/ F/*                                                                          */
8 q, @8 Z' B6 @) E& {2 H/ }/*              GPIO 管脚复用配置                                           */4 f  b, ?; |" @% T9 a
/*                                                                          */
; V) H- t" \) g0 [4 t1 ]  |( u9 X/****************************************************************************/
( N$ ~; i/ r3 g7 H  Q  R4 xvoid GPIOBankPinMuxSet(void)
5 b3 p5 A- J# ?, t* {1 P( f8 N2 U/ Y{# F& A! F& R) U. X$ U- l: ~
        EHRPWM1PinMuxSetup();/ A  T# O0 W  j0 Z0 y. P9 A& M
6 Y8 F: W& ~7 s6 F1 _* y$ P1 M
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
& E" n" Q9 W9 N/ }        // 作为捕获功能时管脚方向为输入
0 I8 t( C* |8 J% B! Y8 _        // 作为辅助脉宽调制时管脚方向为输出; F, g( F  C6 |
    // ECAP2 / APWM20 G3 `$ @) |" J
        ECAPPinMuxSetup(2);; N) ?. H" ]1 e
( L$ h2 T% G& D0 u, L
        // ECAP2 / APWM2方向设置为输入
3 X4 `, W. t+ C; K$ [        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]  R: w4 _# {8 b8 k
}) Y3 L" h" _* G, a6 R6 O% S
9 f, t$ {7 }! y0 y$ ?
/****************************************************************************/
- k% m+ a- D5 ?! U3 U/*                                                                          */
9 ?" }, Z8 ]8 ]* K2 T. Q2 f6 X/*              PWM 输出波形                                                */7 k, h* ~' b+ [
/*                                                                          */# e; m' }" X: x& ?
/****************************************************************************/0 o& O0 ~- R3 d7 l; V& M9 i* z7 m1 N
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)% H/ L7 u1 r5 |9 N
{
  H2 P1 l- B# V; i; j, i" I) Q5 }' |    // 时间基准配置
7 j9 ~9 j$ `+ {; ^+ _# \    // 时钟配置- r! s' l9 X5 q7 @  ?0 D; {: e
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);; y) |( f6 V6 `5 S
. }- ]/ P' k6 t6 g( d3 T6 f2 F
    // 配置周期
5 }: Q4 [$ `5 q3 c" y" V1 H9 }7 e    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,; j& C; C# d# v, e+ J  F; n
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);8 w% M: t2 }2 |) H
6 a5 h( B6 q' `- m& X
    // 禁用输入同步信号* B- f( M) N& t3 Z6 J, m, W- T
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);5 d; ?! E1 C( g
/ [  a6 d' U- m* }8 \8 b
    // 禁用输出同步信号) }& b" p' d2 J8 P/ W4 U
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
6 W7 \- \- \; x& d: A
+ j, G5 i3 G+ e4 i) j    // 仿真(DEBUG)模式行为配置+ T4 B7 G2 E" y( ^- f! n
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);* D* z& ~/ w% o8 B

( S* C7 t0 V: W0 `+ G5 d- g    // 配置计数比较器子模块
6 E6 J* U# E9 G9 p/ Q# L    // 加载比较器 A 值
7 S- ?' s! Z5 m+ a    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,# }) ~5 F& J+ N3 I
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
& I' P3 z3 b% f$ x1 G7 T4 \9 M0 k$ h8 m5 D5 e
    // 加载比较器 B 值3 A( W8 o$ p) |2 t, @, x
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
6 p* t( G+ C/ Y. [6 [& m                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
* g: n% p* X9 C# L& M! |! o. H2 c: ^5 F9 s0 b
    // 功能限定配置(输出引脚触发方式设定)
! K1 L9 V- F  G    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
) D0 Y# J6 J9 q( t: D- s    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,9 D" t4 J" G2 [3 Z! R& O  p
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,6 J$ ?; B7 P, e$ n
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
, C: N' o0 R; u( u0 d7 l% @5 H% Z! Z1 Q* }
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
  c: Y6 |7 Z  M    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
' Y( f) v) k; y. t- ^# f
9 @0 \1 p/ T+ A' G; Y4 A    // 禁用斩波子模块
- y8 s7 A9 {$ P: ^    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
6 h% F( J5 n8 p% K4 I; d4 @2 u# ~& [6 O& Q1 i( u6 L
    // 禁用错误控制事件( V1 F' z, I; h' d
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);+ J) D* }, u5 ]' ?, \
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
, n" B# {, Y- x% q. ~! `- |
+ r) t- B7 g+ R3 v- K3 ^    // 事件触发配置
' `2 T! M( A& l    // 每三次事件发生产生中断
3 z, Q% d$ S2 E( N9 ^    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);7 W8 v) J# C* }8 f8 T) u0 m$ Q
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
* {! N+ J* C" y6 U3 j3 u. z0 |    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
& H. O  ?; r- t0 j' c' d* y+ \6 n    // 使能中断
+ C9 m: E. V& ~8 v# H8 B    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);) _4 f' b$ T2 a4 ^4 @/ x

3 N7 |; G/ X8 G    // 禁用高精度子模块' `6 Y$ \0 D8 ~. [
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
  s& z6 o( t. S0 T0 u8 \
) x  Z) c) \6 F    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
/ x/ x$ X- L# x/ {0 N7 D' V* x}& Z, a: M4 T4 B" y- q
$ I$ i$ f3 O( v% y
void ChopperWaveform(void)( H# J- W- M% I4 q' e! Q. x. B2 j
{
: w: n# L9 D) m9 z    // 50% 占空比: N( b2 [  r5 A( O' Z/ C. V& V3 S- ?
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
, C) `& d: v8 Q! S/ p) U& w    // 4 分频% Q: F; o& ^/ e
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
# [5 p0 D. s. _8 Q( A+ c; E    // 单个脉冲宽度
2 A1 _8 t* s" J- d0 y" S# }, j    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
; @. O: K7 I, L1 V    // 使能斩波子模块
. ]* B( [4 m" \    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);0 m5 W4 W8 |3 x9 O# U& m) d
}
) r% d9 i. r4 V) ]7 z# D, y: N& k
" ]. `3 e, D' k8 B4 \, r/****************************************************************************/
" z: P. ^" b: [% ]3 k3 y0 R/*                                                                          */0 Q0 b9 o( O% _4 u, S" e
/*              PWM 中断初始化                                              */
3 f1 Y9 R' `. s/*                                                                          */
: g5 `4 U/ ?; w. z/****************************************************************************/6 @' f9 k! i$ |/ |7 e/ L
void PWMInterruptInit(void)5 i. x! A. m( i" A7 t. Y" ]
{
$ _, W) I, ?# E1 G4 d- s        // 注册中断服务函数
& Z2 j4 `0 W2 Z5 v* C- t; x        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);9 X7 m0 a/ ~) w3 b$ g( S
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);, D* f) m. ]) J
% `% a6 Q* R0 ]7 I7 Q
        // 映射中断
6 R* {. b8 Q$ w- X        IntChannelSet(SYS_INT_EHRPWM1, 2);
1 H3 K3 o, \+ }  B4 X        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
$ f0 g4 i9 J! ~% K, t
, ~* V2 O. {! r6 p0 a! e& b3 y        // 使能中断
. M! f! C% X. L& D' \4 t; u        IntSystemEnable(SYS_INT_EHRPWM1);: @8 c2 x2 k' x
        IntSystemEnable(SYS_INT_EHRPWM1TZ);
, u8 e9 Y4 g7 D}
- h% d0 s) k, q9 b8 x' s! X7 r# _0 J  \+ ^. G
/****************************************************************************/
# Q$ A. [0 r/ R- x$ l/*                                                                          */" P# F/ ~2 E$ B) k- B
/*              ARM 中断初始化                                              */
# K$ ^, j% ?& x. K! ]$ P  @/*                                                                          */% \6 v6 P  B$ l' F
/****************************************************************************/5 h$ c. W& w* B! e: O
void InterruptInit(void)- |7 [1 c' w0 r, j& L
{
* U# Y; o" G+ T- u& Z* i        // 初始化 ARM 中断控制器; p4 _1 c( ^4 b. A. W0 U
        IntAINTCInit();
3 A  r; X" D9 c' ]/ H8 ]
( G% s5 u/ O$ I% f/ n1 p% e7 j        // 使能 IRQ(CPSR)% ~2 m* A9 J9 r
        IntMasterIRQEnable();
! \' e- s* t, T3 C. `" X5 S% N  V
7 J% A% C. ?2 r        // 使能中断(AINTC GER)# u4 C3 O& h( p9 p1 h" ?% ]) p* H% _
        IntGlobalEnable();
0 d. A7 X5 A2 L' y6 T  N5 @! e9 Z5 z3 _6 n+ N0 j& w, B
        // 使能中断(AINTC HIER)0 u- n% D+ I& O
        IntIRQEnable();
/ c0 H! L8 u7 {$ n: x& O, V}
" p0 P# b8 d, N  D+ J2 {, c9 b
) e5 |+ @/ Y0 k$ W
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/
$ @  X) S. G& ~/*                                                                          */
$ ~) w& q* d/ s+ R7 C1 C/*              中断服务函数                                                */2 ?' [$ x4 `: O6 F; o
/*                                                                          */) N8 Y# M  \, v" p" c; _
/****************************************************************************/
: a  q4 Q7 Y, m2 N) N8 dvoid PWMEventIsr(void)8 E8 A6 l" w. Q- s6 ^
{8 \; g6 P# y& U* X2 t! L* R; w
        IntSystemStatusClear(SYS_INT_EHRPWM1);; d2 K9 x9 q4 I( C! r
/ y8 k- F/ {; h* a  H' z
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);7 ~. _: y/ r1 ]% g& \8 z
}) ~* }: K% Q6 r! ?1 ~

2 P- P) R6 ~- b, l  h' {+ nvoid PWMTZIsr(void)
- e- K& l" G6 m# i{# X0 G3 v5 b% d9 c
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);' F  ?% G+ t6 M) I) q* k1 j

% E" U1 y) l7 d5 ]1 _4 F' n% E    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);. U; u. q9 t& P
}9 G8 a; _9 W$ H( ]! b1 N

* [! K2 A+ q, P( t/****************************************************************************/
! l* i6 c4 p  i1 v/*                                                                          */  P" p. o, R1 v  R
/*              初始化捕获模块                                              */* p1 ~5 d0 n4 R. e% [
/*                                                                          */
$ u% U( s0 n1 ~/****************************************************************************/# K9 T( z, B; j, N" ^2 r) i. W4 q
void ECAPInit(void)2 Q* U  ^$ I$ _& V/ M7 |
{
- h, Y9 Y4 b. K" h9 n1 b        /*-----设置 ECCTL1-----*/5 j! h! C5 C0 h& u
        // 使能CAP寄存器装载
; C  R9 }8 c* O! |0 h! `2 q        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);7 R$ i) |, q& ~9 K
        // 设置预分频值.# \7 z2 I9 j8 N4 U0 B
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
6 e5 E6 X. m# G1 C3 V  `: G. l        // 上升沿触发捕获事件! N& i7 ]8 e  M% X
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
5 K" k) n9 u8 \- F) f; u        // 输入捕获后重新装载计数器值.7 b8 e( @; a) R1 \& s) ~
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
9 m; i# B$ Q; ]4 ^! ?# H
8 `! j0 H/ p. v  U9 C        /*-----设置 ECCTL2-----*/
5 l: h- X! }4 i. }9 Y4 j/ H        // 连续模式
$ T+ z8 Y. A9 q9 C' I. o        ECAPContinousModeConfig(SOC_ECAP_2_REGS);& X' E0 e9 a/ p0 R! U! L
        // ECAP计数器TSCTR持续计数
8 ?  U& [7 D5 w2 n% O# {( {6 R        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
; \; k' E! Q. @/ d9 M" _4 Q        // 禁用同步输出和同步输入
, {0 I, G+ w7 d/ o: \6 x  T! M        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
( x. o0 z+ M8 v        // 配置 ECAP 2 为 CAPTURE 模式
3 a& u, I* }1 A! I: V* W        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
; l2 T" u9 W  k* n4 b9 ^6 C( K7 N4 @) g* b/ f' @' k  u
        // 使能中断
: M* D; Q& s( p. V//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
( Q) R1 g% e: w7 p8 z: I}+ M# d2 A$ N2 N: }
7 o5 X2 ]7 x& D6 C) q
/****************************************************************************/
: W; V' l( d7 E0 A4 R/*                                                                          */5 u# T* B. A. h
/*              取得捕获结果                                                */& U* R2 o0 ?' k* V6 Q
/*                                                                          */
! ]* U  y, Q$ r* m/****************************************************************************/4 m& D+ m( j. r% P, L% D8 L% Y
unsigned int ECAPRead(void)
  r& l! |  M" E8 W. }# P7 [$ w{
* ~3 G+ p, t: C- u/ [% f; Q# h5 D- I        unsigned int capvalue;1 H. d' w8 |- d) U
        unsigned long frequency;
5 Z7 E/ {5 T# |& w- t/ c1 v6 m1 y% r$ p* G7 p
        // Event1 中断标志, f' {3 [5 k; f
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))# N% T5 @1 F8 m8 m6 r
        {
. x1 \/ B; `4 O7 T; s                // 取得捕获计数! N, I7 [3 d* E: i4 ~0 U, W8 R/ m
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);  Z6 W; ~* s* Y* q2 l  L
                capvalue = ECAPResult.cap1;4 A0 e7 T; G& g% ]! u% Z/ V( Q
( T6 E) X+ `9 q7 U. t6 U5 N
                // CAPTRUE 模块 228M 时钟主频4 r) \) }  {, c) u4 p
                frequency  =  228000000/capvalue;
/ I) W) C( u, N                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
! ^. }$ f) d. |8 {* |# X/ L/ F
0 ^+ G2 ?' G0 f5 u" _4 @  b" ^2 T                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
3 q4 {9 f) l' C# q# Q: l& q//                IntEventClear(SYS_INT_ECAP2);
# a5 k( }6 g7 v$ g        }
9 ~7 V# o) f& Y% U        return frequency;7 E5 C% ?0 x# A  e9 k- T0 ~
}* g8 k! H" L" b# A6 i. _

作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
* ?( M9 @' q' O, L) E; @5 ][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