嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
; Z) Q& L0 I' E1 O7 B2 M+ ^
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
4 p. ~5 i+ d6 E9 G8 M7 O; M
/* */
7 ]* p" Q+ K" v$ c6 e3 L% s
/* 宏定义 */
% A9 T. _; y! k6 u9 A
/* */
& H) \) i7 x- A- k
/****************************************************************************/
# S9 G3 i; ^4 x9 g
// 软件断点
1 ]8 J z! U- F/ ^- [
#define SW_BREAKPOINT asm(" SWBP 0 ");
; y f2 P/ s8 a( G, ^
0 N" \1 K! R0 \# ]2 I# D/ p4 H( z- }
// 时钟分频
& y. i x# _( k+ j/ {. \) b
#define CLOCK_DIV_VAL 228
- l$ o! x2 r2 h
8 a- r$ W4 q/ B4 a6 x' S( r5 b
/****************************************************************************/
7 W1 ] u+ H1 N
/* */
' B3 \( H, N% \! I* ~# k% x
/* 全局变量 */
2 U% j6 z* ?/ \8 R' v
/* */
, f. K& L, p/ u* f/ P7 I$ F5 \
/****************************************************************************/
3 l1 m, |( {* b! R# i( s6 v
ECAPCONTEXT ECAPResult;
4 U5 U6 S, U& O) d/ O( Q$ g5 t
6 {% C; y: N0 U0 d' _
/****************************************************************************/
+ W j% G: s5 N+ h. `7 I! X7 w
/* */
7 F. j v( ~+ f; ^
/* 函数声明 */
' F& i( F+ C' P" G9 l7 d, P
/* */
) l8 A. p; ~/ ~% d1 P
/****************************************************************************/
! P' |; H2 J" |2 }
// 外设使能配置
9 Z" T2 h: {' H0 { }( s8 M
void PSCInit(void);
f/ X% X x% F& m( E; m% T
`4 O4 W8 g4 h- T/ \
// GPIO 管脚复用配置
% S: w% q' Q4 W: d) V5 B$ R
void GPIOBankPinMuxSet();
/ e; k) |1 M, F9 I P; W
# S" S8 |/ Q; K8 `" h% |0 T8 ?# N
// 产生波形
! i- E: f, A" m6 y
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
+ g9 }$ ?6 t4 p/ H+ n( _
void ChopperWaveform(void);
, x/ L7 h( N% u# J
/ n5 X. m+ y3 N4 _4 L
// ECAP初始化和读函数
: ]% @* ~: S. r q1 b9 A ?
void ECAPInit(void);
8 v. ~# j4 G7 r) ]% g
unsigned int ECAPRead(void);
. {. ?3 v% Y! b
. \/ s% U/ G) P# f
//ARM 中断初始化
4 P# b w! d6 I2 R- b
void InterruptInit(void);
0 p. X* `' Q+ Y7 s7 G. F$ P
5 ?' x. K' @0 o. ~) Z2 ?
// PWM 中断初始化
5 H9 p( Y% {- y. D/ S
void PWMInterruptInit(void);
4 P) Z& ]' R2 E7 s
// 中断服务函数
+ Y" c$ J2 x; ^* u
// PWM 事件
( T$ R) b( ^' ]/ a( a+ W; [/ Q
void PWMEventIsr(void);
) U# y) v3 v" T* |- \% R
// PWM 错误控制事件
* d. j& W; c) G" h
void PWMTZIsr(void);
4 J' e: D( [% a% P9 X. f
8 w X: v3 c3 E' W
/****************************************************************************/
4 M# B; |0 m& x% b8 {' L
/* */
% i: |9 }/ E8 v$ q' c
/* 主函数 */
, G( _) i' h8 I% I& F+ ~8 u# I4 c% d
/* */
N% ]# p. }0 z; u+ @5 w
/****************************************************************************/
) h. C \+ Y, D. B$ ~( g
int main(void)
) \3 B! x. L2 C( j F
{
/ r; U1 ]3 c$ {/ e' U0 J S
// 外设使能配置
% B- E: e: B; r, N
PSCInit();
; F; Z7 \7 P/ g# }! [1 z
6 _0 Q3 g5 g& ~* _9 J
// 初始化串口终端 使用串口2
# o7 W! }* m0 X# M6 i0 `
UARTStdioInit();
4 o& B7 U5 o5 l6 j G9 j
+ D7 N/ H* G' D+ o
// GPIO 管脚复用配置
0 h R+ H5 d/ Z( e' X) z
GPIOBankPinMuxSet();
0 S$ u$ A3 A/ \2 Y1 K: `; [! G2 R
9 `" N) r) a9 }5 C
// ARM 中断初始化
9 q( y( ?! R" X6 ?- Y$ z, v
InterruptInit();
( p V3 X( I8 J+ j6 t& e7 [; R
, @6 V9 L) G9 A0 O9 N# B& T! a
// PWM 中断初始化
1 ~- ], q: H9 F# P4 B
PWMInterruptInit();
3 ~9 U& ]( L- l; a- e& T
! v# |7 R. p3 U9 {
unsigned char i;
5 o: W1 H! J' L1 q0 q. { h
unsigned int j;
3 S8 ^) C+ H: u0 Z" b& W# G
9 j' O, r* ]0 B+ s( G: u1 d
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
& i" |* y% J( U. q0 i" G& N! @ ?
UARTPuts("------------------------------------------------------------\r\n", -1);
2 z E/ y [# v m0 J6 C( u
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
' `2 R& n$ @, O5 [+ a8 o
// 产生波形
5 N3 i. T( {! y3 U
PWM1ABasic(25000,50);
( @% F( s3 H* h* h! S
' Q. M% N* W2 C' c1 i
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
9 y# U6 K. F! y0 q% O1 C
UARTPuts("------------------------------------------------------------\r\n", -1);
( J. z0 @8 O0 V: E- s$ e
5 D h8 ?% }, B+ Q' X0 n7 d
b$ J! S7 \, k* c2 S8 U+ a3 s
7 T# Q2 n3 h6 ?- v
UARTPuts("------------------------------------------------------------\r\n", -1);
* z4 [2 \ L/ E" C8 @4 C8 l
UARTPuts(" C6748 ECAP Test\r\n", -1);
0 w- i' M/ s: F- P/ H" {7 D& s2 \$ A
// ECAP 捕获初始化
4 S% W( E8 l5 e6 j2 f6 y( f
ECAPInit();
. A: b6 }; r( N
UARTPuts("Initialize ECAP.......\r\n",-1);
# t6 }2 O8 O; o7 O- N
for(i=0;i<5;i++)
B1 G( C+ n! ?* e/ G: ~/ t* r
{
) Y; g$ a0 `8 |' ^7 [ \2 j6 e
for(j=0x00FFFFFF;j>0;j--); // 延时
2 y2 ^/ i1 q- L* @; e
ECAPRead();
( a9 L w+ W D9 Z
}
# R' g+ x* n# R: c7 k% u5 \+ q
UARTPuts("\r\n",-1);
5 S! k, x5 X* ~4 Z6 _
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
) [: {/ r) Z2 h: O. ~
UARTPuts("------------------------------------------------------------\r\n", -1);
* C5 c" \, S* h0 S
# I6 _( W& E, }' m" J
// 主循环
" C8 i' l) F7 I9 O" Q) u
for(;;)
/ K2 _: x$ e. p3 p3 J
{
, |! c) L9 F* Y+ d9 h3 @! Z
' `1 i) L- x2 P, \
}
7 Q% f# w8 X1 b
}
; D c, ]& |8 l/ i
% y- \* n* ~7 d* M' o
/****************************************************************************/
& p4 r- Y9 ?2 X0 D7 X5 Q' I
/* */
( C3 r4 M! P# B7 B0 j& G% w3 i/ x
/* PSC 初始化 */
9 s. Q- t" P4 H' x7 h6 M* H* L( g
/* */
, M* K% [9 m8 L4 B' L) @ ]
/****************************************************************************/
8 S/ V e% u( a- ~& B
void PSCInit(void)
5 C7 M! a, _9 J
{
5 L" `1 N2 D) G/ S( |, r
// 使能 EHRPWM 和 ECAP 模块
6 s( n) `/ x* A U/ b, R
// 对相应外设模块的使能也可以在 BootLoader 中完成
# p3 `) D" B1 X/ l9 @3 w/ m
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
4 u* a& b1 ], \; N" q
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
4 H; B: S% `4 D' \7 b, n7 h+ L) p
}
9 E. V$ U8 f5 h( r4 ?
6 ^0 x! M0 f6 J1 \2 K' M
/****************************************************************************/
" M# @1 O# Y2 o2 K
/* */
: s1 F2 J- x3 D& Y3 M
/* GPIO 管脚复用配置 */
0 ]; G! R4 H" m. ~
/* */
" |) B3 ^' S4 p4 C n1 X6 j" W" A
/****************************************************************************/
5 `0 o: h# s `( {" T* M
void GPIOBankPinMuxSet(void)
# o3 e2 ^5 L4 o4 m5 ^8 q
{
5 N* g a7 L6 b
EHRPWM1PinMuxSetup();
4 [& ]$ f8 L0 A; F9 i' A) l C
2 d; M' u y. Q1 ^7 p
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
/ z& I7 F) E+ z1 p2 C
// 作为捕获功能时管脚方向为输入
% ~& L i5 ^0 a* e0 y! \( }
// 作为辅助脉宽调制时管脚方向为输出
4 T# X( Q$ m" A: Y8 M
// ECAP2 / APWM2
$ Y* D. t( R" t) ^1 S3 |. t
ECAPPinMuxSetup(2);
) N3 o( J( i \9 C: Z' w3 u
! ^& R& a2 I: `- x4 C1 N
// ECAP2 / APWM2方向设置为输入
4 T& c( X3 m3 p; Q, T
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
8 ]2 A8 n% D( r* \
}
6 p7 l" H! f* E! M
/ H/ j* m9 q$ D4 Y" }
/****************************************************************************/
2 {" d6 k4 S2 v" U
/* */
' y; R3 r; c2 i1 V4 E, \1 p
/* PWM 输出波形 */
# b5 r4 j! ^; w8 X2 x
/* */
/ S) q/ @+ f0 Z4 i! a/ y& Z
/****************************************************************************/
4 c9 ]! X, z- s" p0 Y+ |8 c# Q
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
1 H! v% a. T0 P* s) `
{
( R4 `1 y3 J, L- K
// 时间基准配置
5 S1 z: ~1 F1 o5 ]5 W+ l! F
// 时钟配置
@, y0 @% ~. C
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
: K+ ~* ~ \+ ^. F+ u. d; T; l
8 T; I& l! |/ Y6 r7 r
// 配置周期
2 i |& k$ W0 h/ T( D
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
% E7 }0 \: ]# Q" a
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
6 I; _/ k+ l8 d
: O K, i' B- x* Y; K$ V ~# k
// 禁用输入同步信号
& @0 X1 A4 o) X) g6 Z
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
' ]4 a' g' @3 q+ x
. c% O, `# r: W3 |& U3 _
// 禁用输出同步信号
( c8 E* x; M( b# u% i; H
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
8 g( U0 N8 U6 W$ B+ D" m7 G
: U F+ Q X9 h2 W2 z
// 仿真(DEBUG)模式行为配置
% [' b F; N/ L0 m
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
2 x! R% c$ I/ R, G
( Y( q) M& Z1 L- V0 T9 Q
// 配置计数比较器子模块
4 | ^+ \/ f; M: X$ V" q2 s4 _( q- `
// 加载比较器 A 值
/ y) d8 B' {" N. r
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
# G) E/ v( _" _5 g: {
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
# p6 R6 S# m3 ^' {* \2 E
( p2 Q t$ t$ U
// 加载比较器 B 值
6 ?* `8 d/ N3 O% X: K
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
, x" S* O$ G1 T# d5 K
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
# w- B$ P( _4 r9 y, ~2 d! ^
- q& c8 L/ p% N3 }) T
// 功能限定配置(输出引脚触发方式设定)
( ^' t4 z0 R. u* b j& r: w
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
1 n; u" ^6 h) _5 z. l z
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
9 }+ j- B& |/ Z- r& w; }9 I$ V- C
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
$ w4 \+ ]8 G& V9 z; Y7 M
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
9 F% [ t; R5 L, v4 u' I
7 v+ w/ {! H' }
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
) i; H8 ?$ L3 }3 A6 {2 w1 H; l9 }
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
/ ~5 _ F7 R3 U4 e3 H8 b
2 s- |4 m1 t; x/ o
// 禁用斩波子模块
S! n3 o- [5 `- h# I/ c
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
' [) L1 y3 t8 n
2 u! W: W2 q/ ^3 D& X% v( M f
// 禁用错误控制事件
0 v7 h8 [: x) i' R. t% i
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
" z6 S2 t5 O! V: f0 ~7 M
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
1 u2 {9 |: V+ [
3 I3 Y; U$ V% |' P- i
// 事件触发配置
$ X% t) e$ i2 E* I# g
// 每三次事件发生产生中断
! S1 a& T) ] K! G& e
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
; z' h) v% Y' b j; y; ?+ j
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
4 G2 c( Y, O$ ?5 a9 z" @2 |( W. M
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
4 M+ H& a6 G2 t8 b3 U% m( J
// 使能中断
$ b3 R% M+ F, n6 _
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
- Y) R, \5 P9 y% |" V3 L% o
$ J) p' V3 d V" g( ?! Q* |" C' I; p
// 禁用高精度子模块
3 }7 g& ?1 ?; p2 a& {
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
$ p. G7 ]( L7 Y5 P2 m1 V5 c* i0 F
K8 V9 @! ~3 z! o
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
( ^7 z; p' Y) b' W2 c% H+ c
}
: S6 ^0 {; \: ?8 x9 _
! o1 N9 n, |7 ^8 Q
void ChopperWaveform(void)
: g& w, R4 {- o1 D/ `+ |. b
{
6 q/ o- V2 R$ _7 o( k
// 50% 占空比
; d& s3 Z0 {& X) {
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
7 o g+ C& [7 p8 w$ A1 a3 `0 S2 m
// 4 分频
8 w Z* {! a5 l/ f: ^" p
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
# W* R: u$ @3 y% J+ P
// 单个脉冲宽度
* j0 \/ j: N+ ~$ v5 ]
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
! T. b$ e" y+ f/ z `4 o- }
// 使能斩波子模块
. W4 k, Y( i) k8 g* o1 c
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
3 c* I" k, T2 U8 k( U
}
0 W; {3 T2 |) x C+ F
9 z$ t- Y( x$ n X, i( K; s
/****************************************************************************/
0 K3 W# H$ ]5 t2 u
/* */
8 U a& e, ~; f. h! k
/* PWM 中断初始化 */
# Y: a/ q- U7 A0 s1 i) q9 O9 N
/* */
8 |+ v: j! p( j8 O/ p" Z; o/ E
/****************************************************************************/
0 G5 r1 P/ l' n( o) w! t) p3 E# \
void PWMInterruptInit(void)
( V" `$ a# h1 |
{
( v' G$ ]5 `* ^0 k* T7 a+ b
// 注册中断服务函数
: X; ]# O$ K4 H. E/ X5 {* r
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
$ j, C% T6 _: O
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
0 s& q5 v0 M, x' P
+ G% o# x6 I: d$ l( r
// 映射中断
$ X e; }0 s4 ]7 n: k
IntChannelSet(SYS_INT_EHRPWM1, 2);
9 Q7 C. f! z$ k, Y, O
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
0 a6 l& e: A2 C6 m) g, c
" W/ y0 I' n# X' w% N
// 使能中断
5 u7 J4 w3 s0 r* }. w: K
IntSystemEnable(SYS_INT_EHRPWM1);
6 d( b5 h8 y6 Q" `9 x! @% {7 C
IntSystemEnable(SYS_INT_EHRPWM1TZ);
$ U W' z Q2 B1 s" l2 w
}
5 H3 s1 w: B% i/ s- v- s
5 q4 i& m6 R* H; b# @
/****************************************************************************/
% Y. o3 ~9 ?/ H; v& _* H6 I1 o) o
/* */
( w% Y8 P' r6 n# |+ \
/* ARM 中断初始化 */
1 O: p. t3 ]. u' a7 T
/* */
/ Y+ n) `$ @4 O$ N
/****************************************************************************/
. x+ m# E" b6 Q2 H3 _
void InterruptInit(void)
5 g5 U1 ?+ a5 D- d; p" a" w
{
- l. O) [$ X2 z/ ?# W
// 初始化 ARM 中断控制器
7 [7 F7 L0 ~8 F- T. ~6 ~2 F# n
IntAINTCInit();
- F# t" k) P/ r. n# j
" D c0 f) l! |% k3 d' \! t
// 使能 IRQ(CPSR)
4 S6 { M& R; N; h$ N7 S
IntMasterIRQEnable();
9 f4 S& x0 X* C( N/ ~
! e$ `: Q- M. r: C( B9 l# w/ m
// 使能中断(AINTC GER)
2 b+ e0 L9 r; J2 \2 Z# L! _
IntGlobalEnable();
+ w$ D. n2 c; `& d0 f: O
7 A- U7 z& f2 M
// 使能中断(AINTC HIER)
9 t& T1 i3 l+ L9 v" R
IntIRQEnable();
% s; K" ^5 Z0 P* Y# Q: _0 ?
}
q, ]! {" K6 r) }( U0 W1 G/ x
, Q0 \& m" D4 ]% ]2 M
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
1 q- Y# P# v# n, o/ b8 ?/ q
/* */
' N. C" S p h7 j$ V' F2 J
/* 中断服务函数 */
N( }+ o. ~# ~! A; b. I# L& `
/* */
* g3 s! z- Q/ a" p( y
/****************************************************************************/
, I1 p! W% t& q" ~" ~* g
void PWMEventIsr(void)
4 u3 q5 V) N1 ]% U
{
+ u6 y* f6 p4 p+ h1 o
IntSystemStatusClear(SYS_INT_EHRPWM1);
$ C$ Y9 g9 M, X! W) r
- B3 O' w, g% F
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
. ^& C+ u' S) u$ {# r1 p/ t
}
0 Z z2 \% {# x; T7 e" p5 U" d: i
# y& a. W4 Q/ j
void PWMTZIsr(void)
! T' m/ C9 |: m" d( ?) s
{
( R/ b5 j4 y- P h
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
& O3 q3 `! n& a
, ?, y- s$ i- g+ I- ?/ j' A
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
' Y. }& R3 \! Y9 k8 \
}
# P% J5 e$ z0 B! f& ]
7 Q$ q4 C9 e, s+ p: @) z- R4 T
/****************************************************************************/
. u ^) w0 ?4 W( \/ M3 U( U
/* */
+ C3 U& \% ~/ z1 m- J
/* 初始化捕获模块 */
4 u& q8 C9 }% E* m
/* */
8 a0 z7 R2 e. M
/****************************************************************************/
' a) z/ k4 z$ J2 b
void ECAPInit(void)
9 P! s' {; m0 x
{
* V/ G6 ^4 k5 v* f9 _
/*-----设置 ECCTL1-----*/
% B$ {' h1 {" F& y H2 L% W o
// 使能CAP寄存器装载
# x) u& H+ H( z. X/ |/ r
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
3 @! J5 c9 c4 Z, P0 k) C8 N7 G
// 设置预分频值.
& Z' x/ @) [) Y2 i9 g8 V: }
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
( g" F7 w, p& Y; ^
// 上升沿触发捕获事件
4 e# y0 x6 M% a" U
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
5 {- B3 }7 \4 ?2 V0 l/ k8 m w
// 输入捕获后重新装载计数器值.
i! X( o8 i8 H# C' V# i0 V7 C
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
" V- u9 F1 t7 {. ]8 ?8 H
( P. k: d5 s, {! w y
/*-----设置 ECCTL2-----*/
- o) N$ t9 M# P( @# p$ G i$ g
// 连续模式
# w w3 g, B; _0 T' |
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
2 _( }6 ~ h! R3 q, I6 J
// ECAP计数器TSCTR持续计数
; ~' t- u4 F W6 }$ i# r$ H
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
! y6 X! w$ A6 E
// 禁用同步输出和同步输入
& k0 d! _: l# h( K
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
0 q7 g4 ], a/ {9 t& ~+ _
// 配置 ECAP 2 为 CAPTURE 模式
( J4 E" O0 r, o+ D, z6 U+ c- x* O
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
, y6 b# f, G6 W! ?, m3 Y4 M
% A4 X1 A* x4 m
// 使能中断
{8 I9 f1 |; Q* w f
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
7 S. }1 F) G' Q% K; Q( O
}
. t, o V- t9 |1 w$ V; y% p
9 u9 b$ a) D3 d8 c
/****************************************************************************/
5 k+ o1 I4 H; ?$ S# w/ F
/* */
% j" I0 G: U, ~: h- A7 n
/* 取得捕获结果 */
3 H- [+ w, W3 ?! }* @& I
/* */
9 B0 ^* C$ j8 r! ~
/****************************************************************************/
4 T/ N; R$ N' g2 n
unsigned int ECAPRead(void)
5 H/ q8 ]3 t: U) t, Z
{
2 N/ C$ \2 f) F# O X
unsigned int capvalue;
. a# T4 B1 A B# ]% |, G/ b
unsigned long frequency;
" x* _( ~3 ~- Q
9 ?2 z* p1 N6 }8 O; C" V
// Event1 中断标志
; F- ]& D6 P* v) P
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
& Z5 i/ m2 S9 b9 u! U' G% r' o% D
{
+ R# q: C5 o4 |# v5 P3 Z' H0 L
// 取得捕获计数
* v; S0 \" E( a$ F+ h4 r! u7 ?. X
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
' [ z; Z# x/ X7 B
capvalue = ECAPResult.cap1;
3 ~" s) X8 q. H8 A3 z! O
+ T8 z- m. K$ i5 U8 u. w
// CAPTRUE 模块 228M 时钟主频
+ t+ l- }& t/ x9 T6 W
frequency = 228000000/capvalue;
. d$ Q) a# n: H `
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
6 t, v: R* |/ y7 X* y/ ~
# e! U; d; ]5 ~7 P
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
. w7 c% f5 g7 d6 Z1 d" K$ t) n. f
// IntEventClear(SYS_INT_ECAP2);
7 F* n# a& @2 \- y9 M/ o
}
4 v0 G4 L" p; H# Y* p
return frequency;
$ ?# C: p# _6 E( a9 N" q, S. H& Z- c
}
% B2 A/ f8 k$ p; h/ H; G, n
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
+ j5 O1 [; U6 J3 p
[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