嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
+ I# A7 N2 C4 W) K D& n* \+ M
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
6 p1 U1 W* E# R5 u
/* */
8 x8 X1 p$ z3 A6 j% Z
/* 宏定义 */
: n; {( u& Z% C" x u. J9 t
/* */
' F6 y1 {8 ~- [4 Z2 z4 N+ ^* ^" f& }
/****************************************************************************/
L8 |3 \& m, }8 G' ]
// 软件断点
( f- |- s$ @: Q$ Y! U! |% b# U
#define SW_BREAKPOINT asm(" SWBP 0 ");
+ ?4 ]7 J, k( ?: A
7 m! @; Q& m: o& r
// 时钟分频
% y4 X I3 o4 [% V0 O
#define CLOCK_DIV_VAL 228
8 R" U0 {8 j, f, x
1 A- @. Q+ H' H9 O
/****************************************************************************/
* j* b1 y: ]; b, ~; c# l+ q0 {
/* */
% |' ~& ~# R1 _8 s: A
/* 全局变量 */
9 P6 n: a5 K( L3 G9 N
/* */
+ ^% e& j* q* ^. Q9 L. ^
/****************************************************************************/
/ a% q( Y9 u8 K/ t4 ]
ECAPCONTEXT ECAPResult;
0 I8 [: N* K. L2 ^0 a& {( C. b+ X
- H" a; `/ k. V1 n
/****************************************************************************/
( [3 L) ~/ L, B3 d2 `4 _. N/ F
/* */
# n* h0 m, [+ C& A
/* 函数声明 */
6 B! h$ F8 j+ {6 r& k2 F) x5 a
/* */
% H! |5 E7 @. f0 z/ M" D
/****************************************************************************/
1 {9 s2 i: r8 y' Y5 g. W. k
// 外设使能配置
( `3 ` p6 ~6 ^
void PSCInit(void);
# j: z* }, O* H0 h
0 n- r6 j4 R3 M- U* E+ Z/ i
// GPIO 管脚复用配置
' _7 ]5 T, ~. S' @/ B ]' c/ r
void GPIOBankPinMuxSet();
# ]% b& u. \, ]" S( k" M3 F
1 h/ _( @% L- D2 ? h
// 产生波形
$ H0 @+ U7 f& i, n" t
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
) n$ v4 q7 p. W4 l1 h
void ChopperWaveform(void);
# @8 ?: p, f' N$ q# Z4 k- V
0 X: y5 {3 g/ I2 v/ f3 O
// ECAP初始化和读函数
- H! t8 ^$ _; D0 n: Q1 [
void ECAPInit(void);
. y9 x& `. b4 D7 ]8 d- Y
unsigned int ECAPRead(void);
# O" x' g" L; s0 P
/ J2 _6 X$ b! U* i# E8 C2 v
//ARM 中断初始化
( d; p& A" {7 q/ W$ G5 `
void InterruptInit(void);
! H; @2 E; {. }- w5 O, i% g
( z6 N9 u0 ?7 V
// PWM 中断初始化
7 C0 M, W8 P9 A
void PWMInterruptInit(void);
/ ]0 q* u( u) R0 {* y( W0 j- Q
// 中断服务函数
0 P+ Q$ l+ L) d) P1 i7 }
// PWM 事件
0 z+ e1 E7 x# Y; d6 c' R# h
void PWMEventIsr(void);
6 w; Y& u. c: X! Z
// PWM 错误控制事件
" z7 ?2 T1 m. a$ [
void PWMTZIsr(void);
# Q/ Q' g8 }2 a; }& o% k
. z/ l$ F& X1 {# R p1 I
/****************************************************************************/
1 z' u# [4 I2 u2 l
/* */
- w1 S" Z) g( U* _9 D8 V, }0 m! d; _
/* 主函数 */
& E! l4 {# \# K e5 t2 r
/* */
3 P, n1 l6 G2 F4 v
/****************************************************************************/
v7 J! Y) r. `9 E
int main(void)
6 ^3 S+ E4 O* {" [1 L3 y& {
{
. S. Q0 V: c/ Z- {! O3 \7 S+ n
// 外设使能配置
) b j* _1 s1 F4 v- ?0 \
PSCInit();
) q8 n. O! r: l& [8 Y
2 F1 j. J5 `% L4 I4 h
// 初始化串口终端 使用串口2
0 y$ ~( X# J9 T4 |$ k
UARTStdioInit();
) e3 r) \- L( d0 C9 z
# n3 n$ w, X( y
// GPIO 管脚复用配置
6 P- Y3 g6 a# a
GPIOBankPinMuxSet();
+ M5 F, m" Z% p- v4 y" I
! o! g. `9 _3 J6 P5 k
// ARM 中断初始化
( A$ H7 d1 E, n, p' E l# C
InterruptInit();
+ M w) e. y3 l8 V' K
- z* L+ f/ [8 n: v: U
// PWM 中断初始化
8 {: ?1 [: k. h& m
PWMInterruptInit();
3 g' l7 S2 ^2 L, q3 ? C1 l
9 \" E& k p- o& b# U: `
unsigned char i;
( V1 H! l \) a8 U/ V# p1 U
unsigned int j;
% i2 q# A2 T/ {: |' h2 z! [
i1 n* s/ f4 P# B3 ]6 p
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
$ [/ J! h& e; S6 p6 w8 y; n' L" m
UARTPuts("------------------------------------------------------------\r\n", -1);
1 Z! l! W h( {. e2 x; Q1 E
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
6 E# I; i2 R: G g4 q$ ^
// 产生波形
# n8 r1 l4 N( Q
PWM1ABasic(25000,50);
8 o3 L/ i# e% c" G% y. f
% a1 m- [, \& W9 P, W; h
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
. D1 }& A% ?4 v i
UARTPuts("------------------------------------------------------------\r\n", -1);
5 c. F. ]7 d4 \! ~
+ m5 F$ I. W# J1 f# U5 Y/ v2 `7 v
+ B8 M& N0 r A' n* g. i: @" A
8 {' j7 g- ?# h, Y! o+ A
UARTPuts("------------------------------------------------------------\r\n", -1);
/ h/ c) b" e8 v, d8 z$ L: q
UARTPuts(" C6748 ECAP Test\r\n", -1);
, m' A" P/ z* j& D
// ECAP 捕获初始化
8 Y& y2 |5 _2 m6 m" L5 \# t0 ^
ECAPInit();
$ ~- b$ Z5 l9 H/ V' }' M
UARTPuts("Initialize ECAP.......\r\n",-1);
) S; b8 l& G' j/ ^9 k% |$ F
for(i=0;i<5;i++)
]5 Y/ \! J1 G* a: y5 c/ {/ p
{
; l' N/ k1 a; P& @
for(j=0x00FFFFFF;j>0;j--); // 延时
/ ^# {' E. z0 q5 Z5 f+ t
ECAPRead();
( S, `0 P; c( D* }- e" u
}
( |8 \, H- A9 H E; Q# z: Z
UARTPuts("\r\n",-1);
& o+ p" r+ B8 k- [; q9 O
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
+ F$ f6 P' d+ a0 P6 B" V R- J
UARTPuts("------------------------------------------------------------\r\n", -1);
`6 h2 e. d; o+ o. h/ {
1 J+ W* {& q* ?- X7 B0 g9 I% E: r
// 主循环
- K3 }9 C l' t. w
for(;;)
) B6 u* H, \2 I
{
7 Y& Y) I& | C4 D& \4 v$ D( ~
% \( o/ G; ^6 O% w% N' m) J
}
- n7 i7 B6 P. {* W1 ?8 C
}
& W! T' b$ r% v% I' i# ?( T$ t
/ c$ W9 M2 n9 e7 W, N4 V5 n6 @
/****************************************************************************/
% K* u) D% i* S. l, b) o O
/* */
8 t% `+ N5 d4 W3 `( q$ k1 ]+ x
/* PSC 初始化 */
% m8 C# }$ m- s" m0 V
/* */
3 {' b" E4 p2 b1 a
/****************************************************************************/
( T/ L% I( R" c: ?
void PSCInit(void)
. A/ @) g8 }( r% V
{
0 V1 s+ A4 S6 n) W
// 使能 EHRPWM 和 ECAP 模块
/ R6 u6 g% M; P m8 v' p( P
// 对相应外设模块的使能也可以在 BootLoader 中完成
9 v: \5 @8 l' p# P
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
2 H$ ^3 K- S# e* {0 N8 J& _
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
- R) j5 |: ~' v: E
}
' T: e, J- o8 j! X: Z u4 K1 b
; I9 u. A; x( V2 ^- ~7 c: L
/****************************************************************************/
/ U8 e9 j. p) `- i$ r! b
/* */
; u* p/ Y% M, d0 @( j
/* GPIO 管脚复用配置 */
# l* {- l/ _. t% X
/* */
$ @0 w V5 D4 j
/****************************************************************************/
* ?6 p( ^) P; g2 i
void GPIOBankPinMuxSet(void)
: o2 D! k/ |) I v4 K% Q* z
{
' M7 V: i# {2 `" e6 `
EHRPWM1PinMuxSetup();
, p2 [# q8 J- k
; ]! Y5 X7 a8 t4 [4 x
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
& H* @: w0 ~; }$ [3 b# W: I
// 作为捕获功能时管脚方向为输入
/ Y8 [- _2 ^( e( |# j# K+ o1 ]7 m
// 作为辅助脉宽调制时管脚方向为输出
6 o4 y+ G$ G9 w+ u3 @% ~
// ECAP2 / APWM2
8 }+ z7 W* |6 e- X
ECAPPinMuxSetup(2);
0 S( a; A) j; @# A, a( G
f: \+ m( V! L2 l
// ECAP2 / APWM2方向设置为输入
3 e; U0 p, v5 v& p2 R% b; c
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
6 k9 H2 m! i* a: A2 J) J/ ^- L
}
3 x6 ]7 o. A) L/ l' K. Z) L) I& \2 t
7 W& R9 E& f; w: ^
/****************************************************************************/
3 K* J( ?! s1 Z2 [# v
/* */
6 S- R1 o' H% x- H" ]4 Z) o) [
/* PWM 输出波形 */
! ?3 G& a L1 I) q9 K( I$ n2 c
/* */
: G7 O9 P6 Z9 J+ V( g% m
/****************************************************************************/
8 A$ D# E& x. z) K
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
5 I" s" ^4 m6 a9 b
{
, e1 F; i* @+ P5 J N
// 时间基准配置
' k; G# C7 @$ j6 c" V
// 时钟配置
" l& D( d) f ~* l K1 h
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
/ t+ H3 P8 D) ~- d* |
9 e: x: [5 K' l" l% B
// 配置周期
: L7 ]% O% X$ |) g# o$ d
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
( D) v' o0 P# {
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
8 X3 c5 {4 {/ h7 `+ ]2 _; ]
: d& l0 h) }) Q) W: A5 d
// 禁用输入同步信号
@$ X) V$ l- M" L$ E% J% B
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
( ^* @* b, d6 x: l9 U8 g5 w# G1 f, u
$ E6 H8 x. v6 _5 O1 U
// 禁用输出同步信号
; w7 P+ L) s* B7 j5 c
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
7 ?1 W! `5 d% h9 D N
6 S5 r- V6 S/ k2 c. w) j& z3 O
// 仿真(DEBUG)模式行为配置
+ x. R: }1 @9 \
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
k, ~, W4 v6 e) n! a) b
, n( ?1 i& S$ J- W! n1 j, T0 j# d
// 配置计数比较器子模块
3 j0 \! s# { k1 ]
// 加载比较器 A 值
% b* \/ h8 z& c
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
( M6 i g# I7 B; o* A. Q! J
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
# l/ N; P! @8 e4 R3 l6 R
0 B+ A3 d2 q% B/ G) k% }' Y6 l
// 加载比较器 B 值
/ F) E! Z8 t2 Z# g, s7 h7 C
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
9 `' n8 X7 B# \( w8 [" F" I
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
5 F% y; W+ Z. A% W$ T! U* a
( I2 B4 B2 n; x
// 功能限定配置(输出引脚触发方式设定)
: r& R' q4 D: G) Q5 J$ S
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
& s( ~; _2 C' O
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
6 }) @, M3 ?# {7 a
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
6 x( M, B: T4 z
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
8 C' t6 z) A1 L* K4 n2 r! n7 \ C- A; w
9 s5 b; N2 T7 k
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
. \; s, a. f/ a" F" Q" b0 A
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
4 E7 S# p! c- x$ W6 i7 y
" n" Y) s! I0 L1 h. {! h
// 禁用斩波子模块
! X7 G9 ?" j% V( W, v- H
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
8 t& e& [0 b3 h4 q" ~
6 B( F, O0 v Q8 A8 ^5 {9 e+ M
// 禁用错误控制事件
3 |3 R3 \# @ _. P$ N' x! C: c
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
1 `4 L# F5 v' x+ h0 t: x) ~- y
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
" E- z/ l" V0 j6 I5 `5 q( M7 O
5 {. ~6 ~7 q/ m1 C# r' v' V m6 C
// 事件触发配置
& w) P6 W, g! l* B. |
// 每三次事件发生产生中断
: k: H8 d& Z! J
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
- u4 R6 t- h0 Y
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
) n. E! I$ @& x
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
! E& m* L0 R8 T, z: [+ N T
// 使能中断
& B$ S5 w. m7 C- k
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
) N5 B$ c' I" [1 p! i* k- k0 J
/ q$ f* G) }1 i
// 禁用高精度子模块
5 ^) B) G/ t. w
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
5 K9 R! Z" L% `# t/ M R
& [+ ]; X" l3 v' g+ R
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
. j$ r6 v% P( X* R2 [/ }
}
7 U. u# A0 L6 ^
" q, r* o# b' O
void ChopperWaveform(void)
& ~% Z" _. y5 B. e! n
{
6 ~0 s) N7 L% T, X. S
// 50% 占空比
. t4 F) l3 v6 O! X, r e
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
0 z8 l2 q2 F$ n( x! S# W. r
// 4 分频
2 D* n8 Q3 X8 A1 s- n
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
- @$ s. t, w. Z$ @1 i2 g' j
// 单个脉冲宽度
! p5 {0 q$ Y" b. G8 E& q& C# z* i
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
7 d" P0 V' g! Y
// 使能斩波子模块
4 t7 ~0 Y2 }( v4 \5 g2 S+ y
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
: ]! G; `& H4 N: `6 h: m. t
}
: J4 Z2 ^: p" f3 t9 e5 w8 |& _. `
" n7 `( n$ F: W1 V# l0 `
/****************************************************************************/
5 n" F/ f; x- q% ?+ |/ h, D
/* */
& L, f# Q# c6 U2 ^" _& l& W5 n
/* PWM 中断初始化 */
9 e: E; @6 I) {8 [5 [4 v
/* */
4 s' S( d( \$ x3 ~' ~
/****************************************************************************/
; z7 w/ k) e, u
void PWMInterruptInit(void)
; F9 w4 |4 a7 Z" Y" z3 G
{
& Z/ p& z9 ^ q) ?6 k0 c9 s' a
// 注册中断服务函数
- Y: S7 _2 m; ?
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
+ q2 y$ W O/ j7 ?
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
; ]% c) H9 N$ T5 \6 a
5 p5 a; I2 o) I9 i, Q' s
// 映射中断
- v5 F; A/ `! l0 k
IntChannelSet(SYS_INT_EHRPWM1, 2);
3 Z& X! g$ R' ~
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
1 S# |1 {8 Z7 Z7 M; h
. L9 [; Z7 m# b' m# }) a7 q
// 使能中断
/ H: [) I7 T9 ^5 a& u/ i
IntSystemEnable(SYS_INT_EHRPWM1);
+ k D; }/ N& S
IntSystemEnable(SYS_INT_EHRPWM1TZ);
2 z, L2 [/ S( \% E; U
}
9 f1 ^) ]* l9 [! h9 j. Y
x5 _8 Q6 R5 b- U# B% d2 l" {3 x6 s
/****************************************************************************/
3 c. z; Q) U* D+ }. x( K4 u
/* */
! ^0 }, C3 [( p+ e& n7 R
/* ARM 中断初始化 */
4 Z7 ?; i; [1 f
/* */
# U0 `" F5 S; S( n3 v9 P9 {
/****************************************************************************/
! K! g4 E9 m" H: v; w6 C
void InterruptInit(void)
# Y' P& }7 k) U4 i' ?
{
& [- m9 X7 m X& ~5 @3 H% ?
// 初始化 ARM 中断控制器
1 z- M2 C* Q8 U( y. d1 U: f1 D
IntAINTCInit();
+ @" q$ m# f% ~6 w. U
7 i$ `0 g% k4 V* v
// 使能 IRQ(CPSR)
" ?0 T9 X+ \: M% Y9 }5 a9 N
IntMasterIRQEnable();
$ N1 J& X1 w, }& K& E+ @! \! p: m
$ t+ L& C/ U. N) ` t9 r, N* j: ]
// 使能中断(AINTC GER)
' A3 o' A6 W4 A# J& n8 T& m! O
IntGlobalEnable();
/ b! [ d. p. l! g
1 k% ? Q' _: `1 S! Q) B- y
// 使能中断(AINTC HIER)
) \5 M( P! Y- r; ]) f. ^) }1 M: p
IntIRQEnable();
$ k* Q. ~7 L& ^' p" R- S
}
$ U( Z L& s+ T2 _" a- N
1 M9 ~* v* u1 |
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
% d& s, B" k! C' H# ~5 s
/* */
! b% w: g4 Q7 O( r
/* 中断服务函数 */
* j7 y( r- ?3 K
/* */
: w9 \, m) g0 {6 @/ g6 M" X% j: i; Q4 [
/****************************************************************************/
% n9 Y/ Y5 X) B! y/ p; Z
void PWMEventIsr(void)
0 |9 |( V8 H, s! D3 V) T* }5 x' T: p
{
. R& l) |( n% c0 Z% C
IntSystemStatusClear(SYS_INT_EHRPWM1);
4 E* m) `# L) E3 s( w
5 U" W! Z1 P6 N/ C9 R
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
# D7 x, J' R( f
}
* l! i* I' a5 G' ^2 y
' M; O1 C) c& f: ~' y( e+ h5 U* q" m/ }
void PWMTZIsr(void)
. J# T w$ V# _
{
6 k% ^* X* F& K. e( F" ]/ a5 m
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
^" d/ a* b+ E8 R/ c- | _3 L
1 R5 m( y) }, Z* C. l/ @- e8 d
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
) Z: Q; O! f& k, `# Z" r0 z
}
4 x8 ~+ s( [, g" F9 e3 w( u4 F* `
( D; b, l! V/ l j* s. l
/****************************************************************************/
* ^$ [3 | F6 z0 ?" X
/* */
" q( ^; T: e4 T1 K4 F& v" P
/* 初始化捕获模块 */
% B- m* q; M# d: ?9 F; k/ x. \8 s
/* */
1 y: h' `2 {( W8 C0 N
/****************************************************************************/
F9 A9 ~3 D$ K) T
void ECAPInit(void)
4 L1 O# D# F6 c w! C4 \8 s
{
/ o5 X. h6 `$ e
/*-----设置 ECCTL1-----*/
' ?( x' [3 `+ m
// 使能CAP寄存器装载
; E" f( L) x3 g% g
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
8 E, k1 X! `' ~: b A, s; K
// 设置预分频值.
# i& k$ t. Z2 B& B) i9 j
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
1 Q% e/ i4 }, f2 N
// 上升沿触发捕获事件
8 e4 p9 C5 ^5 F' l+ ~
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
5 i5 p' ^; n# }$ ]) F- Q5 [
// 输入捕获后重新装载计数器值.
5 O$ l/ m8 I: ]1 ~: M0 _6 ]
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
% l1 Y; l. }' E( }$ z% E
9 S! m, Q* K/ W2 a. E6 t
/*-----设置 ECCTL2-----*/
5 o5 M3 P% e, o. Y$ ]; A
// 连续模式
3 j8 v: v6 v, X% J: X; Z% q' s
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
+ @& m" f" C6 @2 a" q% W- z
// ECAP计数器TSCTR持续计数
5 k. L. X3 l& n3 M; ]. y) X+ t% v
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
l6 @/ Z8 t+ ^3 V
// 禁用同步输出和同步输入
) F% n. l* d' {* x5 k) ]+ Z
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
" G, i2 `. B( q. q9 P% ?
// 配置 ECAP 2 为 CAPTURE 模式
; \8 S1 e6 r! o2 X' U3 i- @0 v9 y
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
4 p0 U: y* \ s2 W
! e% [! T: m& ?& a: i9 H: ?
// 使能中断
9 d# Y3 p: P8 g
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
; S) [0 N* u/ X
}
' ~1 Q2 M0 u+ E: ]
: t: m' M; @& }0 i* o
/****************************************************************************/
9 D. l9 @; ]" } \$ g
/* */
) r0 Y7 q: U( k/ ]/ e; W+ r# B l g
/* 取得捕获结果 */
2 W8 Q. Q) X5 q& v: Z2 `
/* */
. Z9 T: r8 \" ]& {4 x1 V9 |# _
/****************************************************************************/
' k9 c. k% z% I/ I, T+ e
unsigned int ECAPRead(void)
# c/ @3 P# `2 P' o' `, W# F0 d, D
{
6 q" N) {6 t) D; h" J" j3 V, r P( v
unsigned int capvalue;
4 u+ U( |! C5 E8 C' ?
unsigned long frequency;
# t9 z7 s7 t4 a/ I/ r! O) S
1 H0 F9 L! O5 u: \
// Event1 中断标志
- a, u. m4 K: G0 W
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
6 @: v$ X: O6 W- k: |1 H( {
{
2 q* P4 B6 s$ d( L* [0 e) k
// 取得捕获计数
; ~/ M7 S- X! u, z8 Z+ f/ n
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
) ~$ `$ `5 i4 M, I1 p( m
capvalue = ECAPResult.cap1;
6 |4 C" v& G2 o" p8 h' A8 t( m
- u* Z$ r+ ^; Z' P- o" w E
// CAPTRUE 模块 228M 时钟主频
+ ~/ \0 o1 b, x" j
frequency = 228000000/capvalue;
+ v1 Q, U f2 g4 n
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
& z) R1 [ j l/ O7 I; _
6 J. @! {# M. h3 H; N6 k) p
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
% S, t/ F& h( Z) h4 D& H+ Q
// IntEventClear(SYS_INT_ECAP2);
# ^4 k" z1 [; q7 d* K v
}
. n& p2 i7 T, o9 o9 b: [3 R* S
return frequency;
! n; K0 i; E1 [3 b% m
}
9 f2 l8 v4 P7 F, n9 t
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
1 @- T3 @+ O$ F8 A2 u" o
[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