嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
' z9 c  C8 [: ^" l6 `& t, S
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
  s3 d1 g/ c2 F6 y/*                                                                          */
: u5 }& d1 a: V: z1 P% k& i# p/*              宏定义                                                      */
4 U9 C! l8 [0 ~4 k/*                                                                          */( a3 @( v, }5 y) @$ M+ i
/****************************************************************************/
1 i$ G& c9 j9 d, A// 软件断点* R0 N+ j3 O9 B/ E
#define SW_BREAKPOINT     asm(" SWBP 0 ");
8 T6 W5 Q5 s, @1 D. V% p% q/ w0 O) }3 W2 X
// 时钟分频0 W* E: x0 j  u) f6 d
#define CLOCK_DIV_VAL     228/ [9 h/ e. ]' y' Z2 L
$ L+ @  |* ]" |: @
/****************************************************************************/  [. K0 {5 L( U' m
/*                                                                          */' U" |9 d: Q- }
/*              全局变量                                                    */; F0 A  m3 j; g
/*                                                                          */' e3 N( t$ T1 e3 L, }& D
/****************************************************************************/* R2 S8 y: @9 f/ Y+ {' ~( g6 d
ECAPCONTEXT ECAPResult;7 j4 b9 H9 h1 |4 x  v. u1 y
) b: ^- P% `6 S& w! ~) p& L& P
/****************************************************************************/
( v2 v5 K, D1 b. o8 P% y/*                                                                          */
' P& i6 r) {7 @* @- J/*              函数声明                                                    */7 e1 W9 k# S: r* J
/*                                                                          */8 {& j" I- Z- p* F: q) u
/****************************************************************************/) g4 D0 A4 e: n/ v
// 外设使能配置) X+ `" W. y- t! d0 ?
void PSCInit(void);
7 i, ]8 N6 ~3 R& {: W" I/ v& _
1 C1 `& b7 S8 O1 E// GPIO 管脚复用配置
- E+ Q3 M6 d6 C; ?# Lvoid GPIOBankPinMuxSet();
* i3 z4 _+ E1 s4 J7 \: y. f6 z/ V6 \9 K: G0 E
// 产生波形
; J' I. D9 a$ n; z5 H: ]6 cvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
8 o- x& s: J" Z; t5 t* jvoid ChopperWaveform(void);
2 q8 P! |2 P( x9 q8 C( d* o7 W
8 H, p$ u/ r( h6 y# A' D// ECAP初始化和读函数  N' z$ X( V9 G& t
void ECAPInit(void);
& I. e7 B$ V& j( e- K5 k7 h  U! Cunsigned int ECAPRead(void);
2 o1 y' w0 U" s0 N) Q
+ I# H; r) q6 F//ARM 中断初始化/ u/ v$ n  k+ t3 ?$ u. x* Q
void InterruptInit(void);3 F, i) m7 d8 e$ }1 N0 V
; V, `5 X' S$ g4 B( J; ~: a) i
// PWM 中断初始化
+ ?" M* X. w+ U! p4 Pvoid PWMInterruptInit(void);
% T; Z" K8 T6 |! H8 j' a) p- \. ^" _; Y// 中断服务函数+ M8 j4 w3 Q2 M
// PWM 事件
  [7 S2 T5 W" Pvoid PWMEventIsr(void);
+ c: o% ^( Z0 I- S$ c' N// PWM 错误控制事件( P  M& O" I' L
void PWMTZIsr(void);
# T1 w3 T: g+ E' `7 r, c! E# K% X" I( U* L  F3 y7 B
/****************************************************************************/
% z% G5 p5 w5 ?/*                                                                          */$ m% V- B  ?; [7 J8 i: b, M9 p
/*              主函数                                                      */
6 M% B' _( j% p1 u, e) T# C/*                                                                          */
( i8 v  J& c' g/****************************************************************************/
2 D# ?+ |/ Y2 Y( z& ]5 Aint main(void)' n: l. _! B1 v/ ?5 a
{" d! |9 P4 ^" Z
        // 外设使能配置5 ^' h, o8 s% G
        PSCInit();
0 H3 P, h: R0 z3 K, L8 {
. ?# G/ Q$ ~/ H+ f$ J        // 初始化串口终端 使用串口2! c- [3 v: _* q2 h4 ?) ^1 d
        UARTStdioInit();& D+ w8 w  N, T# g" ^
       
3 x! O% X; ]0 j6 d/ H7 v0 L        // GPIO 管脚复用配置! j. M+ E1 ~- y; J5 t
        GPIOBankPinMuxSet();8 j: S# o: r( S! k

$ b: t5 g9 `6 D' |. |        // ARM 中断初始化
: a' Y& H; ?( T3 C* m        InterruptInit();
* K* B7 p/ q6 ^, C/ K) e  m7 v/ [$ f7 `8 z) @  G
        // PWM 中断初始化, F$ w( _! _* d; C9 l" s5 c
        PWMInterruptInit();
" O# |- m& {8 C, a) D6 K, c9 ^6 H8 z! V0 s6 y$ y9 f: h
        unsigned char i;5 }( i4 a+ y) s- \1 G9 V
        unsigned int j;
& p5 }' \' B. e  O% H) T/ j9 N5 q
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);0 m( a% ?) O2 t( j- R' X% F- X+ h$ h
        UARTPuts("------------------------------------------------------------\r\n", -1);8 N4 I# v/ G  G) E7 |. {
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);+ b% b2 O+ C+ w6 y6 o
        // 产生波形6 ]: b% i) [+ _1 e7 Q; o
        PWM1ABasic(25000,50);
$ ~+ I. g5 R  Y% A0 S) x5 n  s6 |+ S0 @) O$ U) j3 H4 K& n/ k2 o
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);& ~5 ?' ^! _( M  _8 X: m8 C
        UARTPuts("------------------------------------------------------------\r\n", -1);
: k. ^- G0 x4 N+ B0 E9 E  D7 I1 ]2 T& \

/ Z% a5 q6 l% m7 S+ E- t7 W: ?1 [( `+ }( m; C
        UARTPuts("------------------------------------------------------------\r\n", -1);7 M- K# h- e! i. X9 q* K  b
        UARTPuts("                    C6748 ECAP Test\r\n", -1);" N: n& E, u9 ?5 ^, c) u- u  e
        // ECAP 捕获初始化/ L8 X5 p( m* P1 r
        ECAPInit();
5 I. N+ b# W* t; J        UARTPuts("Initialize ECAP.......\r\n",-1);
7 X; p6 q9 Q, }! A6 k3 ^0 `        for(i=0;i<5;i++)
  t+ n8 F5 W8 d' }' O+ A3 b% c        {
% X! ?- z! K$ d+ [                    for(j=0x00FFFFFF;j>0;j--);            // 延时
8 V0 s9 P/ ~) J; i                    ECAPRead();8 K& ]& T: L) \
        }7 g+ f5 v8 O% B' s4 P2 x
        UARTPuts("\r\n",-1);
2 ^/ K' Q. U6 a; f* \6 I& Q        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
$ P8 ?2 F) E+ s; E- q6 A- t; |        UARTPuts("------------------------------------------------------------\r\n", -1);; \* ]7 u. X# |2 q+ l/ Z$ h6 Y# V

8 [% j9 v3 P; l1 t( H- S        // 主循环& Z0 d0 R/ m- q4 e; N
        for(;;)9 }3 L1 [1 O3 P" G1 c7 c" B+ E1 w! P
        {
; f9 o( s' D, g2 @. ?' i$ c
4 E3 t6 ], f& Z( H, V% h        }
+ P! M0 P, Z) t( L2 V+ M}! B3 X/ N* x) y9 N4 q( I6 r6 y

. \3 K* \7 P& E) f, \/ M% V% W& d/****************************************************************************/
$ H4 ^! O( b+ s: [  b) o/*                                                                          */' u/ ^( r% ?/ j5 a, [. ]  f* Q
/*              PSC 初始化                                                  */
, s) N7 F8 s9 z8 u0 B/*                                                                          */
! c3 f9 f. Y( F/ A/****************************************************************************/
7 H4 }* p; N2 h9 V1 Y( Svoid PSCInit(void)8 C, b$ B/ _" P4 o
{
& u$ A" [9 t5 k' Y/ X, V8 N        // 使能  EHRPWM 和 ECAP 模块- a$ Y1 ?$ f8 I6 W- }+ Q
        // 对相应外设模块的使能也可以在 BootLoader 中完成5 E5 |; K; v- A) f
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);6 j; r4 j. q& _1 l" F" W
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
4 l! r! \, Z! Y% h}
/ N4 D7 I/ k( n; l7 g/ l" p9 V! _+ P. A6 B' a* b
/****************************************************************************/
% o$ ?; ]  E- e2 U/*                                                                          */
, l9 z8 o! i% \3 g9 g. a7 c0 U& i  J/*              GPIO 管脚复用配置                                           */- S/ |$ \4 O9 d. u  O
/*                                                                          */
+ i* z% T, F8 M9 u8 x/****************************************************************************/
+ o* Y, `  A8 G9 L9 q: U0 rvoid GPIOBankPinMuxSet(void)
) M9 E! l! n, A1 P4 @{3 h! N) K# N: ]! u# x$ N
        EHRPWM1PinMuxSetup();& R* @; |* g' z! L

0 h2 N; I. P8 V( N# K" I3 l6 j        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)2 ]( M, U% \- K
        // 作为捕获功能时管脚方向为输入
) M" g# w0 t* F* d        // 作为辅助脉宽调制时管脚方向为输出, K5 A2 G0 d3 a, G# f
    // ECAP2 / APWM28 v$ r; a2 C, {5 w, }
        ECAPPinMuxSetup(2);$ ~# E& ~  d' u
7 i; ]( v7 J, Y( s* W
        // ECAP2 / APWM2方向设置为输入
$ A+ Q4 ]1 |0 C6 |* g7 @        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
6 H  D  V  F+ J9 u! l( O! C}2 N1 ^% w. b: ^7 b3 B- y

6 W4 |1 |0 J% o# {- x' D/****************************************************************************/3 Z8 _5 s% g& i+ M; u7 @, ]5 @
/*                                                                          */
3 W! V1 `; m8 ~/*              PWM 输出波形                                                */) b- y0 r  _9 s" ?. }8 T; I6 `
/*                                                                          */) k4 r, ^5 N* {: P0 Q5 m  w# v
/****************************************************************************/
( |: u$ Y, ]) ~7 F7 f$ rvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)9 E0 r3 q6 |8 L
{9 |* a4 g) s) w* C: U7 |7 ?' t
    // 时间基准配置
- b! ~1 }3 d  W4 R    // 时钟配置
+ d6 W5 [( b0 U; {6 u    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
6 W- _8 I  l/ {/ Q4 c0 s9 y% U% W1 A9 G3 ]3 X- N8 m5 W
    // 配置周期/ p1 M& Y) z' {& j" C" @
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,( v: s2 f2 u) O7 ~1 ^% g# {
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);4 G6 l$ s7 i/ y+ |" M1 `; b
2 l7 T7 B& u4 D& E$ s
    // 禁用输入同步信号
2 M; U# V8 e% j" ~' r    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);: B: a+ r* e% A# Q) l  z$ k5 r7 N
7 V/ S  P. }" Q+ v3 L/ q$ N
    // 禁用输出同步信号
5 W, S& Q6 ?, h4 y& X6 {, z  ^    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
* P% y0 C+ `9 s7 `
: [- j" u9 T! q& ^4 f% s  A  u    // 仿真(DEBUG)模式行为配置! n9 Q& j4 V2 h6 i) P1 L; y  C4 E
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);: a$ o) C6 _3 e! h* a; `2 N6 O
$ b" t) f9 U6 @. b  W
    // 配置计数比较器子模块3 R( X8 H5 ^: N. h
    // 加载比较器 A 值
. p5 V! c, ]" q4 Z, m* A    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
' s2 k8 T. T4 v: B9 o                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
, T( I6 K8 R4 O
- x! A- k3 x# ~8 x    // 加载比较器 B 值! q# `& `5 a5 l2 @0 m
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
6 d2 O) ]; l+ R: f8 u+ Q                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
- W! r; q9 x" K2 T
  i" n0 E- R9 I2 q! A, P* Z8 M    // 功能限定配置(输出引脚触发方式设定)
$ i; e7 R3 z+ q! [& c  g    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
/ \# ^  F: r% k7 l    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,! L5 k3 F# \! N4 m% P1 w: j" ~
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
! E3 n. m- W6 M# w0 l+ _6 E                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
$ d' E! M& L* ~7 D$ |5 E2 ~
3 K7 W' Q( U3 h$ W; i, e9 w! K    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
4 o6 k* P. Q* q! ~' L% Z+ T3 s6 \    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);2 b6 o; s9 T2 D) G$ X* n8 ?

- P: p9 N1 l* p7 V* s    // 禁用斩波子模块, f6 A( a" p# n
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
5 H0 R2 D2 Q$ y+ r( c. T' A, D5 c2 g2 k* V3 N! J9 D; A8 u
    // 禁用错误控制事件
5 R+ Q8 z& C% H; w4 _$ k5 h    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);# Y  w) B' R# [6 j! c
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
% s* S0 C: L7 A; M7 o
& z( @# d6 z* i2 ^5 |, N6 p( H    // 事件触发配置
  E- q0 z- ?: ]    // 每三次事件发生产生中断
3 P- d) k/ Y( f9 l: B$ K    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);+ q2 b& d  o7 b: Z  N. E6 g2 J$ O# F
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件1 c5 t- I9 y4 F
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
) _: q+ R1 [! I( Y/ Q- ^    // 使能中断/ B. d2 r  r; w, S
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);3 X0 q: V& c- M, J' u
) \5 u. x# _) x/ T, j9 P& }
    // 禁用高精度子模块  j+ ^% `+ w0 G$ I
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
# f! {/ j- L- U( @! `( Z% w& O3 t- S* v+ ]
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);3 d% m+ i! X: ~3 C
}
4 V; c/ e2 u# \% ~
9 V$ P) ?0 k% U7 |# Hvoid ChopperWaveform(void)
; P7 L8 M6 q3 B% T. x9 A{
2 s7 Q5 t+ A/ T6 ^  m% P9 Q    // 50% 占空比5 q/ u1 L( D5 |. t, s
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);. b6 E; V% \0 `7 o7 h$ _2 N  C
    // 4 分频! K! P/ B5 p! a3 l
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);4 o! p8 _  C# o' v/ g2 \
    // 单个脉冲宽度( ]  l* r( ?9 L/ L5 f' t: q0 Z5 n
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);$ t0 B7 o. |% l- ?7 _4 Q" Q
    // 使能斩波子模块" {* ^4 ^6 m" L0 v' n
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);/ U* @, U( T9 E: B' @+ u
}5 r) [! r9 g5 M) y
4 f; l! w+ y# y. I$ s
/****************************************************************************/1 \& k8 E- I- J/ Z
/*                                                                          */4 L! A: ?( {4 M
/*              PWM 中断初始化                                              */
( O4 F% D% W; y+ `% Y- I- T/*                                                                          */& X% B; \6 w5 ~+ r
/****************************************************************************/: R5 \" A& C; V; c
void PWMInterruptInit(void)# R  b; A( i1 r8 n7 }
{
6 z! }. O# p, T! M7 i9 l) ^        // 注册中断服务函数5 v1 a& U$ _$ f2 M1 e# W8 e
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
9 a; t1 Q1 W0 {2 D        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);% @2 Z& x% E) R

- H( y* `, }- `, H" w        // 映射中断- M3 Y' x; F. v, E5 R  M
        IntChannelSet(SYS_INT_EHRPWM1, 2);
+ J+ E" w; N% b* i. ~# f( n. ]+ T        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);/ s  N# S1 d$ `0 W8 ~7 X

" J9 `* I4 h+ c+ |+ A        // 使能中断, m/ F! T) a4 l- C" D
        IntSystemEnable(SYS_INT_EHRPWM1);6 h' }! X! x4 _1 ^0 J
        IntSystemEnable(SYS_INT_EHRPWM1TZ);7 v5 U- l% k3 o1 n  ~0 d
}" F5 J; {5 W4 a) `0 S/ q( u
5 f( V; x# c. y: t9 @! q
/****************************************************************************/
5 s% t3 u8 c" [- d/*                                                                          */
% i4 m: f3 M. p2 I# }/*              ARM 中断初始化                                              */
' E& U. d2 Y. M/*                                                                          */8 t0 I* e$ X3 X4 Z8 G2 x
/****************************************************************************/. d. u, M- N- U9 O1 K) a. V: x
void InterruptInit(void)
  T8 Q0 X4 B& D! o+ ^' j{
9 `% k9 v7 Y- p6 q9 @        // 初始化 ARM 中断控制器( l. c2 j' Z* X8 K$ r9 k
        IntAINTCInit();
+ o/ {) m* T9 F. _, l: o, j3 m. v/ T9 h7 [6 _! f  u3 ~* D* G
        // 使能 IRQ(CPSR)
, h. R" n1 T1 }# h0 z8 n        IntMasterIRQEnable();
# @% h( w( {! @( W" d1 O) N& K) u& @% R8 D6 E) s3 O+ _. Y
        // 使能中断(AINTC GER)
$ G5 H9 u/ }& K! n        IntGlobalEnable();
1 z% _6 r8 J7 r2 X# Y; [/ }* X/ f4 X4 F
9 s! M9 P  m& ?1 \; Y; x! S) ^        // 使能中断(AINTC HIER)8 J% I8 W) q/ y; A! H
        IntIRQEnable();6 ~4 _& U# k+ o+ _  y
}9 C8 ^  [9 B- O/ M: Q/ H9 ?
* W- C/ s. N  Q& z4 z$ N9 r

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/
! J0 c9 j2 n1 t/ S+ L/*                                                                          */
; g3 S+ d* I. ^' e. F' M) w( R/*              中断服务函数                                                *// R4 r. k% e& A, A
/*                                                                          */0 p! P) d8 m: w% Q
/****************************************************************************/
! v( r2 Q/ h  m- q4 `+ rvoid PWMEventIsr(void)4 w# q7 ?, w0 @, c: M: Y5 W/ J
{- z( o, b$ S  Q! F0 f, d
        IntSystemStatusClear(SYS_INT_EHRPWM1);
0 h. ], J7 M, p$ H/ k9 a
/ I2 l5 E  [3 t  |    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
0 G$ _! X) `. O' y) P3 x4 T}3 Z7 o! v' w+ K5 t' _5 |

# X9 a: I1 P5 O. e  avoid PWMTZIsr(void)
3 ?9 T( m  e: a1 ?' v2 G* V5 G  e{3 z" u, D$ t" D& _5 f: e$ P3 L$ i
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);! T, P  Z3 M, ~# W* O/ v1 h

3 O* U  a8 t# B    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
3 i! i: U3 O5 u}. L1 w; @  V9 e; v4 u- k' h

" t9 u* R5 q' v. R: N% h/****************************************************************************/3 z1 y! m3 x# W: x
/*                                                                          */: k/ C- l2 {3 V
/*              初始化捕获模块                                              */4 f* _; {7 G/ ]( u, c/ g
/*                                                                          */) [6 A& I. F4 k7 V+ F0 s, v
/****************************************************************************/
' X. ]5 W+ v* vvoid ECAPInit(void)
3 q# x/ P' |3 `/ _  d{  l9 ^8 Y( S% r8 h
        /*-----设置 ECCTL1-----*/
6 v) V* x" B! P8 o( _0 Z3 j& ]        // 使能CAP寄存器装载: n2 ^) v  m2 j4 v
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
! \0 a3 L& q7 G! W  z        // 设置预分频值.
7 o0 g% u6 u- D        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
, j/ O1 A& f+ ?9 H# H        // 上升沿触发捕获事件: K; v( s4 g6 Q
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);( H1 A$ U6 ?4 i& h0 J9 v; {- }0 K! F
        // 输入捕获后重新装载计数器值.5 Q! f/ Y  h) Z1 f2 x
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
" ]3 h. r+ ?, U$ }9 J" M, K) m# `1 G" b8 x0 C+ {0 U) H( n
        /*-----设置 ECCTL2-----*/
1 U; a1 G( X6 i        // 连续模式
! |* A/ Y# \- a3 y( d# S/ K: J* H        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
: K& Q, B$ m* n4 a        // ECAP计数器TSCTR持续计数- n3 y" \' @+ ^( n/ @# R' n& @% p
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);' S; I0 S2 [9 x8 X, O! z: |
        // 禁用同步输出和同步输入
/ ~% h# w2 L# E1 ]& [# x        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
- a% T5 n3 `3 Y8 b2 F6 ^        // 配置 ECAP 2 为 CAPTURE 模式, x- p  K6 a, O; }! u$ @
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
8 l! _# U  v9 J7 W5 q" z1 `) t: v
! Z: N. ?; R+ W7 z2 a9 v        // 使能中断) ~& X7 b2 e$ W/ L3 S: z- \
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
+ ~+ v; P) n* i: P3 n}, ~5 [" z( Z3 p% {+ V* A: Q

7 s8 u! Z! R/ u, H/ v$ X/****************************************************************************/# }2 A) a, m" U: J/ u( e+ O+ B
/*                                                                          */6 L% s6 e) @) Q; x* O! P  G
/*              取得捕获结果                                                */
. J1 z- E) h! I5 S0 \/*                                                                          */# J% Q! [9 T0 M, r" w! y
/****************************************************************************/
0 w# J6 O3 T8 o2 A% Wunsigned int ECAPRead(void)
  z1 V' u5 @9 [# D  Q: v{
7 P3 \) Q" ?7 Y) j) J        unsigned int capvalue;, Q* t. r* ]! A0 V* v7 G4 r
        unsigned long frequency;
/ j( W& [& o" D0 b; s2 j$ O. J) @# n. U' ]+ d3 y
        // Event1 中断标志
+ y( d; k0 W/ P& X; l& E# n        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))- P! a7 B, k0 C( e
        {
! y  t7 m! X+ ^6 R6 c6 H! ?0 @                // 取得捕获计数* n8 O. C" ?" g/ D& x0 H9 H
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
- q, ~) _* M* o/ Z" j; m# K1 a                capvalue = ECAPResult.cap1;% H0 k. @2 Q8 @6 o
! y0 T' u) ]3 n/ z: p. r
                // CAPTRUE 模块 228M 时钟主频
, B4 B8 ]& V$ i1 [                frequency  =  228000000/capvalue;% d2 o9 N5 \% z' r/ `) y$ |; z1 \
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);0 L7 v- M" C0 T4 y; H- |& ?
6 S) T5 m& m# S! p
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
4 h7 e* m! E9 G* W0 y$ [0 e//                IntEventClear(SYS_INT_ECAP2);5 D0 h/ k$ O* v$ M
        }
% J; x. L3 s/ `        return frequency;6 B2 N2 X  ?8 _1 s/ {
}
. N: u/ k1 e# p" L8 m
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
" U8 S: p1 R7 C% Q/ q[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