嵌入式开发者社区
标题:
请问一下怎么产生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 228
2 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: v
void GPIOBankPinMuxSet();
" F& K8 t6 I1 E+ V O# t: g/ Y4 r
) L3 q5 L9 w9 ]) d
// 产生波形
. {/ Z: Q; b9 t+ k# R
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
, D9 B% B. h6 P" t1 ?. Y
void 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 p
unsigned 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 J
6 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* x
void 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 / APWM2
8 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 r
6 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- X
3 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 m
void 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! s
5 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