嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家$ A; m9 C) p& V

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
- _$ S  ]& z/ ^; U/*                                                                          */
  a* O9 _( T( z  z$ }/*              宏定义                                                      */, f& O, o2 g- j  v& c
/*                                                                          */* f; B$ p( D6 m) i
/****************************************************************************/
4 E8 q. g% E4 o( O// 软件断点3 U( I& u! B1 I4 p( v
#define SW_BREAKPOINT     asm(" SWBP 0 ");
4 ~$ f1 q. R8 l# m0 p" z* @9 P' X6 G- h1 W) ~+ u6 P
// 时钟分频
, x+ W. P  d! g1 H9 {2 C6 q#define CLOCK_DIV_VAL     2284 G3 Y( s7 K! M# g* f* U. D1 V
; W* E4 H5 H9 ?6 e* `, F0 B
/****************************************************************************/1 A& h8 o9 B. V$ A8 b3 y# c
/*                                                                          */
) j4 M: e7 d2 E' G$ ~/*              全局变量                                                    */3 Z4 |: L/ u" a
/*                                                                          */
8 a' `& e; @& }0 \1 Z& ]' ~/ r/****************************************************************************/
; \3 v6 s) L, d4 ~- y, z- k: Z/ WECAPCONTEXT ECAPResult;, u: z- Y- |; M& W  A) c
5 U: T0 f" L/ O" l  Q0 Q/ u
/****************************************************************************/; Z+ s( P/ m9 H, r, A9 Z  `: o
/*                                                                          */  x) ~8 h% v% o4 E8 S' v3 [  J0 _
/*              函数声明                                                    */; g: r- A$ }( F8 P- |/ j
/*                                                                          */9 K$ q* w: m# Z! B0 H
/****************************************************************************/
5 i5 u  z" N6 r: y. E: b// 外设使能配置5 k! U+ e0 O! D! R
void PSCInit(void);
- r6 h9 t3 u* r2 b7 v) L/ A+ F9 k6 i5 `7 s5 d
// GPIO 管脚复用配置8 w- G& V5 e; P
void GPIOBankPinMuxSet();  N: l4 K! Y, L: [9 ]' j
% D: g, p$ ^% p$ z8 ?  A9 G
// 产生波形
5 D& R. y# a  U  k8 hvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
' ]4 n% b8 M9 J4 lvoid ChopperWaveform(void);/ d8 Z$ N& n# e. k
4 f' W1 X+ V1 D" P
// ECAP初始化和读函数; x3 u# q- R8 V# s, h+ G& y
void ECAPInit(void);- v- r, _( m% `
unsigned int ECAPRead(void);
2 \) n8 x" x* L) Z8 |( j! ~, N5 G3 r8 d2 \' H
//ARM 中断初始化
$ \! I& S" C1 q( t0 n, U' B# o, Ovoid InterruptInit(void);  b6 a  M2 \8 C" e
* M$ J7 v0 L' }2 O% F9 o
// PWM 中断初始化1 N- q  T: \# @2 [! F
void PWMInterruptInit(void);
* m; D8 f% x. g& n0 [// 中断服务函数) L, N1 Z1 x( G6 {. t
// PWM 事件
) e) s8 X& B; a7 o! g! Lvoid PWMEventIsr(void);/ }+ Q  S* i5 M+ r" z1 u, P# x
// PWM 错误控制事件
& v/ C; r1 O2 h: Hvoid PWMTZIsr(void);
  y& w& ]- _7 F- @: I% }. j: b. D6 n2 e! @( ~: @% ?
/****************************************************************************/7 i4 y3 o  D. [- @6 |  `
/*                                                                          */8 N5 {5 o% q& _. r3 X
/*              主函数                                                      */
8 V& [5 A' x  U4 `/*                                                                          */
+ s# n# ~  C7 Y8 \/****************************************************************************/1 e: Z& a  Z  C  G5 t
int main(void)- N% g( _/ K: G7 i9 j% P" T
{4 K) H- a( J7 b+ V7 v
        // 外设使能配置
3 `8 q" w$ u4 i/ H8 {3 O$ @        PSCInit();' u( e9 S: r4 o4 E

* T! l  f) R" B# j/ A+ o+ b; r  n        // 初始化串口终端 使用串口21 t: c4 B* Q7 P. h, u% L( W
        UARTStdioInit();
  U& d7 Q$ ]' @: \% n6 v+ A       
% P1 n3 [0 P' i5 I$ }# _  \        // GPIO 管脚复用配置: f9 f  ?- C1 s# z+ R" A* F
        GPIOBankPinMuxSet();
6 g+ A6 U$ q1 C+ Y) ]% j  Z; r8 a; ?. d4 u) Y
        // ARM 中断初始化
! ~& R" @3 j% L( A6 d        InterruptInit();( ]3 C. K" ~' t" y  v

1 v7 N( G7 {8 N8 G1 W' k( h6 L        // PWM 中断初始化! ]/ T2 ]# N# _& E1 n* S" v  @% n
        PWMInterruptInit();2 B: `+ i1 m! ]

9 B$ g. b+ f! n" a% [        unsigned char i;
4 B2 u3 I3 H# `# ~        unsigned int j;* h2 u4 f# {0 {: x. |
" F$ M0 C: y5 C, u
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
( D; b/ m+ _5 Y, }- |) I0 q        UARTPuts("------------------------------------------------------------\r\n", -1);
% C4 V, @( U% v1 J1 H' E        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
! y& `! C' c- o9 Q. ]; ?        // 产生波形4 t8 s% c% c& p: @. f8 b1 B
        PWM1ABasic(25000,50);
7 R8 K  M% Q4 P1 A9 d& Y; d0 M6 G  d* y
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
9 \. K- P# v& a9 x% m        UARTPuts("------------------------------------------------------------\r\n", -1);
% I9 R% x- K% k) P7 K- b, X6 n) o0 v- c1 r  X' y
3 ]  f* t$ d3 q9 K. M- [

7 E0 C& G5 ^1 e. G9 q& {% s8 ?, e        UARTPuts("------------------------------------------------------------\r\n", -1);
0 b! B( v& |& y. n' L% N) r        UARTPuts("                    C6748 ECAP Test\r\n", -1);
1 t8 W9 g6 Z9 m) B& x* V3 Y4 c        // ECAP 捕获初始化
0 _% d9 ^* B+ N5 I4 H; N        ECAPInit();' {& c* F2 {+ V& [6 O  }
        UARTPuts("Initialize ECAP.......\r\n",-1);
% K& g+ X0 Y) A# y: ^% D        for(i=0;i<5;i++)) f' c7 U/ C  f: }
        {
2 c: l" m4 ]2 j2 [                    for(j=0x00FFFFFF;j>0;j--);            // 延时% w% T/ f# _. t: H: ?
                    ECAPRead();8 J# v  P  m) A8 W, v
        }2 b5 s' H2 b2 [: m1 L  d6 o. V
        UARTPuts("\r\n",-1);' W, H- k# ~! f0 b5 n* c
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);- E0 f4 _  g; V: Y& _
        UARTPuts("------------------------------------------------------------\r\n", -1);
9 \- N, A( e! ~8 w" d# ~# U1 L* G% c  f' X
        // 主循环: w7 h! d* h2 D# a) ~
        for(;;)
3 }6 f8 c) x8 Y& j" s        {
/ w& o8 ~, t! q( {3 L. l! [
- v- [- g- ]. I        }" j1 [+ O8 t0 a
}- d0 k. N) W; ~

7 s1 W( K/ N. M6 L; C; R/****************************************************************************/
, A8 \/ C9 C$ ]% b; j/*                                                                          */
$ F* |1 d$ L" d* _& ~/*              PSC 初始化                                                  */5 O# c# A* S' d8 ~: m' x2 x
/*                                                                          */$ T4 I/ i: s" R/ I5 M
/****************************************************************************/. `, T: K$ X1 O% C
void PSCInit(void)! _3 [9 q2 Q9 }: t+ V% k6 f4 m
{: J2 d# M7 q$ q' N
        // 使能  EHRPWM 和 ECAP 模块# W! e; \; S) F8 O- @9 j
        // 对相应外设模块的使能也可以在 BootLoader 中完成
6 {" u& F) J- @    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);+ ?8 d7 J2 N  A7 i) j9 q7 ?+ n
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
( p( ^8 [3 R5 D/ F}
1 R: w- Q/ K3 c, c3 h1 A. F
, Q# z" F; F& D7 {1 r6 p- H/ L/****************************************************************************/  X# `; \- A' g; D, t8 o
/*                                                                          */
7 d3 W6 w" b6 L7 y7 |1 l/*              GPIO 管脚复用配置                                           */
0 u0 g7 ^9 S& K2 a/*                                                                          */3 _  n% \% |3 B# p  u( I: u; p5 [
/****************************************************************************/
5 g& C1 i) b1 \5 bvoid GPIOBankPinMuxSet(void)2 m5 g8 |$ J0 {8 y. {. h+ m
{
8 e1 J7 x/ t6 C        EHRPWM1PinMuxSetup();
- Q. ]2 R6 I7 _0 W
# O3 ^* U. s$ B        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
  }4 P7 ?4 H$ v  |7 W1 y1 L        // 作为捕获功能时管脚方向为输入
, l5 L0 A8 @$ F# e5 r        // 作为辅助脉宽调制时管脚方向为输出4 n+ I! n- L, Y* {8 v/ |
    // ECAP2 / APWM2
* B4 S- ~4 g6 P: z/ e) l        ECAPPinMuxSetup(2);% x6 n9 f5 p7 s' r

- o$ j2 P/ z% f* F$ I        // ECAP2 / APWM2方向设置为输入
6 C( i4 U; }3 E4 C3 E5 T; X        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]0 C5 M$ i2 D9 N% P; Y
}
: k! U$ x4 P/ X% S" L4 I( E( m+ h
, m) y8 J: L% j; I( |% A/****************************************************************************/
9 @9 O" y- V: \. b, t) R  l2 }/*                                                                          */
: Q5 d( u' M* m+ T0 h/*              PWM 输出波形                                                */; P4 L# X( p* u0 X5 n* `: r, L3 `
/*                                                                          */
/ K9 J! a! l; F% z4 g/****************************************************************************/1 s& U( k9 w) }& P
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)8 r4 |  Y, ]: e! i* u
{
. ~5 _; H! h$ z! O; x! X    // 时间基准配置# {) u' H# R8 O- V5 j/ E5 [
    // 时钟配置
( [9 o6 n* e; A    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);* N4 C9 P. E* ^) w0 n

0 \) l: I. Z' ~; o; r. d7 w. V    // 配置周期' f2 H" }) Z2 i) v
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
+ y2 K* ]+ v3 ]/ L                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);# v2 w0 q2 ^: D/ N0 R1 \

& P& H* p; O' V, j7 B0 y    // 禁用输入同步信号' t( g# C$ Q! A  t, u* a2 p
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);0 U  i& j  t" D# F
: C% G( D3 L3 |- M3 e) h8 C
    // 禁用输出同步信号
2 U% R9 f: x  d- M, e' o) S  c! a2 S& W    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);+ F) C. H& Y8 p6 S9 L8 A8 W
  c  N+ v9 O/ |9 x3 i
    // 仿真(DEBUG)模式行为配置
4 M' ^! Y; {5 z/ F8 @% y    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);* T9 x8 H: K* h

( j) S+ [* D0 |2 |8 I2 P    // 配置计数比较器子模块$ I! P! i+ V7 r, C9 R
    // 加载比较器 A 值
) i9 ?6 ?+ H1 g. o; d9 n+ k    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,$ P. I2 I; w4 z# {8 |9 N2 k
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);/ K2 q' U. s8 q1 M. z; ~7 t: u
! k' [. I2 m3 b0 j% }8 _4 x
    // 加载比较器 B 值7 o& p& r1 u9 G+ O& v
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,7 o7 x4 u5 Z6 d+ @( z- u4 N4 a
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
" c* S/ P/ F3 B3 e- H6 m6 f" _; d, d$ D+ }" i
    // 功能限定配置(输出引脚触发方式设定)
( [5 q% Z' V, l- T: e9 f5 Y- i& Y    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
$ T% X5 v2 n  C1 f7 m, m! m1 D7 H    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,0 x- x  R( O+ J8 j4 E& h8 r
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,# {0 }) X" d- O2 N- D5 L
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
- g3 [7 S4 M/ g) m1 O4 I( d/ Y1 j3 R  {" Z
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块" |% `( O$ A3 i8 ~. g
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);. B  I% h& r+ \2 [2 H. E
. I; G5 }1 G+ U  Y" h$ g3 k( t3 F+ k
    // 禁用斩波子模块$ j. j- t2 G3 K6 s5 G
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);  E4 ?; X7 i7 Z: Q1 q
0 N0 ?  P6 X. G- t9 v
    // 禁用错误控制事件# a5 L: ~, b- I8 m
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
" O) G9 T5 a% l2 k6 q2 Z7 g. b; R; l; S    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
$ c9 @! k2 Y5 V. s, B
- ?7 r7 ~& k& m. A  _5 n; F5 ?0 W    // 事件触发配置2 U% K" F, g, _' n! J; Y
    // 每三次事件发生产生中断
+ y5 `" [# p8 u    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
: G! w4 d( i7 Y1 S* r8 [% J% x    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件4 u/ y1 q6 u9 P& O
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
% W, ~' C5 Q8 M: h9 t, G    // 使能中断
+ j: C- S) r; ~3 s3 o! w    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);2 {  z8 O$ V; J0 B

/ [3 y3 r! m3 {1 O9 h1 x1 [    // 禁用高精度子模块1 Z2 T) u% V, m2 j0 @& s" G
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
* u4 m" o5 W3 ]% q3 U6 `; O' i5 O6 }$ k, E9 x. `& C' v7 L; o
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
/ a. O1 f7 G2 o; g; x" G}5 D' q  ]4 }2 k- Z' x
2 m2 q; o/ z6 ]* ]7 K; H
void ChopperWaveform(void)
9 B0 \) ]7 e9 s& L! f! x{
- y2 c) l6 b6 y    // 50% 占空比, j  Z2 K9 l) Z
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
9 Z6 k" v# X- b. w8 `    // 4 分频( G0 g$ m  b, d+ p! W& M
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);. J! X( Q4 @& S
    // 单个脉冲宽度
4 S$ Z' V/ I/ R9 C$ A4 K* Y% W: r    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);4 \: C6 Z5 ^! g9 `" l
    // 使能斩波子模块
5 }1 [& v- H2 e" x) g. L4 W: Q    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);4 \1 e. G' M$ v; a0 t
}
  B! T7 S( R# f
  T4 [1 G. e  w2 p& s/****************************************************************************/
5 j, z; _/ r9 n9 \! j; J/*                                                                          */  i$ X1 U8 t- D& }8 e% \+ q5 |1 A0 A
/*              PWM 中断初始化                                              */
5 R3 B4 _  q, P3 P3 I; S9 L/*                                                                          */
; c/ `( m* J2 I6 t6 v- u/****************************************************************************/& B- q4 Q" J& i  I1 O" D; ^
void PWMInterruptInit(void)* z% N' m' r% |( r
{
/ [/ w: H9 O; e        // 注册中断服务函数
0 |/ z# \1 O) ?8 o        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
3 o& o. L$ ?2 x; y9 f; h1 G7 {        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
" `% X$ {2 u! I$ Z2 w5 I/ F8 E
8 \/ v2 S) a/ i) l        // 映射中断$ G( j3 M" u9 m
        IntChannelSet(SYS_INT_EHRPWM1, 2);
, `7 U; n1 u+ ^  C. t        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
9 [$ w; ~. H2 w7 K7 y! C* k/ M
7 i  n4 M+ f* |  @, W+ d. M        // 使能中断
9 L) e5 f" b* B, e! T. z  o        IntSystemEnable(SYS_INT_EHRPWM1);
0 T. D( h6 V' A; y8 b5 Z) n: G, e' c        IntSystemEnable(SYS_INT_EHRPWM1TZ);) [  b' X+ X! j6 U5 X; D; a
}* y) i" {  P* F) g0 t+ Y! A

- u8 A# s9 t* X3 ~/****************************************************************************/  t. [* ^1 d  L& E& ?
/*                                                                          */8 K& k& G' @6 Z3 q1 t. [% u
/*              ARM 中断初始化                                              *// X  |0 }; y3 r" ]$ s& P- k2 I
/*                                                                          */
3 V) G# W1 S& n$ m/****************************************************************************/
2 b( z: q* Z- s3 {; D/ Dvoid InterruptInit(void)+ {0 i4 k5 y8 T) r- j& N
{4 h  P; |- E' \4 x
        // 初始化 ARM 中断控制器
& K8 D( l2 Z4 p# Y9 {; I        IntAINTCInit();
9 Q" }- d1 z4 B2 Y
: P. u$ o% T% J        // 使能 IRQ(CPSR)
( r) F- v* j6 z5 l        IntMasterIRQEnable();* h+ Z: R0 W5 V5 S1 Q

: n/ J# s5 ], ?        // 使能中断(AINTC GER)& n& d5 D0 Q* \
        IntGlobalEnable();
" `0 ~) {! ?/ L
: e5 w% t9 i% O# v* P7 ~, F        // 使能中断(AINTC HIER)
: s: ?3 ?* i0 f4 Z6 W        IntIRQEnable();8 x# _) B( {9 E$ u; [
}5 `; V5 u3 Y; }* t
$ l3 R7 l( A" _7 S* i9 T( L$ G' U. [

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/8 |  n" c: s+ |  ]& @
/*                                                                          */2 |& \! _! g0 v2 d
/*              中断服务函数                                                */7 i! t1 `; a1 ?% r5 ^" q" W! K
/*                                                                          */3 t6 u& U/ Y2 v. q% x
/****************************************************************************/
6 _! M  h' S( p& M7 Qvoid PWMEventIsr(void)
2 o5 T, H+ `( L( I{+ e1 |( |$ ]4 ^4 K+ j: k! `3 U
        IntSystemStatusClear(SYS_INT_EHRPWM1);  P1 J+ G% R8 _
! i" ^/ U$ n3 m" k
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);9 h% d  A% d, I0 v3 I
}
# d( W3 I  U4 C# h
" v  }* }$ q. l  ]: n8 Vvoid PWMTZIsr(void)
* A% q9 t! x/ \7 q{) ^( a8 A9 d4 b1 [/ g$ ?/ D
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);  H2 h0 d! k8 h# N& w) {  Q
" N) G, D5 y9 ~+ _! l2 h4 n& y5 T
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
! ?: A6 P8 |) t}+ [8 d4 J! ]6 s# {; W6 L

/ }' v9 d5 ]3 j& S+ |/****************************************************************************/
" \0 T4 @, P- `; ^/*                                                                          */- ~5 }9 G6 X( f9 M; C, A
/*              初始化捕获模块                                              */' X( g6 s( d- c9 g  ?7 w" W
/*                                                                          */
' o, \0 a( ]" k$ T9 E/****************************************************************************/
3 I6 Z$ k2 C1 l: d8 a4 xvoid ECAPInit(void)# m6 ~) o5 q! `9 w4 \8 |7 [. F
{
1 _- j6 P2 Q- f( `6 ~: [        /*-----设置 ECCTL1-----*/: N  y6 O/ L. k1 l, z: i
        // 使能CAP寄存器装载
6 y) B5 R4 P* ^' y8 |: O- U, K        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);( ?  ]9 c0 B9 n
        // 设置预分频值.$ H/ E: r: O* J& A3 P6 x+ D" F& w
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
# H0 D. ^- w2 L' H1 A0 g, O        // 上升沿触发捕获事件1 R, v' m( |% ?/ Z
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);0 w' ]( c( l& [) ^3 z3 m
        // 输入捕获后重新装载计数器值.% d7 P, A0 O: g% v* f8 M
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
1 G& J1 a% t) ~  ~/ k1 E. L' I  W6 c0 R( h4 @
        /*-----设置 ECCTL2-----*/; A+ h$ v- g7 g2 R
        // 连续模式
/ E8 J! F5 H0 s- b3 Z, Z2 T        ECAPContinousModeConfig(SOC_ECAP_2_REGS);4 m# V0 d  o* E& U6 Q4 ^' P
        // ECAP计数器TSCTR持续计数  Y7 m) F1 U1 }# A* ^
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
; E! C  z( F2 Q+ x        // 禁用同步输出和同步输入1 D1 n( N' B. i+ R8 [( O: Y0 u" r) ]1 m
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);9 E, J& S+ }/ c% c5 A' b) B$ k# P; T
        // 配置 ECAP 2 为 CAPTURE 模式4 W( t: A# [% I8 U+ c& X0 _
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);3 D9 g5 e( ?1 u5 K

3 n/ f: [8 d+ D+ r# g2 O1 o        // 使能中断
3 h+ i2 l' ^" ?1 [1 Q0 _5 X: \/ E//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);+ l) R) Y9 @+ c. `7 E# q& m- Z
}
) _( I, E6 v( i% ]) Z. }" e, W4 o) \1 U$ l5 |
/****************************************************************************/+ ^2 N6 i! {  M3 Y6 {* c/ a8 ~& ]$ {
/*                                                                          */
+ i  o5 f! _6 }6 L+ s; ^/*              取得捕获结果                                                */
" W* ^2 q" r8 w/*                                                                          */
" [% p0 Y  A! ]/****************************************************************************/. B8 z+ t2 Z5 B6 V. Y& U
unsigned int ECAPRead(void)
9 J9 e6 M5 `  q" o{
, m. ]. j! L) z" ?        unsigned int capvalue;
! h- @8 m/ i1 h$ Z" U' s1 O        unsigned long frequency;
9 Y7 m9 o! O1 _6 q- ]8 _# p+ n# U* s/ r* `0 j
        // Event1 中断标志% j8 x4 l% L2 {# A' ^
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
6 }+ r! u+ q% K  _7 N5 R4 \: D        {
" Z5 z3 P" M! g$ ~# i) y                // 取得捕获计数4 ]. I( p9 e  P$ F. v& s5 u4 w, Q- t3 R
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);* Z5 a7 s% Z* ~" C. `4 {
                capvalue = ECAPResult.cap1;
4 c$ _3 x* g; F1 u3 k) q5 f4 K' Y( O3 F! F
                // CAPTRUE 模块 228M 时钟主频& o1 V' F5 ?3 J6 N# q* p( ^
                frequency  =  228000000/capvalue;
7 {: v3 q  o- T; o, T, l% c                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
0 J! {" v9 t7 j
; a, H' i* w  K                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
: v% P( Y' ?7 {8 b5 Y7 Y//                IntEventClear(SYS_INT_ECAP2);; C7 I4 {* k3 f9 U9 s
        }
& i+ E2 F' y1 [6 O0 \7 u4 |0 }        return frequency;0 E" S9 D6 I8 n: M7 {9 N4 O
}) Q: S9 t* c; |7 N

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