嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家5 |9 y% M  ?! b+ W3 R

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/5 O8 L# c$ [  i- _
/*                                                                          */
! f3 C6 n; x8 c" \+ g" n2 @, ~( D0 g  e/*              宏定义                                                      */; j# U) ^( @/ ?( E  u) P
/*                                                                          */+ ~3 a% X7 ~* d. H% X
/****************************************************************************/
& V- j: H# s. s# o5 S% U// 软件断点
% e/ I% S5 ^% E8 W#define SW_BREAKPOINT     asm(" SWBP 0 ");
& N$ _( D4 d0 F1 m: j: h7 W4 f! W
3 |5 f; _  ]" |9 c$ c' W// 时钟分频
8 k; W; y# X! }; v& }8 e  n#define CLOCK_DIV_VAL     2282 S* u3 e9 r# z2 K* V; N7 f3 k6 G, t9 f

  Q: Y  Q' `3 z: I) J/****************************************************************************/
, D9 e/ ^8 U8 `% r* [) C% C/*                                                                          */" w7 w2 N8 N  Z( m0 B8 }
/*              全局变量                                                    */% G" X0 s( X4 X' d2 f; e
/*                                                                          */
+ [3 c- L" B" k3 [* w+ e/****************************************************************************/2 k" I% P) b3 S$ L. E/ l" z
ECAPCONTEXT ECAPResult;
3 ?  [  p! k" T! R
+ ~2 k7 f9 p, f6 |# q# k/****************************************************************************/
. R  n- S. F: d' j# E+ v/*                                                                          */
# Y/ @* B2 e: W) O/*              函数声明                                                    */  Q) C! b  i& |. i6 ^2 O  Q
/*                                                                          */4 e9 [$ W; B' A2 m
/****************************************************************************/! W# s# F2 D# g0 ]0 m' s' @
// 外设使能配置" t: O) m  K" z* U  [
void PSCInit(void);/ T* L! s/ y; {/ z

( D$ @! E! v' S3 G) J4 |: s// GPIO 管脚复用配置
' i! ?4 f& g- R* y5 D" Z, Y: vvoid GPIOBankPinMuxSet();" F& K8 t6 I1 E+ V  O# t: g/ Y4 r
) L3 q5 L9 w9 ]) d
// 产生波形
. {/ Z: Q; b9 t+ k# Rvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
, D9 B% B. h6 P" t1 ?. Yvoid ChopperWaveform(void);8 E3 d6 X; @0 J$ T+ e

& I& U: j% ]0 `4 l; X// ECAP初始化和读函数$ W5 V0 F; A% s
void ECAPInit(void);
9 f- b/ g- @4 A! U+ W1 R2 punsigned int ECAPRead(void);
( Q% r2 f# @$ Z# y# G/ i7 O; q/ e$ @- N: U" z  \, h# W
//ARM 中断初始化7 H5 b% u1 h) I% O+ b& \2 ~- z
void InterruptInit(void);
8 `0 \- Y; r1 X1 d0 L7 c0 Q) M
' @" Q3 r' x  N8 _; |1 O// PWM 中断初始化- \6 x! M. Z$ u8 a
void PWMInterruptInit(void);) h. S: W5 S! O+ d# c) z" I
// 中断服务函数1 n3 V# [& F+ W2 R: f1 \5 Y& ?  a
// PWM 事件3 p- d7 g5 I1 y. }3 N1 h
void PWMEventIsr(void);
/ I, O# J  w' d// PWM 错误控制事件) x2 M! F+ g3 V! Q: d) o
void PWMTZIsr(void);
0 X$ R6 I) b: \; ]$ Y% Z7 N/ j2 X: H! y( x! l: \7 [
/****************************************************************************/
/ \0 W5 `& B' {9 J5 C/*                                                                          */. r! [, i4 B. y$ ^+ D2 d1 w
/*              主函数                                                      */
, v# v+ ^3 M/ d+ V7 I. c" o/*                                                                          */) H( m5 F) |4 d4 D4 m& O* A
/****************************************************************************/# U1 e4 m( J9 ~3 S& [2 ^2 M
int main(void)+ ~& m- |5 F5 ]1 R, B
{
3 K+ t- {' N+ T% e: y, a: q        // 外设使能配置
) x/ S+ l: h6 }' j3 H& [( Z        PSCInit();) G9 X0 k) P2 L

8 W, U; Z) s+ v        // 初始化串口终端 使用串口2+ D+ m! w" M' E" _; _0 \9 i
        UARTStdioInit();
5 T4 m$ W1 K! d0 i$ \       
/ h) Z* X& Z+ @0 n3 ^2 }        // GPIO 管脚复用配置3 h% y8 j. ?& }! |# U. S) W
        GPIOBankPinMuxSet();
: r" |+ z* i+ N; K9 |5 N; g! C( U) b0 t8 L. f! w
        // ARM 中断初始化- Y! s+ M* ~. B3 p1 j2 i% n
        InterruptInit();
3 F" d$ s% I  g3 a
9 P0 H) R( ]! g        // PWM 中断初始化
# n5 y  P- y9 n        PWMInterruptInit();
1 _& W+ A1 g, a$ D/ t
# H& W; o; d6 f8 V' {2 n  K        unsigned char i;
$ r2 t( j) B2 h2 Y, I2 Z        unsigned int j;
: z0 _& a! s; f" z$ B1 r' k; j! i7 V8 J6 V' e7 [0 X- [  h( j( e
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);9 C1 B! e- _. T- b2 m3 `
        UARTPuts("------------------------------------------------------------\r\n", -1);! j1 V' L) Z" @1 l8 Z. |
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);- T' m0 S- l( G  E) \
        // 产生波形
5 ~4 E: o, S4 O4 ^( O1 C        PWM1ABasic(25000,50);# H. H& A2 ]8 l1 m: K3 F! C

; i2 B- O8 O  q        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
6 y: Y3 ?" X' o  [, R( [        UARTPuts("------------------------------------------------------------\r\n", -1);
5 _7 R; b8 w0 Z" W+ `4 _) W0 @) M$ l' x- V% j' K

/ U* v% c3 t0 q7 x5 d) y- ?4 F8 W2 E4 j5 _% w$ W
        UARTPuts("------------------------------------------------------------\r\n", -1);3 }0 ]# k, a$ w+ x+ v; w
        UARTPuts("                    C6748 ECAP Test\r\n", -1);* Z/ t! M% m' h9 d7 e7 `. I' X  I
        // ECAP 捕获初始化
5 N0 q, n# B# v        ECAPInit();, r6 w" G8 }1 D$ t8 ~1 s" H
        UARTPuts("Initialize ECAP.......\r\n",-1);
, X: v4 u( `: [. x* d  A* ]        for(i=0;i<5;i++)1 r- ~' ^' Y! {' Y6 B
        {
- Y: g1 ?5 t2 e; B) S3 l6 U$ m! K                    for(j=0x00FFFFFF;j>0;j--);            // 延时3 B5 J: f5 X9 n6 }9 {
                    ECAPRead();
( N. U+ ~3 L" y7 f# V        }, ~, Y1 V3 Y$ o. \# P# T- S
        UARTPuts("\r\n",-1);
( C) X0 k3 a+ D        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);/ t+ j' Q5 a: E' I' w" Z: o
        UARTPuts("------------------------------------------------------------\r\n", -1);
3 ^' z  ?& R" k: A2 q; g0 ?
: P6 N* n! K/ e; R        // 主循环2 p  K7 k6 A" Z8 }9 u
        for(;;)
3 @6 g1 Z2 [8 Y: N; ~        {
# A- t3 G/ n# n# b/ k6 @. v( R, b. ]: `9 v  {" }
        }  T) U% U4 T- I8 d# K! O- t- A
}
3 v8 k) [9 F2 P& u$ t
; T( p' S- d+ Q* T/****************************************************************************/" A- ^9 e8 U8 b, H( G! `
/*                                                                          */8 y6 Y0 e+ w' h
/*              PSC 初始化                                                  */# L( d" }* N2 W0 i' M
/*                                                                          */
" O: |9 a1 n& g& ^6 v/****************************************************************************/
- V- B8 b4 k9 D& q# ~+ C  N+ l* xvoid PSCInit(void)8 m# q, t( c# N: @1 n
{
+ M8 b- z  h& r  v        // 使能  EHRPWM 和 ECAP 模块
8 Z, s' R- ~; _. p3 L" \6 N        // 对相应外设模块的使能也可以在 BootLoader 中完成- X# J  k: ^: ]! }. y
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
5 ~& H3 _1 h4 P' _    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);* U- q! {- w! Z
}# C4 S, a, j3 X: R$ N8 o) I* i

- }- W5 V, L2 e3 N" Y! b- h1 b/****************************************************************************/, a1 y: {: B% Z& I. o
/*                                                                          */
8 r$ C! G1 ~% |/*              GPIO 管脚复用配置                                           */+ z2 N4 O! l+ c
/*                                                                          */
9 d& z9 p* c& n+ o8 I/****************************************************************************/. R5 \0 P2 Y' g' N! P: x2 J0 ^6 ~7 C
void GPIOBankPinMuxSet(void)
, k! P) X) _' F{
( T6 d. N4 e7 j, D7 B2 F+ X        EHRPWM1PinMuxSetup();8 b6 {' N& v7 t! I

+ V* C# E* v5 R5 C& F' `5 e" |; F        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)9 H7 U$ O& v% |$ N
        // 作为捕获功能时管脚方向为输入/ b8 I# F! F# E3 g% {4 Y3 [
        // 作为辅助脉宽调制时管脚方向为输出/ T2 D) S. P: Q& W  t8 n
    // ECAP2 / APWM28 S, W, k+ ]7 @9 u9 Y- d# J
        ECAPPinMuxSetup(2);* y5 b2 i4 F: b; ^/ T
* t: Y& e* c* x9 k/ i4 \
        // ECAP2 / APWM2方向设置为输入
) C! [' o, x: B8 N8 ?0 C        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
' J# S' k: p1 W, L# i/ Z/ X( F}2 _$ q. g( J* C, o3 j* f
4 J: t- L6 \. D1 P$ I1 q; b
/****************************************************************************/
5 u: b2 j3 \, g* l/*                                                                          */5 \" F, G8 y* l6 S0 k0 U9 E
/*              PWM 输出波形                                                */
9 Y- G9 V: P( \- X; S' Z/*                                                                          */
* l& l$ S# z# U( ~/ _; M: @/****************************************************************************/  Y! t& Q& }6 w" o* q8 H& I
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
3 f# t& w9 J) w5 L" l{; o% [3 h& Y! l& `0 m* F) W
    // 时间基准配置
5 }4 {* C8 Q3 y    // 时钟配置
5 _& t/ D) e, e" _3 d& ?) v* F6 {    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
* l) W7 V) y) x' Y
! z6 [% @1 y( K- }+ K    // 配置周期, }* F8 O2 \) i4 }
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,/ z" }9 F: U8 g% a+ Q& w8 A7 c
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
; n2 N9 b) @0 u8 P. \3 p) S: k$ v! _1 A9 J: R6 V& f4 k
    // 禁用输入同步信号
; v6 y( E8 m# c0 g. z    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);& r* o# v# \' ^4 N

6 f0 ?) d# `4 g( |. @% \' E+ j2 \    // 禁用输出同步信号) B; t# W( j+ Q) O  P- j
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
  R; n  b; t4 a! k8 R: f8 ?# u3 v" \+ N
    // 仿真(DEBUG)模式行为配置9 ?0 r& m$ e# l0 `+ d8 g# a" q+ I
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);4 S# `& R: t$ I

5 o4 u& ^9 ]5 \9 Y% x2 _" W1 e# H# t    // 配置计数比较器子模块+ Z! O/ `) Z; z, n$ m, I
    // 加载比较器 A 值
+ F# A. z4 }/ z9 |    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,- E: L0 U' j! F  c7 H$ p( i2 F
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
7 F" L7 W. M0 R- D; T0 r6 Z% U7 B2 B6 ^& r: ~  y4 ^) ~
    // 加载比较器 B 值
6 A+ m* }- t4 [" o2 a    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
. p7 D7 J- E; a, d) |& L                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);' ], ~& c) M$ v
  z1 _2 P0 x4 L+ h' w
    // 功能限定配置(输出引脚触发方式设定)" d# Y1 W4 n4 g) k
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
' @: b- B) d' x' \/ O6 a    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
# \$ e% S( ^- t" v                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
. z4 b. U3 I6 g7 Q- @* [( d" E- q                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
: H/ i/ q5 T7 T& M$ }
$ i6 y4 T) t* T( J) p& ~: b' L5 N    // 禁用(旁路,信号直接输出到斩波子模块)死区模块; r& N# C  j( ^" }3 t+ ^4 ?
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);1 U9 ?' h: Q5 \$ ?0 c- a2 B

6 v. w9 W* }: y5 ~    // 禁用斩波子模块; S- s/ D9 {2 N* e# K9 E, N$ o0 h
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
! B+ l+ }4 n1 \) y1 S7 K
) J6 k$ `4 s. s0 \7 p% t; O6 O    // 禁用错误控制事件, A* l! _( g/ B8 H' X
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
2 h% B. {# |( Y; _0 L' _    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
$ p! J' J  H+ K$ Y1 Y
) R* r4 M" N7 x) t4 l. k) U    // 事件触发配置
9 s! b. ]  n; A0 r. b3 a3 i' B    // 每三次事件发生产生中断
! [% O' ^8 h& w2 z" m    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);8 e/ s$ ]( X# b( I) h4 B/ p# C
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件$ o6 y" [9 b' M5 U- N4 a
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
) q/ @3 q% t8 F    // 使能中断$ s4 x% g$ a# }7 G/ _' X# k; @
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
) p: J$ m/ u$ {6 V; o8 r5 M  y
- z' }0 _. `$ r0 p7 [  l' I5 l    // 禁用高精度子模块! x, o: x! s% S# \$ K+ R* b- `- }
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
0 x0 R/ P( c2 l
" Z9 `8 \- U+ X8 c1 u1 J3 b) j! ~    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
" ?- ~7 y( C$ u6 d8 V! I! ~9 H}
) E3 r/ Z1 R. w3 ?2 k$ n3 }3 M- X3 h7 Y* r, T4 w3 @/ u
void ChopperWaveform(void)
0 O: ^" E! w6 g{
  d4 p5 N! A& K% d5 [- q( \! ~    // 50% 占空比7 X- A6 F9 H5 u8 W* e* i- W
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);% _8 A) }" M$ N$ d
    // 4 分频
7 Z4 d. j  L/ D6 M: ^    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);# P& B* D& _1 w0 E
    // 单个脉冲宽度: o% B+ M. h+ \# \
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);: V8 H! ?7 g* h& O: |) k8 ~" {* c, m" O$ g
    // 使能斩波子模块
1 M5 w; ~0 @- r+ J1 b( C    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
3 N8 T& r0 n, S8 v1 u, }}6 e( [+ H) ~/ [
; j- r( r" ]! L. Q4 ^% p* {+ k
/****************************************************************************// y: {" K8 S1 ]! N
/*                                                                          *// V4 s" F" ^7 Z$ ?- L! t- M- i  O
/*              PWM 中断初始化                                              */
, ^+ \) y8 i$ M4 W0 w+ @* B/*                                                                          */! m5 t8 Q4 |) N6 L; W' g
/****************************************************************************/
# p8 C0 G( y2 p' t4 mvoid PWMInterruptInit(void)
* C' T( }9 Y: Q{/ Z, ^1 R9 d6 w$ b% w9 J
        // 注册中断服务函数
! Q  f% g# Q: ~1 w/ ?5 b        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
4 N+ j; m  x# `+ u0 R, }% {1 P5 U        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);" ?0 v4 ~! X( {
7 H% y' f$ z$ n  ~' R
        // 映射中断
0 M$ i: j* P" D- `9 ~2 E        IntChannelSet(SYS_INT_EHRPWM1, 2);
' A# ?/ p; S! A        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);! @7 d, ~' c% ^' C) w
# L2 Y/ `' P2 G* d
        // 使能中断6 P. b' |  g; }: @8 ^) i
        IntSystemEnable(SYS_INT_EHRPWM1);- K$ g6 c7 F/ e- J6 C) b" D
        IntSystemEnable(SYS_INT_EHRPWM1TZ);5 `- ^3 C* c1 B4 c
}0 d/ o$ y+ ]  l- I; g2 c

1 N( p- ^' e5 t/****************************************************************************// x% ~4 J" L) D0 \2 S: m' {
/*                                                                          */. x) B4 g, e$ r$ U2 x
/*              ARM 中断初始化                                              */
9 j- k% e! Z' j! M( T/*                                                                          */
2 v( L% w+ N$ U8 C/****************************************************************************/) T9 W# B6 a# f5 t8 y
void InterruptInit(void)
- s  f& ?' M7 R$ z. S; O) w{9 I* t- k  ?6 _& T" v" s& t7 G7 U" ?
        // 初始化 ARM 中断控制器
6 H: J5 n: d( H+ G        IntAINTCInit();
8 O8 \6 T4 w8 ~: ]  M. s# P9 u* ~% f2 }. M6 z; f# q9 q
        // 使能 IRQ(CPSR)
% m1 Z& Y! w2 ], j        IntMasterIRQEnable();
1 H6 l* b; X; Z) U
$ b- ?. n! B% j        // 使能中断(AINTC GER)1 c# @: \+ A3 Z, t7 o# j, a5 q& k
        IntGlobalEnable();
. x/ r! R/ |# m' ~3 ?
0 s7 B5 l, K' {0 E- L. k, H6 ]6 e; ?. i        // 使能中断(AINTC HIER)
$ p0 \  ]. W; {8 J4 ?( g5 t        IntIRQEnable();) W9 @" I7 B/ o: B
}6 c4 u6 a4 K" M2 s$ E

: M* b. }# c: K4 ?9 N7 N( c
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/  t$ o3 i+ x2 l6 V! d
/*                                                                          */
0 K1 h. f: h5 r  `: r8 p4 x/*              中断服务函数                                                */
2 Q7 ~0 r& F$ B/*                                                                          */
9 _/ F% B. M# S! `% g/****************************************************************************/  N& _" i& h" y% v9 I  S! o% F
void PWMEventIsr(void)9 J" y; V$ v+ k' h
{
# d! w) S/ j  r, V        IntSystemStatusClear(SYS_INT_EHRPWM1);) Q2 ?% u7 O% N* a2 @
& e6 z! }# ?& g5 p  H1 J
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);- V" C' s' a7 Q- A: I+ t, t2 o
}
  |& b- q& A# M7 |4 B% ?2 T: m  i# E+ E) S
void PWMTZIsr(void)2 P5 Y9 z2 e( [/ f  i
{0 g8 A2 ?1 B- Q5 N
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
* U. Q7 Q* d2 \) T* [# [0 V$ ^% e8 t3 f6 f
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
9 i* ^4 ^* m3 S9 p7 b, }' T}0 H* o6 f$ k/ a( U. Y% f

& x2 ?+ h% d+ s- D/****************************************************************************/1 z& V9 i( Y- w; f+ u  k. N$ I1 h- V* v; ?
/*                                                                          */, w. D2 {9 [. w0 Q7 i3 A
/*              初始化捕获模块                                              */) \" N* T; x2 x' a0 F% x% E( c
/*                                                                          */  p9 Z7 L* o" h
/****************************************************************************/! U1 {+ o' o! T) v4 j4 Y( p
void ECAPInit(void)
% J7 e' m1 x6 m' K7 q7 Y+ q- u{
- L. {' b6 \) Z* Q# F        /*-----设置 ECCTL1-----*/
$ W5 R  _6 v" S' m. ^$ u4 Y) v        // 使能CAP寄存器装载
4 i( g# |1 L0 B; x7 ~8 p9 {2 a        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
( E% V" {. }3 Y: u+ p: W9 a$ W        // 设置预分频值.
( t' J* X# \$ K& q* E2 N        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
0 I& {3 @! u3 W- H9 ?& n$ I        // 上升沿触发捕获事件$ H( K$ `$ D" h: Y; U4 a0 G6 \
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);& Y# @1 }( e/ J- E, [
        // 输入捕获后重新装载计数器值.
3 E6 ^( A9 j) o        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);5 f/ b2 U0 h) ]1 u% W' o/ b

/ s& ~& Y3 r) D* z# L1 Z' a/ m        /*-----设置 ECCTL2-----*/
6 U; z2 a' ?2 ?, U/ X        // 连续模式# a7 f, }+ }% Y! g% d
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);8 U7 f! Q* e! J. C. r6 j7 Q( K4 M8 c
        // ECAP计数器TSCTR持续计数3 n, M# {3 ~; l2 {
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
5 L) R4 P! X. y4 l" i5 {        // 禁用同步输出和同步输入0 u% S/ o9 d, O, E3 i* E0 Z
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
4 @2 R" m- [3 ~" ^        // 配置 ECAP 2 为 CAPTURE 模式! v: f5 `  a1 `( p% y7 C
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
& Q+ K- c% V+ K) X! s5 z. [0 v: f/ Q/ n
        // 使能中断
/ n* Q! O9 O7 ?2 b( y% x//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);3 V4 w: n) _. a8 t8 b; }3 r
}
  g( a6 [7 x2 O3 a  L
& o  y& a+ d+ n  v/****************************************************************************/
9 l6 M/ [, r, y4 |5 }' v/*                                                                          */
7 U8 N. v2 c3 q$ d/*              取得捕获结果                                                */- C) X2 H2 B) V" }' Y8 H& v! l
/*                                                                          */! Z- b' F4 q+ {. w- f! i4 F
/****************************************************************************/' t4 n* M) D$ v. e7 k
unsigned int ECAPRead(void)
6 b% a% s! ?6 U{
9 C7 j& k5 u0 ~: ?+ K  V( n        unsigned int capvalue;
1 P* l) v5 j3 c# [9 |, z: P        unsigned long frequency;  H8 e+ S" K' M: {. H+ o
) y& z7 ?2 A7 c2 `  T6 e
        // Event1 中断标志
; I/ p$ `# Y+ i" ]) e! r        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))9 H* p& A& V( X" R
        {1 x9 u- l3 y+ E+ x2 d. F* @
                // 取得捕获计数
0 F; h/ ^5 |( J) l                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);; j1 b% R" L" W. ?! Q& J9 V" V! z
                capvalue = ECAPResult.cap1;3 [! q; P$ K# P3 G: r

! ]6 A0 }; {" G0 _                // CAPTRUE 模块 228M 时钟主频
4 J4 Q* @4 q2 ?3 j& _  U- l                frequency  =  228000000/capvalue;
+ d* v0 t* Y) S. [                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);  S  J+ Z5 p- _( p$ W
$ H/ \( B! s8 ?! q# T" v  O
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);" Y6 S  V* v. S6 S% j; V8 [
//                IntEventClear(SYS_INT_ECAP2);/ j5 p7 ]( r$ e1 p; D* \
        }
  I. m8 I' b' \        return frequency;
% m; B( @: f& H$ i; Z}6 {$ `, |5 J1 g) }- F3 C

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