嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
- \ G: U1 r3 X$ L4 p n
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
8 t1 k+ E' i$ ?, b7 ]: @5 b
/* */
5 K5 V# M4 }9 c9 \; j, V1 c! y
/* 宏定义 */
: @+ g9 s4 q! G* l3 u! t
/* */
# b% O1 a. I) t7 P$ }6 ~+ R& J
/****************************************************************************/
0 J, c, ?$ | y' L2 w) ?9 b
// 软件断点
# `5 W8 X! J6 Q( b; }- I' }
#define SW_BREAKPOINT asm(" SWBP 0 ");
1 k8 R6 ?" H n/ d
[5 i9 ~! X* z8 P# s' B
// 时钟分频
& m0 s; n% g$ V
#define CLOCK_DIV_VAL 228
f! J7 G* y, J1 r `
2 L3 o9 }( H4 }3 z1 G* s
/****************************************************************************/
8 F, y2 ]5 B% n# s( g4 ^" y# O
/* */
, v8 r" S9 d& d) n. @2 B
/* 全局变量 */
% v6 E! |! V) C
/* */
; L r7 s$ q& e! C' B' ?" G) i
/****************************************************************************/
; O) k3 [8 P2 W! ~
ECAPCONTEXT ECAPResult;
: ?' p1 y% ~; J8 @- r
& {' e9 R- M; W$ s
/****************************************************************************/
/ P, ?0 ]1 L% c- q" w! s
/* */
; _) D8 H/ ~5 a1 J
/* 函数声明 */
0 O0 P/ \+ Z, d+ {- r) l
/* */
% k3 n5 }: ^/ Z# M( e8 L
/****************************************************************************/
9 j4 | N5 W6 G! s4 B4 k. L
// 外设使能配置
0 \9 V% `+ p$ U% w9 b$ Q6 W
void PSCInit(void);
; X' }; v8 A. o: b0 k, `
. a, W7 D2 E( Y3 m/ M' ?5 ~
// GPIO 管脚复用配置
7 t7 |! Q; V8 H$ C! ~" T
void GPIOBankPinMuxSet();
4 M. Y4 i1 V) r. l" ]& x
* t3 o, t4 o7 c7 ~+ i: I" [
// 产生波形
4 t% H8 e# W1 U" {( ~' Y8 L
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
( a5 X6 n6 N5 B8 I& o9 `3 K$ t
void ChopperWaveform(void);
, ?, `$ p4 X7 S- K7 a3 Z$ @
- w( O+ n) K: L' y* H" _' p
// ECAP初始化和读函数
1 y% y; Q7 h4 Z/ x; ~/ E3 v$ R
void ECAPInit(void);
; V' t* k3 N0 f; D. k2 y
unsigned int ECAPRead(void);
# c' h! T2 @* r& {) C( h
" F) \1 u& r3 X- C# A/ @& X
//ARM 中断初始化
* M# R8 ~; f( K
void InterruptInit(void);
4 E# f5 G2 r8 X4 j
" E6 q1 n" K+ H! }+ O5 q
// PWM 中断初始化
8 r6 v! C |% C
void PWMInterruptInit(void);
4 W o l# w. U8 R3 f/ D f
// 中断服务函数
# y. M6 i% n5 p1 n L) }. U2 D
// PWM 事件
6 a6 x: K; u4 G0 j' T5 y* C u
void PWMEventIsr(void);
" d/ b5 t8 U `
// PWM 错误控制事件
6 w3 i! K2 u* K+ A
void PWMTZIsr(void);
! O7 c' z8 Q* Q( ?, g; }) l/ T& e
! w+ h `2 {0 q, L0 W: F/ [
/****************************************************************************/
9 |3 B4 g2 ?9 q. f1 o
/* */
# G+ w1 N x$ Z6 t6 O
/* 主函数 */
; t S& p* m& S: x( ~5 [
/* */
3 c8 W8 I7 h2 O% Z' `& f" u
/****************************************************************************/
& o" s t5 c8 h( ?' [# u- l5 d1 T
int main(void)
P! [. E6 I, @
{
( \: a. L0 u8 Y) U
// 外设使能配置
7 `) X5 n6 l+ m
PSCInit();
* n- A4 a1 K1 G" s
) L4 N, O+ V Q+ A! k; U5 p
// 初始化串口终端 使用串口2
7 G$ g9 H, C& ]- C/ ~
UARTStdioInit();
0 y- B& @3 `7 A
- B3 E% K0 H9 }0 q
// GPIO 管脚复用配置
$ o7 Y) e% X% q8 a/ [
GPIOBankPinMuxSet();
) a' O+ C3 | r" D
$ F) T* Q. m. }
// ARM 中断初始化
# C0 c* u% ] z6 X6 ]! m
InterruptInit();
; J# f+ r& o" Y N! v% \3 _7 n
% V1 M5 K9 [/ j3 o" R: f
// PWM 中断初始化
0 D+ P. \9 [! K( q1 |$ c
PWMInterruptInit();
; `* `4 p# ~4 p& ~
5 B" f9 @" t% ~ i2 `
unsigned char i;
9 b' C9 h" X& t0 ]2 J
unsigned int j;
/ c3 U; ] A9 Y* f! P$ ^4 n5 r
3 z8 y$ R. g: e9 t0 C
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
4 E9 N$ l) U3 X- G
UARTPuts("------------------------------------------------------------\r\n", -1);
- s% g6 u0 G1 I: _$ r, Z+ L3 q2 Y
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
( J$ e+ S$ U6 l2 c. f7 z" g
// 产生波形
0 Z+ ~* p% r* W. o
PWM1ABasic(25000,50);
4 X0 Z: l2 ^5 C, X- B! L- O
$ u# f {+ g& D) B) a
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
! C8 T2 U4 Q" |0 c0 |2 V
UARTPuts("------------------------------------------------------------\r\n", -1);
! u( C5 D& C h
% q! U. T5 f( i# i9 I
$ H: E0 `0 T$ Q
9 I v3 H! X/ t T$ z! o
UARTPuts("------------------------------------------------------------\r\n", -1);
8 x8 {" `) g/ B
UARTPuts(" C6748 ECAP Test\r\n", -1);
" D$ t% H6 U% T& }3 W7 I/ Q
// ECAP 捕获初始化
: z2 U: t/ g' W
ECAPInit();
* t1 a8 [& t- j: Q( K: w! H
UARTPuts("Initialize ECAP.......\r\n",-1);
* K$ O& E% H! }; ] a
for(i=0;i<5;i++)
5 R1 L( ~2 [' {# I% V
{
* z6 X) Z& c2 N9 [* p5 l1 L v
for(j=0x00FFFFFF;j>0;j--); // 延时
0 r% p' U. G7 i
ECAPRead();
' C1 H% O9 r# u5 p
}
$ Y1 M$ K! O3 F# b/ Y
UARTPuts("\r\n",-1);
4 M! s( n( r: q$ Y
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
$ f5 ? J! w# u$ s
UARTPuts("------------------------------------------------------------\r\n", -1);
4 A S: M' c" E8 k) S# b
. w& }( t d. j4 s: \* t1 R
// 主循环
6 u6 Z3 M- I/ ?" ~0 d$ _. B
for(;;)
* V" v: t: _3 ^" V/ j F
{
1 Q" U3 I8 d( B& e v$ ~6 ~
0 u, T# M% P: L4 U: P9 v# ?
}
2 G" l- q9 w5 g4 M* q
}
`' `# F6 ~( O. t$ m& ? x
0 l# u1 g( v* `: A4 A
/****************************************************************************/
' U8 A' B y% B) W4 q" d
/* */
$ E' d7 O5 h; r1 C& O% ?/ _7 B
/* PSC 初始化 */
# S S8 P b( i) N( D
/* */
/ u- j. G! ?: r$ P( l
/****************************************************************************/
; D5 {; \+ @+ O+ I
void PSCInit(void)
2 C) ?" k3 Z; ^1 R$ {3 ~2 J5 g
{
3 `4 I ]6 o7 o: P2 H
// 使能 EHRPWM 和 ECAP 模块
, F/ [/ n- N% y f( f; Y7 Y: [
// 对相应外设模块的使能也可以在 BootLoader 中完成
^+ l( s; q+ y
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
# s) _- ?7 T2 B, t6 I( V
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
- H" _/ k+ k5 O# d: J z; k
}
/ d3 s( Y8 m y) h9 n
# O( l( @$ Q' F5 b3 p( r* h
/****************************************************************************/
5 `" a+ n( K) G Y8 M% n i* n6 W6 h
/* */
9 V, Y. m9 w- H
/* GPIO 管脚复用配置 */
. q- l5 E4 y! g2 F& V
/* */
! ^& z4 m+ N! ]7 A
/****************************************************************************/
9 \5 M5 A- \# Y8 t6 P& r7 H
void GPIOBankPinMuxSet(void)
+ k5 `4 O0 f! |3 A, t! t
{
c7 j* k2 I: [ G
EHRPWM1PinMuxSetup();
2 s6 n9 b$ E" p q
$ H$ t8 M9 V/ v/ P
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
$ d3 q- U% P8 _; i( ?* d+ e8 _
// 作为捕获功能时管脚方向为输入
/ e( K A/ N2 l2 i- P0 J3 l
// 作为辅助脉宽调制时管脚方向为输出
: m/ S, p$ v! E( }1 U7 J/ a
// ECAP2 / APWM2
) F) t% {" B! i2 [" Y/ M
ECAPPinMuxSetup(2);
2 J6 O- M1 z1 \; f6 s3 j
) }# E" s8 k& _# G4 @! ^! A$ H4 i4 l
// ECAP2 / APWM2方向设置为输入
0 J6 c; I6 F4 Z- @' N( s( \
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
8 l1 U5 E3 W- j3 |# w' \
}
, x9 k' F( M+ b4 _& q7 D$ _
: N5 t* a- |3 H
/****************************************************************************/
8 J7 X. q! [7 ^- ?' r4 O
/* */
5 w0 ]3 p; y n- |
/* PWM 输出波形 */
8 i& }+ ]3 \6 V7 R* h5 j g
/* */
5 l. y, o( P- T. ?) j7 u
/****************************************************************************/
1 m- r1 ^8 V3 p! D" }
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
" i6 S3 E" v& S6 z) x4 d
{
5 ^. s% Z+ y: r1 `+ [; H: E' A* v- z
// 时间基准配置
( j% f0 A% g- G' d B
// 时钟配置
" }. k6 \! Z0 Y$ V
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
! l' J! J- X, n0 F2 D# @
( y- s: ?9 E# B
// 配置周期
2 w( p+ a- J. g- C
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
' w3 f0 g% }3 V5 T H1 {
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
" ]9 Y6 h5 |% E' O
( o q: r1 j2 b0 V
// 禁用输入同步信号
9 N2 V9 }+ R& ^2 ]
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
% {7 @6 ^5 d8 @9 p: B0 e
0 x8 T( Y( ?7 l4 z1 @: z; s
// 禁用输出同步信号
$ U* R3 i* i1 c0 R
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
2 ?; k* m* G* m7 B/ }7 B! X) F
. r6 J+ V: y' R v+ Y2 j
// 仿真(DEBUG)模式行为配置
, V3 m2 H4 M4 e
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
+ j6 ]4 Q! P: v$ X3 H
' E+ l# M9 b% G, K8 `% D
// 配置计数比较器子模块
5 x4 s( g4 u% A9 p; n( o( L4 x# }3 U
// 加载比较器 A 值
1 w/ W# H) c( u4 T9 d8 ^' O7 u
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
& P! Q5 |; E* m4 i7 }2 u+ }
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
9 P$ Z- Q( v; U9 x: d
4 T" p" E5 T9 {# r! s0 e
// 加载比较器 B 值
) _- |1 ?4 j0 o+ S: w" U, h
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
' v- `) f6 [5 o6 X% I
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
4 b/ m& _6 s5 \# H# n, M
( P8 R, Z* z- o* x( s$ a5 Y
// 功能限定配置(输出引脚触发方式设定)
" T' c1 H4 Q" B4 w5 x; r
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
, a7 R- J9 A6 R5 ^$ ]( g
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
& ?- u" ]$ J6 U: ~' n( Q" y
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
. I$ h. m! W4 S3 c2 [# t7 a
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
" m ^1 K6 X. f& l1 Z
6 M& X8 ~; ~5 Y5 o% o8 G, L
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
) f1 [$ M( T8 x- n* s
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
8 t# g8 s3 W: a
6 i/ I l9 U, e' Z: C( \" f, s4 b
// 禁用斩波子模块
) R: |/ |$ H, n j
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
, B6 [( o( a0 i9 [1 n a
* ~: p' ? u2 K+ c9 J
// 禁用错误控制事件
8 W) ~ \( X4 a- N, |; w# ?
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
) U. H M! l9 |( X( P% a) j
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
4 Y4 Z- }% R- ]) W1 J* L
& A+ y1 j' U/ Y
// 事件触发配置
- ?' y5 Y9 G' c. V! d0 H) m" z
// 每三次事件发生产生中断
; l$ M0 P- ]1 F4 m
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
0 H6 T( s8 d/ C, L
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
7 q- }' B* S3 v( w
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
, ^/ m# x- x. q
// 使能中断
. f) v+ t' i; F: h8 T
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
3 Q' v% ~( r2 A5 d6 T8 m2 \
4 l+ \' t* k0 T" L- I
// 禁用高精度子模块
8 E" i2 N: L7 h# ]% L! [% e B
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
; E7 P# J1 P4 z+ o
8 o9 k# H; _6 [. P' v( ]0 N6 J# m
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
, n8 `/ a1 S+ P' C6 k* g
}
% w- n, `2 A+ {% z8 k
3 o1 o! S" v# G4 q
void ChopperWaveform(void)
! u4 T) u0 h9 f( o. L2 t+ d0 e7 s
{
" @+ p" K8 ~7 W$ @
// 50% 占空比
8 C+ T; b/ R0 w: I7 D( u6 X
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
4 t2 a8 @, \" d J
// 4 分频
+ j9 P: D/ X' l- q
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
$ o) \6 Q- X, A
// 单个脉冲宽度
' |7 [" l- C' T& A9 q. a0 y
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
9 k) J1 y; Q; z" z0 x
// 使能斩波子模块
9 m8 U6 W s) J! q2 x
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
2 I. k9 c3 ~' S' o7 H! P" d
}
# X# A3 v' e* @# \) h5 G) k7 A
, s4 t8 Q. z) Y( o
/****************************************************************************/
" w7 W2 E1 c+ O2 C; F; s
/* */
( w9 }9 j( d" K7 J. B: @" J. l/ ]
/* PWM 中断初始化 */
' l+ w3 J6 i K! ?
/* */
7 I! D* _6 m: m2 m" q3 H" g
/****************************************************************************/
* A2 {8 ^2 k; V% |8 h: G
void PWMInterruptInit(void)
9 h$ Q: T7 A* W; l, k
{
6 w) o) n, y& F: V5 f6 E
// 注册中断服务函数
! w' s9 w9 K6 r: y
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
2 [' K# B1 S/ G2 U$ e& X
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
' [1 o1 @0 U/ I7 Z
8 R0 Y3 |! N& H0 }
// 映射中断
8 l( Z0 S& [9 M6 M; z) O8 {
IntChannelSet(SYS_INT_EHRPWM1, 2);
' L0 d( L8 ~/ v5 W" X, ~; ~
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
/ B4 u0 q! { ^& ?2 f
% D% s# ^% | b: ]4 M9 Z8 _
// 使能中断
U! s8 V$ h y% K- y- @
IntSystemEnable(SYS_INT_EHRPWM1);
& l9 X0 d" i N7 }
IntSystemEnable(SYS_INT_EHRPWM1TZ);
# Y: s- {: D7 g. e6 S
}
# ]: n0 Z2 k4 Z
( a2 x l5 I8 Y+ ^" \0 R
/****************************************************************************/
4 C2 c" `8 q8 N. y4 E! ~! I
/* */
' A) J- w& _6 S" q
/* ARM 中断初始化 */
* K& W! h" G+ g6 u4 S0 T
/* */
# R1 [9 b5 Z/ X/ ]: L5 t3 B5 c* L! @/ z
/****************************************************************************/
2 X* Y' X* k+ ~9 c
void InterruptInit(void)
5 ~$ P) v; ~* ]* S0 h
{
6 \+ i/ Z; j* y9 p8 g& T4 z o" f
// 初始化 ARM 中断控制器
8 W1 }* A& p, q: Z2 F
IntAINTCInit();
! T' D% T8 ^/ V& t
1 N% J1 e# a. F- \6 o
// 使能 IRQ(CPSR)
1 O; x: E: s# W. G
IntMasterIRQEnable();
" f8 N! u5 Q: f& y- q" @3 L8 V: I
( |& x* ^! H* M- O( |
// 使能中断(AINTC GER)
" F# i) V/ l9 {
IntGlobalEnable();
& J; q7 \/ a$ b6 M# x4 \
\) |* J4 n) `* K0 [5 A6 i3 f$ L
// 使能中断(AINTC HIER)
6 N) O4 x& T% C. }
IntIRQEnable();
/ k4 {" d3 P& `
}
9 [6 }) `3 K/ _ ]. |
) O" f4 S+ u5 ?; h# j5 R% c4 b. n
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
9 U# Q% |* j9 K) ~, h
/* */
4 @. ~' f* J# x7 l d
/* 中断服务函数 */
, ~) E# o0 g% p& F, w
/* */
+ `7 E( a3 O# a5 D% C( l+ U2 h
/****************************************************************************/
* x2 @1 b; X" u7 L
void PWMEventIsr(void)
+ I* B* k% k+ r* X1 n
{
$ L( w- [7 r; S
IntSystemStatusClear(SYS_INT_EHRPWM1);
, j6 }, l& d& Q
7 K) f% U( i$ b `( i
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
# ?; @& v" Q' C
}
6 Q- M- f$ ?7 o1 V2 B
) i4 N; D2 o6 _ a
void PWMTZIsr(void)
9 G6 X& ~# ]" O6 ]) l2 L
{
" y0 P* x% [- c9 g* N' O+ F$ i
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
% X v- }9 {9 d6 H
0 I1 Z0 _0 ~- C N6 t
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
3 r8 \" y: m" i$ q s9 ?
}
- _2 C' O+ v, g: D
( d9 F5 G( T4 r5 z5 M
/****************************************************************************/
. X) M( L: u( w+ m8 @: y( k! E9 L; o
/* */
2 O& m# t9 ?- ]5 v- O% P* ]" a
/* 初始化捕获模块 */
9 B% F8 d( X+ |; C/ a5 T, O
/* */
0 E4 z/ @% Z& O( D
/****************************************************************************/
& E2 ^8 o% u6 w6 W7 ^" q- O: ~) }
void ECAPInit(void)
8 M, @+ q7 i. J4 f6 q# t) K
{
, X6 n! y' V& g: `! y: u- n4 u
/*-----设置 ECCTL1-----*/
8 K C2 o$ F) y
// 使能CAP寄存器装载
) @. `2 T3 q2 \2 X$ `0 ~9 [* Q
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
8 S7 T* |/ m `2 q; G; t
// 设置预分频值.
8 g# O5 S ?& p( L
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
' \" D) t, j% m
// 上升沿触发捕获事件
; x' T) K4 N8 F- l
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
$ V0 f. Z# \4 n( c
// 输入捕获后重新装载计数器值.
4 s7 a% C2 Q: e' U7 V0 v$ J
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
# T2 { K& P3 c. _$ G: K! ~/ o
+ ]: [" u8 Q9 ]- m* N- J; m
/*-----设置 ECCTL2-----*/
( k" [9 j5 l! q; p
// 连续模式
' z5 T }" ~) P$ b" s* W0 b( U
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
% d% v5 U5 T- w9 ~! p0 d' w
// ECAP计数器TSCTR持续计数
" X; ]9 L4 S9 }4 Y5 P: P
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
; K9 ?! I0 }9 H4 R7 P
// 禁用同步输出和同步输入
0 m6 V3 V1 W* z% u
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
* }) Y2 F# k* c3 X
// 配置 ECAP 2 为 CAPTURE 模式
# s; H) I, @: e: o) j- E: i
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
+ b/ h' K: U3 o
4 p8 i, t8 U- H2 G3 v: `; W. f7 N
// 使能中断
! m, _! C4 n; Z( j4 E0 W9 t$ Z* Q2 n
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
X! g Z" T) j4 m9 d, Q. I
}
- O# p. O- k+ N |9 Z1 s- k" b- O
, ^, Q6 Q3 p6 e8 M) X6 [1 u
/****************************************************************************/
4 Z" S5 y. k8 W4 F
/* */
2 L% K# p% j3 R1 H: ^
/* 取得捕获结果 */
6 P+ _' w3 z" V: y- m$ J, }
/* */
! Z) {# P% k. I0 G+ k
/****************************************************************************/
0 k! Y) Z4 L0 e# u2 ^; r- X- E: |
unsigned int ECAPRead(void)
. G- f# F8 [. P# |* u3 r
{
2 j8 M/ k3 u, g) g
unsigned int capvalue;
' v: o8 k7 b1 p
unsigned long frequency;
. w6 d; p% T5 N
& s! e9 r6 ?# {2 }! {
// Event1 中断标志
3 V1 o' ]% n4 b( {2 b
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
; M! ~7 ]; N% t( C
{
+ q% C2 A0 y: V! o( p8 w4 l
// 取得捕获计数
' T A9 m* Z2 T2 g/ a
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
" D" V* x/ ?: G7 t J; a* _6 r7 a
capvalue = ECAPResult.cap1;
' \$ N8 ^. U! w
, S+ O# v8 C7 [
// CAPTRUE 模块 228M 时钟主频
; i; H$ p0 m/ i* y6 ^
frequency = 228000000/capvalue;
0 F, T! m- ^' Q6 ]% H
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
. r$ g4 p; @" o8 e; K; P
- D4 G" z0 O! u% c+ Q6 f K/ {# ?
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
6 E. l6 i9 q/ N$ j# S
// IntEventClear(SYS_INT_ECAP2);
: ]* M; b- Z8 y [, d- h) w# x
}
G2 I( z5 X9 p+ L) y$ a: [4 J
return frequency;
. z3 Y. E6 H/ @7 K
}
1 n5 ~% ]2 S- e
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
$ E/ P" s- G" |0 [: r+ L- b
[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