嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
1 u# R+ Y5 T. V
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
: `6 b3 @. n! h9 ~/ q+ h/*                                                                          */
' ~9 _8 X0 a! K, l/*              宏定义                                                      */% {; j1 o" U# n$ k8 q
/*                                                                          */, l: E  X' f4 p
/****************************************************************************/8 n/ X! G1 J( t' b! D* }" A! P
// 软件断点
  J% q4 C* g. w- v#define SW_BREAKPOINT     asm(" SWBP 0 ");
( R- G& v0 I+ F) G$ S6 u: k: P  ?) }. |  B, e
// 时钟分频
, L3 p* }# ]5 F0 b# U/ z5 A#define CLOCK_DIV_VAL     228* q4 H4 O% I! o$ ]& c* I
9 O. _1 u, o5 r, |* X' m
/****************************************************************************/5 y4 u* P; }8 d; |
/*                                                                          */1 p, T; {" _* `7 k+ G/ u, p/ u( W
/*              全局变量                                                    */
7 f- D' r& m8 B  l1 u+ k3 t8 u/*                                                                          */1 S7 h; J$ s  p2 @- b+ P5 C4 y
/****************************************************************************/
* e: f$ T' k" O9 `$ |ECAPCONTEXT ECAPResult;2 j8 m* Z2 ^' M; x

7 u; R, ]; Z% }6 R) `# W. c/****************************************************************************/
2 V; Y* T1 [# Y0 }/*                                                                          */
# L% P3 |8 j3 ]/*              函数声明                                                    */
% b4 r, |3 Q$ ?- i1 y: F/*                                                                          */
7 @8 p, \: \6 u8 Z* {% x# \6 ]/****************************************************************************/$ F' C! Y, j5 m5 \$ Q; y% k
// 外设使能配置
( L! i6 r7 d, ^; pvoid PSCInit(void);: A. e& b/ n8 J$ _
- U; j6 E+ n6 `, l' C
// GPIO 管脚复用配置" a; j/ y2 r. z; ^0 f8 G6 A
void GPIOBankPinMuxSet();
3 x: d$ _, n% W+ b- k! h6 B" Y' x
// 产生波形
1 t* J1 Z7 L- d* i. {! jvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);: M1 t" q9 P( k( ^
void ChopperWaveform(void);( v- R; \, V& }- i
" c! B1 G, v4 D# _: M, P, g1 |
// ECAP初始化和读函数% j- l3 W- I& b- o2 b! D7 j6 d* c
void ECAPInit(void);# p% E( Q8 J  t, V( ?" I; |& q
unsigned int ECAPRead(void);
; k. V3 o1 m/ [/ N! ^: V! o' |& Y6 F0 U( v# ^; l" K
//ARM 中断初始化( b. c! g% e0 z6 `1 I0 |
void InterruptInit(void);
" F, \. W" [2 w: \0 b5 i
3 q; U- H4 B1 b$ E( V// PWM 中断初始化
9 E. H% X/ q2 i6 Wvoid PWMInterruptInit(void);
4 N7 M* p: Z: S( d// 中断服务函数: j" N6 ~$ T2 P' Y
// PWM 事件
" Y: V% A5 k8 g4 B# J4 jvoid PWMEventIsr(void);- k7 [) _. X; u7 C+ t& {$ z3 E
// PWM 错误控制事件
1 j! y1 T! X# Uvoid PWMTZIsr(void);
8 K' y; t) Z- h5 t3 B2 @5 ?+ g$ c" W6 Z3 S
/****************************************************************************/' A* ~0 \6 z+ L+ Q( }/ d3 b" i
/*                                                                          */
1 i" @8 {  n( }% D/*              主函数                                                      */
  ^: S3 U, Q! o8 y) f/*                                                                          */+ e) u  w0 _$ y6 [
/****************************************************************************/  }$ N( S& L! |( ~  E, K3 s
int main(void)2 s% B) h6 S% D+ x
{$ {8 C: l6 Z0 Q- l. P' y3 F
        // 外设使能配置
4 F5 x& {/ E) D+ \: ?) d$ E# ~        PSCInit();) b6 K# v* A, Q
+ `. s9 R  d/ Z! ?, [
        // 初始化串口终端 使用串口25 e6 L: J6 n; b+ G+ R
        UARTStdioInit();
, q1 k# y! r: I& V6 _6 y0 B" `       
, j9 d, e$ `" A) Q        // GPIO 管脚复用配置
' x# u2 u7 G8 U8 O        GPIOBankPinMuxSet();, ]- m2 m( u" t7 R/ s# j/ I9 U
9 C6 W' E' {, w* e
        // ARM 中断初始化  \( x# L9 e; g- p; G! s  }  V
        InterruptInit();
2 d" Z' F* ^8 F$ a% p' e& u$ L; g, Y! Q8 B$ ?
        // PWM 中断初始化
1 X- O" |7 T- T        PWMInterruptInit();$ s- _! F' D) @) ^- i
1 ]7 A! J; L+ c" f+ b
        unsigned char i;  c* Z" U$ R4 z9 e* e/ R. O
        unsigned int j;
/ A  t, t; E" }5 ?+ n# w$ u( p7 ^& j/ p& Y- m& Y- Q7 @3 c9 Q% t# q) R
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
) C- F. Q% r0 L+ W) o- ]/ y8 P# Y) Y        UARTPuts("------------------------------------------------------------\r\n", -1);
4 e0 M, C9 E# U8 J        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);! O: p7 R' o3 w7 ~/ C' V( n( k
        // 产生波形
- J' d" _$ C, k# S' N        PWM1ABasic(25000,50);1 J. a  L" u6 L7 c7 P' O7 p5 Y

5 C$ ^1 L+ v  z* r* A% K        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);2 \" n' O4 F8 ?, q- w# K7 q
        UARTPuts("------------------------------------------------------------\r\n", -1);9 {" J# q8 o( G6 f$ n

& a+ v8 t$ b/ t" v8 s9 d2 h: u$ q% B; t, ^% ~' J
& @: Y- u. t+ i: P( p& K) X5 a* R
        UARTPuts("------------------------------------------------------------\r\n", -1);* q6 m& V: `7 y; D: c" e! A
        UARTPuts("                    C6748 ECAP Test\r\n", -1);
$ A; \( D8 j8 ?) m% j4 ?1 a        // ECAP 捕获初始化6 {: p+ M8 N7 [# w+ M
        ECAPInit();0 [" t1 k. {% x# q- k0 N
        UARTPuts("Initialize ECAP.......\r\n",-1);
) T/ a5 C1 Z" R3 y        for(i=0;i<5;i++)4 I# B  A  j) {+ Q. y4 J
        {
6 w8 q9 I0 L8 \  g% [9 `# P                    for(j=0x00FFFFFF;j>0;j--);            // 延时
8 x* ?5 U/ ]  n3 I                    ECAPRead();6 d; J! K  A! P7 f$ e, J- \) }# s
        }
  V9 H& V( h! o/ C. ]        UARTPuts("\r\n",-1);; D4 f# d8 N! a/ T. [4 n' E+ C
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
% r  `( X* R/ g" M& x4 W        UARTPuts("------------------------------------------------------------\r\n", -1);
3 }$ p0 q: C, y- c' ~8 T: l6 }1 ~" J
# q4 q; d  P) |        // 主循环
$ Y" C+ Q/ G6 X5 U' B% v' y: u. ^        for(;;)* S$ X3 Y* y, D0 @" A" |# Z' s
        {/ m) }  \5 O1 ^$ N* k+ R

& \2 \& H. u6 N& `* S+ V        }
8 L+ I5 b+ n, I! U* E4 y}; t: I/ p+ [  x% V2 G
$ ^9 J! M# l, H! X- o
/****************************************************************************/
0 Y* K/ g1 _# I/*                                                                          */
9 `2 `: j2 M( Q5 ^) `/*              PSC 初始化                                                  */4 q" c7 T5 Z- q# B
/*                                                                          */
, v5 E: r) b5 v- \  R+ h/****************************************************************************/
$ f- P/ I& V9 v& a. Xvoid PSCInit(void)' v3 [3 O) R0 Y; j6 X
{+ Z8 y0 u5 N! ~
        // 使能  EHRPWM 和 ECAP 模块
. N/ b/ j5 Q9 s1 D% K8 |" c        // 对相应外设模块的使能也可以在 BootLoader 中完成
' P! t6 d1 y  Z# ~    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
1 s1 a5 A0 F2 i5 G- `    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
) j0 B8 e6 g! [: D3 k: Y$ P}' B6 Z; V4 B4 _. j& [
, n) T6 |- ]0 W- y- K7 k. x
/****************************************************************************/
: o+ t/ Q' a9 n3 J. D5 G4 p) g* O/*                                                                          */$ ]+ p- C2 A/ ]% s$ w) s% Q8 n9 h
/*              GPIO 管脚复用配置                                           */
$ R0 |, j, p+ t/*                                                                          */7 e7 s( {6 ?5 E& M- c" d
/****************************************************************************/
, e. G4 S+ `- zvoid GPIOBankPinMuxSet(void)
5 D4 O' h$ q" A  S7 I{
" R4 p6 T  h2 u- f1 D        EHRPWM1PinMuxSetup();
: i  p' Z' G& i4 z4 q
5 j+ F3 v* L$ Q7 ~6 e        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)3 J' i$ E8 j( D
        // 作为捕获功能时管脚方向为输入
  \6 C+ o. z* ~        // 作为辅助脉宽调制时管脚方向为输出/ g  u4 \2 N! s0 i# u
    // ECAP2 / APWM2& e8 H/ @/ c/ p2 S
        ECAPPinMuxSetup(2);% ?3 S& b1 E" L4 f2 I1 U

$ V2 J# Q# l/ X$ r  d        // ECAP2 / APWM2方向设置为输入
/ Z) r! b7 G) |7 c/ B3 h        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]6 ~4 y- B/ v7 o
}
9 Y% h. `" i& t" T: D! r0 |0 Z. L  f+ w, i
/****************************************************************************/
1 d, J; `2 n+ u; ?- I+ r/*                                                                          */& h  L- f. l* J9 ^" O
/*              PWM 输出波形                                                */
: E, I/ p! {8 l/ _. I* N2 C1 I0 p/*                                                                          */6 X; l/ \/ i( {) r, m  ~5 o; W
/****************************************************************************/
  s% K( Z3 s: U; z0 _; Y/ e- L! evoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)( z% V# d5 `4 ~- M4 r8 n. u
{, t1 }, E) r0 x5 O
    // 时间基准配置  \/ Z' [2 V$ h8 l
    // 时钟配置5 `. U; j* H9 ?; n7 y4 ~; |  |
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);+ @3 l  V8 G, L$ q" p' j
4 s, S9 a9 [" t  X# n. r- I
    // 配置周期" h5 i1 }7 P: s" P
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
3 ?/ d( q6 }* L+ v% Y2 [. n                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
' o2 R2 ^7 P' S  B5 g% U& W( Q' z. v
. p; F3 B: c8 l4 K+ x    // 禁用输入同步信号
- h* E# p3 L5 ?; Q1 k3 L    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);9 ]/ _7 W! T3 p

' U+ p+ b# q3 k  s% r2 e    // 禁用输出同步信号
/ n7 C7 m) W" u4 g; h) H    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
4 X. D9 Y5 Q4 u4 ~7 }% Z. A. i/ e: j+ M# @0 F: x& E6 R: t
    // 仿真(DEBUG)模式行为配置
8 O6 W6 r& Z, ^9 T    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
7 ^" k; x! P/ s# ^7 Q7 I7 v0 S: v$ C' G0 s2 N- q1 ~
    // 配置计数比较器子模块
6 }) X: ~  u  D% p# |- P    // 加载比较器 A 值  G. F2 ?- |2 B3 f/ M
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
0 f6 W6 J7 Q& S& o                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
3 }& `+ P, R' V6 ^6 |
* z0 z% l, J3 f' ~+ d    // 加载比较器 B 值6 l! D4 K. h' j# h
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,4 r# \/ a; U1 B, n, A6 {
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);. W! R- G: N7 S+ {2 E& _4 ~. [
8 P" W$ C$ h( n+ J7 c2 ]- I
    // 功能限定配置(输出引脚触发方式设定)
+ t& i! f; s1 E    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
# D4 R* s* u* e$ ^    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING," X7 u" D6 {0 [
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
" ~) f: F1 q  n' w/ d+ @                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
6 T+ U/ W: y% U
5 P5 B% X1 ^" f( A# H    // 禁用(旁路,信号直接输出到斩波子模块)死区模块. ]  V. F  T3 T5 J2 ]* ]3 C% n
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
0 L7 x3 y  @( p1 J0 O3 p* r& w' Z/ k" Y4 h1 h: B! J
    // 禁用斩波子模块1 ]( ~1 S8 P4 m
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);7 a9 a; v9 y+ J+ ^% x4 a1 s

! w* `3 P: y$ o+ D/ m* k4 A! \) T    // 禁用错误控制事件
2 c0 u; o. |) N; }    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);- f9 {. S3 ?7 _: O- H7 V; T
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);( y: N" F& Q$ R' e8 n1 c

. I0 T" G5 t& l) {3 n1 R: f    // 事件触发配置7 \4 l. n7 M8 m8 b) D, j/ z5 D# y
    // 每三次事件发生产生中断  f& ~% O- w( Y% f. M
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);: z7 w5 W9 N& c- V2 a; W
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件+ ^$ Y9 l/ ?7 N6 a' a6 W; R
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);! g( Z1 o/ Z8 i
    // 使能中断
3 g, p  b* D7 \  }% q9 i& m    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
0 V. E/ \' z6 W( s$ p- K( e( m- P( [: S0 }& E
    // 禁用高精度子模块
' ~0 M7 E' {$ P% ~+ g3 T' I    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
% @& M$ k  Q  W  y. v* ^+ m- D8 t6 q3 |. W
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
: J1 D5 n$ b8 @& `& F}: h& E$ I. k0 N4 |9 }/ m; v+ p

1 c0 w2 N: {# [. ~& [void ChopperWaveform(void)
2 Y# i& Z1 t3 q( M0 p( W{
9 a( Q8 r3 m, e$ t( Z2 ~2 H    // 50% 占空比% h& E! Y* b4 @: i2 h9 X
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
5 K4 x# e2 Z4 a6 k- \  O    // 4 分频' g& p7 ?% f5 N" Q
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
) Z4 u( C( U6 L, S9 n$ ~0 O5 A# f    // 单个脉冲宽度
# e# P8 B% M% N9 P& g- Q    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
+ g( \4 i( ]! X! a7 ]* t- s- @1 n    // 使能斩波子模块
0 _3 h0 H, H. a* u! b9 [8 d    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
+ {7 p  G0 V- v" G) v}3 J: D7 k- a6 i& d! U& ?( |

0 \( y$ N$ v4 _+ j/****************************************************************************/
2 U! U' p, v$ m5 {1 a" c+ `/*                                                                          */
0 k! m, j/ U% ~9 a5 y/*              PWM 中断初始化                                              */1 \: r" Y6 b+ b
/*                                                                          */
* t1 o* B# s; `; a/****************************************************************************/
9 ]; j2 A, {* G' o/ Wvoid PWMInterruptInit(void)( ^' l( I8 Z8 m4 {& i
{
8 w# N' C3 c; ?7 z$ Q) \* H        // 注册中断服务函数  l- a8 @3 \2 d: N* I. l- ~7 y
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
6 W9 x8 q' T! S2 L        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
, K+ u% _* I; C" `+ T3 z
3 f0 p) z+ J4 w  W+ E( n; N5 a        // 映射中断
8 D" U6 q; f1 L4 p, ]        IntChannelSet(SYS_INT_EHRPWM1, 2);
$ @8 O9 S3 ?( [: y" f4 G" H        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);( B1 T1 s8 g6 |/ i6 L; J4 ?
$ B. U4 a% g# ?, C7 O: W
        // 使能中断; ^  ]/ {% B- j9 Z$ y
        IntSystemEnable(SYS_INT_EHRPWM1);
7 j: d7 Z% Z  e" q2 ?2 h: z, x4 n        IntSystemEnable(SYS_INT_EHRPWM1TZ);
: C6 ]  }# B1 [}% @, X2 z% ]/ |% w/ E8 A

  H  }% ?! G3 P1 ^2 v/****************************************************************************/! y: k6 P+ u3 B- m
/*                                                                          */
0 ^. U2 g" x: J# g% y$ P3 v/*              ARM 中断初始化                                              */
! ?( N4 k( S' k/*                                                                          */
" }# m& Q! [' _/****************************************************************************/9 s9 O/ L7 F/ m
void InterruptInit(void)! |& s0 [# j5 F8 k, e8 h
{* `3 M  o4 z- b4 {2 D' A8 k
        // 初始化 ARM 中断控制器$ G4 T8 {0 ?* U' i
        IntAINTCInit();
! x8 i6 H  x5 G& Y
; J1 [% J1 d: ~        // 使能 IRQ(CPSR)
# d+ p! O, j+ _8 Q. D2 h        IntMasterIRQEnable();8 g- b# {* C7 [# F

# B8 h4 m7 ]8 ]" j, s        // 使能中断(AINTC GER)- N9 \" n# l  `  |, j2 x
        IntGlobalEnable();3 C* L$ [# D* J) j! e) e" y# R/ {
/ ]) Q4 h- ]& U" i  C2 s+ Y5 @
        // 使能中断(AINTC HIER)4 O7 x8 r1 z/ y  @2 m
        IntIRQEnable();
" i4 e* W- E& [+ @6 J  }( ]}4 t7 d" }+ o& e0 S$ `* c* I
" p# [: k) U0 Z

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/
9 w6 I+ q4 d  h* d/*                                                                          */+ V* X% U! x( l
/*              中断服务函数                                                */
! @5 }! F/ ]5 N5 u: Y9 i% o/*                                                                          */) o0 ?; d0 _1 m$ r6 V
/****************************************************************************/) y# x3 I' x" _! ~4 D! l( {5 o8 C2 n* d
void PWMEventIsr(void)! R+ Z5 @2 s! i3 K6 z
{
% o8 r$ G4 C( F1 H* ?# J        IntSystemStatusClear(SYS_INT_EHRPWM1);
9 A& S5 K$ H. V; j1 G3 H/ j& k3 _$ U- d
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);$ z* f6 k& v: ]8 [
}
9 G' u: N4 y2 K0 y, t) Z
; D1 n$ ~4 I% y, Avoid PWMTZIsr(void)
3 K- J# q. O! K/ l- A% {/ ~: E! z{
& \$ r% Z1 x  s$ J) h4 @        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
" P/ o- E6 i5 p
4 N/ P3 N, L5 E4 C    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
0 q$ R+ v, u" M3 s9 r* K+ K: h; Y}
$ |/ Z8 g# {2 m% {, a% J6 |1 S
/ _8 \! t+ n9 \* J; Y8 @+ N6 r& _/****************************************************************************/
' p. ?* p) l4 h" w8 e+ Y. H. W0 i/*                                                                          */
& ?; c  R. E; `& v* O& w$ x0 u! B/*              初始化捕获模块                                              */
' `) l3 d7 L( U8 q; V8 L4 D+ c" A/*                                                                          */
6 l  T; J8 ^  ?: @) t/****************************************************************************/
5 d' U4 E5 E4 s' {) U% _8 ~% hvoid ECAPInit(void)
" Z2 _* O" f7 d9 V3 h{
- D+ |$ R/ n6 E6 C& w" k: Z; C  l        /*-----设置 ECCTL1-----*/* }% N5 S- _- h/ Q  O
        // 使能CAP寄存器装载
: @. ^" c# ^# P! u' A        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
( Z5 \7 }: {1 {/ E1 {& O" K1 s        // 设置预分频值.4 D9 w2 P7 a- k2 d2 k. F, w0 z: K
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);) t& W% B9 ?/ q  g
        // 上升沿触发捕获事件  i  }2 ?+ Y5 {: _
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
, b, a: N, l& r2 g. C        // 输入捕获后重新装载计数器值.
+ O/ S9 s) Y2 }7 y! Y- ], ~7 M        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);1 H; ?6 E" R2 t8 [& G' m6 H9 j3 ^2 Y. K

5 g1 ^) P0 H# P4 M4 Q        /*-----设置 ECCTL2-----*// k' Q4 A" ?* r* v6 I( ~
        // 连续模式: D6 p' v$ x. m- S7 W9 T
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);+ U* o/ X2 J" v. v) T2 G  {% W, ]
        // ECAP计数器TSCTR持续计数
/ ?6 j7 _7 N. E$ q2 U# M7 a% i: b        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
/ c# L" A. E/ p! ^/ `- |+ X        // 禁用同步输出和同步输入+ S; b) k% J( n& j2 C0 h+ k
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
: Q9 ]8 ]* m$ s8 f" S" |( m7 f; E        // 配置 ECAP 2 为 CAPTURE 模式
4 k/ @1 X' X+ e4 v- X2 A& P) C) b        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);2 _5 k6 w; z/ ?/ N* V: f* H0 g9 d

* H3 |( P9 m9 U( m0 w$ w        // 使能中断
! Z: e4 ]; L2 r! t7 s, x& P//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);& U' R; w* `0 Q
}
3 s' j8 x4 j* \! D
( R% s' B. I. L5 y% }( P/****************************************************************************/  E, T8 z" u1 @+ X8 w9 e
/*                                                                          */
7 R/ u  J& T5 P( J, m5 @$ K* @/*              取得捕获结果                                                */
% {4 M) i" q. F2 \- ?/ B* C/*                                                                          */
6 m  \) _/ F) \0 g. s! U/****************************************************************************/
! A3 r0 g# e/ }! h/ L7 uunsigned int ECAPRead(void): g# i! S; s! f5 V' [
{
6 n3 }( s6 L3 b, ]        unsigned int capvalue;8 w: v, _7 g- d2 a. ?
        unsigned long frequency;# }" X9 k" z5 m( V2 Y' s* ~( y

+ b7 ]: t9 \% _5 ]4 h; Y+ f        // Event1 中断标志
3 ^# T6 p# P6 A$ O6 r7 t% ]        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
, |3 z5 d6 T5 B        {
# x- f& }( r" M7 U! x! a                // 取得捕获计数6 }8 B( T# i! Y. n& ?4 q
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
& v5 _& d3 ~( y7 O                capvalue = ECAPResult.cap1;
. P7 H- E$ K# j  }3 N# \5 v$ `" F: i1 |; L
                // CAPTRUE 模块 228M 时钟主频' X! h$ r/ ^9 }( y" Q  {! H
                frequency  =  228000000/capvalue;# r7 r8 N5 z5 q8 U. g
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
2 o% N* h+ F2 J7 H( m, v, i1 x' a3 Z7 W4 N  B
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
/ S  \8 Q& k" H//                IntEventClear(SYS_INT_ECAP2);/ c; `/ j9 m( P5 T& }+ j4 G
        }
! W( F5 Q7 G8 c/ J8 c$ ~        return frequency;0 D6 O9 e7 a# Z2 d( e8 }0 u/ k  p
}
  s. P2 {& C/ w# m; b
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。# v) N( y1 ^# y/ E$ k: X; v8 ^+ A) f
[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