嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
1 k+ M: J1 I9 y
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
% Q5 v* f* y* M- p1 s! m8 Y
/* */
) a4 U' ?$ }7 H4 @4 i
/* 宏定义 */
: {+ O! r" ] w$ U- J/ d
/* */
0 c/ ^! D& }" B9 n! p5 r
/****************************************************************************/
2 U/ k; j& n% Q4 I
// 软件断点
1 U3 N" y! ~. f! L
#define SW_BREAKPOINT asm(" SWBP 0 ");
1 R0 ^9 }) X" T( l, h
4 A, y* ^3 J1 R2 D6 ~3 p* `
// 时钟分频
3 x7 O0 v6 D5 W- ~3 u. ^
#define CLOCK_DIV_VAL 228
! V2 p- P9 N9 ]/ F8 Y
" x- e& O: \ Z5 G
/****************************************************************************/
' O3 z# Q$ t/ W" U: q% n
/* */
0 ]+ j: |) X" ~3 R
/* 全局变量 */
, U1 [5 ^; |2 q
/* */
, O6 @0 }2 i6 l) q" ]
/****************************************************************************/
2 s, i( ?# [' ]8 R( Q
ECAPCONTEXT ECAPResult;
7 d( R- ]' V" ^. ?5 ]8 B( ?
3 R" [" J5 `+ i, h' j( d# ?0 ~- c
/****************************************************************************/
( {) R" t2 z) r2 D
/* */
, S. c* i" M3 L% o+ g$ P% m
/* 函数声明 */
, _* g' X9 T7 C# R0 s: M
/* */
# m/ d/ l) I/ D$ o
/****************************************************************************/
: e0 J, Z* L- ]! L) u
// 外设使能配置
& f3 Z. M0 \" o
void PSCInit(void);
1 Z5 }1 N' b+ J
$ T+ h* e0 ^) B
// GPIO 管脚复用配置
+ G9 `. @4 x ?& G `$ [
void GPIOBankPinMuxSet();
+ U7 g# n9 A( [0 U! e
e2 a' }4 F! i0 _9 ?) i
// 产生波形
: L, q/ Q# t1 D7 {
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
1 h1 I$ z2 x. M2 V
void ChopperWaveform(void);
. s" @: X: q0 G& O$ C% v, i
) Z4 V6 @ f# m7 ^8 M
// ECAP初始化和读函数
. S5 k1 M. R% l
void ECAPInit(void);
$ d" X1 a4 t9 B1 D) [8 j* D% c% z
unsigned int ECAPRead(void);
; j y0 @, b1 \& r
/ N0 ~, |3 i; c$ D! M2 K
//ARM 中断初始化
( q3 b+ l0 A8 z- Q
void InterruptInit(void);
1 U) A) H0 _- W4 X7 |. W) {) p+ a
. O" v+ g3 y) ~* x5 c
// PWM 中断初始化
$ |2 m1 V1 \( F5 n1 g3 J& U
void PWMInterruptInit(void);
# ?7 w7 h) O, j! J! r
// 中断服务函数
- }% B: f X; F9 C1 R# S T6 w& D
// PWM 事件
* c; x. }/ L/ c
void PWMEventIsr(void);
: [5 j# H& q$ [: V4 b" b' C( R
// PWM 错误控制事件
0 s& ~0 k9 x" c8 W. z
void PWMTZIsr(void);
* v/ b$ u: ]3 g! K
7 W7 o. I# m5 S ?$ B$ R
/****************************************************************************/
s8 T0 L# s$ V; o7 k* p& v
/* */
0 G* @4 [% ? M5 y4 F2 S7 b4 ?
/* 主函数 */
; ~% G+ j/ F! x: w4 b" t
/* */
2 o( X2 m8 ~3 ?* T3 f
/****************************************************************************/
7 N. i$ X9 Q7 j6 @" F4 |" N
int main(void)
, j6 _4 Z) v$ G) t3 d$ o" z' W
{
1 [" j+ J: o4 M( N4 f1 J
// 外设使能配置
! R2 O( b4 W Y8 `; F8 D
PSCInit();
! i: V: C; w7 Z$ r
; k- D F% k4 j. k g
// 初始化串口终端 使用串口2
4 u2 P0 x I5 \: \: m u
UARTStdioInit();
% L7 P( b, ~3 r* D2 U/ \" I
, w" \) W+ k8 u& J; M) y
// GPIO 管脚复用配置
9 y. S- M7 l: v0 ]
GPIOBankPinMuxSet();
; e: j& U* J% W3 w! `! W& O) w
8 M- W+ k! f, S4 I
// ARM 中断初始化
: Y, L* w2 R3 J8 ~
InterruptInit();
* x3 Z1 B5 b& G" d$ h
8 p' ^9 T6 ]0 B9 n# K4 f
// PWM 中断初始化
" J: v% y W: s1 X4 V- K. ?
PWMInterruptInit();
6 c7 W+ F; ~+ P% r; m
9 `$ k ^! F+ k$ [2 Y5 Z6 @
unsigned char i;
; \* e# p2 d$ x" @% I$ k
unsigned int j;
# c; D4 u! t6 p+ S
, k/ S* R9 [+ t" q7 z
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
, q- ]* |# W' Q S3 e8 X, @* o
UARTPuts("------------------------------------------------------------\r\n", -1);
8 F( |$ l. f5 G1 W
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
! ?+ f' N' `( g7 e2 V9 K
// 产生波形
& ? x& I$ w# P4 S, `2 X5 g: s
PWM1ABasic(25000,50);
- Y# P0 d; ]+ y1 r1 Y. g8 q
/ ]$ m2 i8 ]& `; T
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
6 J' X' _: _- P8 `: Y; F& C, M# P
UARTPuts("------------------------------------------------------------\r\n", -1);
' r T; b9 g' w) D& A& ^4 _3 n
. x S3 R' G# Z0 ?
: ?# @; e ^- ?
- j6 k& U, x$ b4 m3 d3 T3 M" w A, U
UARTPuts("------------------------------------------------------------\r\n", -1);
6 g2 E+ S4 |' {4 M% Z2 _
UARTPuts(" C6748 ECAP Test\r\n", -1);
) I; a3 w0 o+ \$ v7 U( L" ]
// ECAP 捕获初始化
# ]8 }! W) k4 u. P8 }- I0 l7 G
ECAPInit();
9 B& n1 ^ X; B- ?9 ?& H+ M
UARTPuts("Initialize ECAP.......\r\n",-1);
5 y+ e- ]% a7 _6 D0 J
for(i=0;i<5;i++)
2 v% s% A) T. H" q8 j! a" \
{
5 G+ g5 Z: e5 i6 F! h
for(j=0x00FFFFFF;j>0;j--); // 延时
4 k3 ^+ R& c: c7 p
ECAPRead();
8 i' `9 ^% T, d" f
}
. U! e) c; d$ g- ?# v: c+ T
UARTPuts("\r\n",-1);
6 b2 [ m, X) g8 N& }3 q7 l
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
: v* R7 n- h/ B7 A+ O
UARTPuts("------------------------------------------------------------\r\n", -1);
9 K/ ]) z8 K5 E3 e
6 w& V8 F* }' {- i' v
// 主循环
3 F c" }: J( ]) H
for(;;)
. X! h1 O: z! N. b: h+ X
{
/ _; H" ^' P* L$ T# X6 X
$ W2 J1 \$ K' j
}
9 L- ^$ J; }" H5 z1 s; `
}
/ e- l: p* _/ g
) \7 }/ r0 P* F) p" ~( P
/****************************************************************************/
# h& s* J# t4 E6 M' K& ]0 s6 O6 P7 s
/* */
; {" q- u: T. V$ ~
/* PSC 初始化 */
/ J' [: a5 f* s* g9 S/ z* U% z3 l
/* */
+ C; L+ J7 Q! n! I( R
/****************************************************************************/
, @9 \% S5 W G5 B1 p! z
void PSCInit(void)
9 h- ~% W, \" }+ L
{
' _: i& M! b4 Z& g, L% o% U6 @' H5 r1 ^
// 使能 EHRPWM 和 ECAP 模块
' w: C+ }3 Q+ G: B4 _! W
// 对相应外设模块的使能也可以在 BootLoader 中完成
/ Q$ u/ T, f( W0 v+ H
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
. Q+ e7 Z8 N9 J
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
0 A! F( D2 q5 S! u6 F
}
$ ~6 L3 ^ W/ i# u
) E! `2 \" A! ]. S
/****************************************************************************/
9 N0 N7 k+ y5 d$ s1 K3 h0 Q, I
/* */
% T0 A4 J& v+ T
/* GPIO 管脚复用配置 */
, n, C. p$ A" G0 k& B, V2 l+ D9 b
/* */
9 F" J* g. E; }4 J x) y
/****************************************************************************/
( U1 j9 e7 ^. _0 E. j* _0 T3 @$ }
void GPIOBankPinMuxSet(void)
* d- n. r) a3 S0 r- S. x
{
' \# E9 t- l( H `% K
EHRPWM1PinMuxSetup();
$ Q8 O: @1 P9 l" C4 {8 B v! b- _9 s
/ b* y; G$ H6 ^) `
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
" g$ H6 p" m ^$ \: h2 g7 l
// 作为捕获功能时管脚方向为输入
% h' t! [5 R, M3 {8 x' Q; k. `
// 作为辅助脉宽调制时管脚方向为输出
* B" l T' j6 y& s9 X/ P* g
// ECAP2 / APWM2
! U6 R. a% B- g* W. L" N, n2 m$ v
ECAPPinMuxSetup(2);
: m4 z7 Y% J9 p
8 I. S5 }' |4 H: T6 b) R
// ECAP2 / APWM2方向设置为输入
5 C7 A% Z4 S8 b* D
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
" E$ G8 ^" u) _0 M0 e! y
}
1 i: Z2 e i' `/ |
- k" [ v; n- W0 K* }. j' B* y
/****************************************************************************/
/ h) Q' |* ~8 @3 W
/* */
0 N y/ c( Y8 Y- v
/* PWM 输出波形 */
; R. d( I9 g. a4 ^3 i+ V- L
/* */
1 W5 I; l7 H' Y; ?
/****************************************************************************/
9 h& a8 u. v8 i4 \: q
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
- @$ s2 F1 ^# H6 c" ^
{
& a- K+ w# f2 J' F7 `% u5 y" u
// 时间基准配置
( h y$ i/ H7 @' X6 J9 G- b
// 时钟配置
`( e5 z& @. `( g# {
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
7 `# i9 N/ B$ t6 V( L
- ]. A' Z' s- D
// 配置周期
1 U6 u' x+ T9 o2 s6 l
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
; @% U1 X1 W! e; x8 K' G
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
# Y: `9 W% ^4 U1 m1 V: T b
7 i5 F' Q/ A# Z1 U8 r6 L
// 禁用输入同步信号
/ p- \( F" m$ f, t$ g
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
" f8 H% [& f, q; @6 Y
) ~9 }, o$ w9 [6 F- H
// 禁用输出同步信号
" v, h) ?7 p _" z- E; n; ?
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
: ]: B$ h D: a
7 V2 t8 M9 @ y
// 仿真(DEBUG)模式行为配置
8 Y7 G0 ~( c( o" e
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
6 l" E# s& ]$ t* t) b: }
( T( H0 w J1 {' v- C8 j* G
// 配置计数比较器子模块
; J4 v# W: U4 B4 m: G
// 加载比较器 A 值
2 k5 g" l; W4 l; l
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
" s( R3 U$ s7 |# z9 \+ ?$ [- |
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
- F ]0 W0 e0 @1 z
# `' E% C: v u/ U" ~% X
// 加载比较器 B 值
7 j3 D( i/ c0 b2 y1 m+ O/ G
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
9 p: V. |) P; [
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
+ X) a2 }! i h' A8 \
5 Z. y3 x ~+ [+ W' A
// 功能限定配置(输出引脚触发方式设定)
3 R: \& N" H0 d- p( `
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
+ v% p" p% t9 n' D! s; u# n6 {
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
/ W5 ~* M9 U h" d1 u
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
2 u8 O) G6 F$ P% ]
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
" H& y% C. a* L7 b
) j8 B8 ]4 L+ N6 c" T Q
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
! @8 Y6 k9 Y/ j8 J- [' N: E
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
7 k2 O) f5 V( B& ?- ]+ Q9 T: ?! W) E
" f% x* z. k. E8 Q
// 禁用斩波子模块
+ D8 _) c# x+ W7 d
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
3 [' @" U# K- \) B% a/ Y1 v+ S+ a
7 N' }3 }) L1 R4 R
// 禁用错误控制事件
% @# b+ k# D' X+ D7 y+ s
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
* ?' k1 q; N6 `% M0 ^% T0 d7 K
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
, n; X' l6 E& ^
: f1 \; b5 B; }( O
// 事件触发配置
) V4 n9 A y$ q* w- ~
// 每三次事件发生产生中断
$ j0 ]7 i! [/ H4 l- U1 ^
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
7 ^$ B' X+ L) V0 K
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
6 q# L1 d" J* I" e" E
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
) ]7 A1 ~6 i$ F* ^
// 使能中断
9 \- q/ ~5 U$ [$ h6 w5 I* m2 l/ q2 D
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
3 ~& B, O4 g/ ^
5 X n8 i9 W$ H
// 禁用高精度子模块
- u% ^9 ^6 f7 M
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
/ v" ?' J3 T$ \. B" B% |4 g! r6 X1 g
+ H7 a6 N6 m# z6 S
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
d" Q: Y) Y1 D7 c
}
% e4 v) S' }1 n0 Y! F
2 P* n E4 p- M, N+ r
void ChopperWaveform(void)
* r# Z j l, s: L
{
3 T$ G% W* R' j
// 50% 占空比
+ x$ C- Q5 R) s0 L
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
: z* |+ o# b# [0 ~
// 4 分频
w* n( Q, o7 _% S4 ?9 z
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
; u- N# g; \' o1 A! X9 i9 f
// 单个脉冲宽度
, w9 ~6 a9 U- _8 T
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
' h* d- `8 D. \1 W$ o9 ?
// 使能斩波子模块
/ M. _3 [8 r' y# \
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
+ y0 p/ v. @2 L6 r4 t# u: m! \
}
+ C8 I% a! L1 N9 N8 \7 ^6 d
/ A, `9 d4 c4 O8 t
/****************************************************************************/
/ f. z5 b# h+ Q; q3 n5 p6 N
/* */
, C: e( G: d- n/ P6 r7 ]3 o' [" {
/* PWM 中断初始化 */
7 |( V9 m8 k% X7 _ A6 P
/* */
) u- C3 A h- W2 e' R
/****************************************************************************/
; J [! ^2 x3 Q, C* f' Q" j7 s
void PWMInterruptInit(void)
9 F5 W1 S) B! r n6 v: N: }& E
{
9 U5 l: ]# H8 u4 L; X" J) k* ~+ A6 M
// 注册中断服务函数
) I2 @, {$ Z2 y/ [
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
% f! p8 e& k1 w% D
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
4 p' Q0 d5 f/ }, S, N: |
0 ~8 q' L; U6 `& C5 l% |" {! o
// 映射中断
2 \6 B$ H1 N& ?- O
IntChannelSet(SYS_INT_EHRPWM1, 2);
l* Q. h6 \4 G5 i- B
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
% Z' S7 a+ Y- Q) {
( Y) s, w+ N! n. N% W% V! B2 ^
// 使能中断
% z& y" x- ^0 ^
IntSystemEnable(SYS_INT_EHRPWM1);
8 }' c& `: t1 P
IntSystemEnable(SYS_INT_EHRPWM1TZ);
- }- r1 n2 h4 M H/ L6 n6 e5 l
}
- b9 W, Q1 C0 G9 z3 Y8 P
' N( Q+ p! D. ~$ v, V0 N. ^1 |! b
/****************************************************************************/
6 @0 L& z, m' k
/* */
! e, ~, N- W3 n9 l1 e9 ?
/* ARM 中断初始化 */
" p+ Y. D5 A( j7 [, \% m
/* */
: G! a/ U) t6 t8 t, `
/****************************************************************************/
& i& x. y) L6 t! y! W" \
void InterruptInit(void)
7 |8 D N2 N5 ?! m% Z9 G% q( y+ [; Y
{
* A) R* @4 O! E) e; a$ N* A
// 初始化 ARM 中断控制器
4 M: [; G, ?, k$ @
IntAINTCInit();
" M( `. D, @, ?% d! j
- u# H2 d' _. B5 N8 A+ N
// 使能 IRQ(CPSR)
. x( x/ o: x" j7 n
IntMasterIRQEnable();
2 ~: l% [) M9 f H$ B7 v
6 v) e3 t+ Q% I$ @1 i( s! V: }
// 使能中断(AINTC GER)
5 C5 ?- W! m( [8 C
IntGlobalEnable();
0 Y* j, o! L6 @; U$ i
# ~* _) t( }6 j; P! n: Y |
// 使能中断(AINTC HIER)
. W3 S% n0 T6 d- p3 H
IntIRQEnable();
0 l8 R3 ~$ n1 m
}
9 E7 r% u3 H( M
( e) Y3 t0 ^! `! G
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
: G# w; @( N4 t+ ^0 t9 \5 `0 J
/* */
0 l9 w0 m" t" D% g" f
/* 中断服务函数 */
7 B& n; W- |+ Z1 j+ J, c7 X( ]0 {
/* */
+ d7 }; Y- ^$ O* M, z' v% X
/****************************************************************************/
. \' T5 [7 j' O1 v, h" Q
void PWMEventIsr(void)
5 q5 g2 c5 t' ~2 J8 Q9 Z
{
; j# }% W# q' M
IntSystemStatusClear(SYS_INT_EHRPWM1);
- l8 p6 h# k2 Z. W2 x' p
2 P$ o/ U' r: e* A
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
# c/ G9 r0 x; ?
}
- u9 b$ b" P- ^/ l
4 w: e: ~6 b! e. y0 z. E
void PWMTZIsr(void)
! m4 d: Z9 n8 m/ ?& a F
{
( T8 d; V! A# W' R
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
$ E) v r, y# [2 ]& Q
E6 P* v4 a1 a' z) W
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
4 k* e$ ]& b) A1 S+ M% S" @$ a1 V
}
4 ~8 F7 i. k' B7 x. k+ i
/ T! I- P) f' i1 s4 Q5 L# h
/****************************************************************************/
+ p j! E4 q ^" o5 ]
/* */
+ G' p# g# ?: d1 `6 ^
/* 初始化捕获模块 */
) X k u! q0 ?3 A0 r
/* */
4 R6 ]1 {( x; v) z6 _% p- |5 O
/****************************************************************************/
2 W$ H6 X! m( V& w* c4 X4 H
void ECAPInit(void)
1 I# ^0 u: P6 f. ?
{
& Y! B$ f+ B2 {) S8 X" v5 g
/*-----设置 ECCTL1-----*/
/ n6 O$ a; X! l3 H, Y% _% o3 a
// 使能CAP寄存器装载
" Z! i ^2 P% u0 e! _
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
3 ^* [+ U: ?! O
// 设置预分频值.
1 |6 t0 R! j! ], p
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
) \) \, i1 W) N: v
// 上升沿触发捕获事件
& f3 G; a% N% P
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
2 T) b/ c/ W/ P o; s5 d
// 输入捕获后重新装载计数器值.
# L, \$ t6 @* w1 I4 D
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
% [( `3 J5 c7 E2 l
, G' A: m' R( ]% r) z' x8 y
/*-----设置 ECCTL2-----*/
4 ], S* a( t' W! i4 S6 X
// 连续模式
1 J7 `/ X7 Q' u$ g0 e# m& L2 A
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
) u a o' Z' Q# w# b+ G6 {# k' _
// ECAP计数器TSCTR持续计数
+ V3 I( D7 u' ~8 n* D
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
, p% G0 |0 c- `
// 禁用同步输出和同步输入
3 H7 V8 O) ?' `; s2 E
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
8 W. N8 m0 e, \# ?* |8 W2 r
// 配置 ECAP 2 为 CAPTURE 模式
; t* _1 F& x- f/ P. Q
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
- t3 y6 }/ G& y7 I$ ^
; c/ d" F+ ~: S3 D, O+ Y
// 使能中断
7 ~: L0 X! s8 O! {3 F5 d( L& K* [
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
5 K. Y2 w+ h a0 S# `. q
}
; ~. m: Z6 u! o! ]7 t) a* w6 f) n
2 U- M+ ~. \8 i
/****************************************************************************/
3 `7 z3 i& i/ A* J
/* */
/ g1 e9 j3 a0 h7 g% ?" o2 I7 X+ G
/* 取得捕获结果 */
- Q7 N$ E' j, P0 p9 l
/* */
Y9 Y4 y; S6 F
/****************************************************************************/
$ X& C% N1 D I' x' @# G
unsigned int ECAPRead(void)
7 c1 O$ E* r6 ]" g# U: U$ C
{
+ q7 w& D$ o K- v: }
unsigned int capvalue;
7 u! b. F' q3 E6 y+ W: ^ D4 [
unsigned long frequency;
, ^2 s; m* V" ]# h3 R
# B3 ]& f* C; U0 h
// Event1 中断标志
2 Y6 a6 x$ {- w7 X" P- r7 o2 T+ v) q
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
& j5 g* Y0 @5 C+ w% _8 o1 [
{
7 H* Y7 x9 B8 t
// 取得捕获计数
$ W9 h2 F% L' g$ q: F" {$ |! v
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
( f ]% t( {, i- r
capvalue = ECAPResult.cap1;
# f6 E# T V& X4 R! W+ i, Q
" ?9 z5 `) R& A% u
// CAPTRUE 模块 228M 时钟主频
' Q4 L. R; \" ]6 m D' G+ z% j4 i
frequency = 228000000/capvalue;
0 L! N! ^/ k& g
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
* g0 t! a; y7 L( ~ z
- i# r( @5 o* Q5 I5 _ G; C
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
' g4 ^' n8 i4 @, j( I( K- w& q
// IntEventClear(SYS_INT_ECAP2);
1 J. n& N4 F+ k9 x# J
}
+ E! Y1 E9 y2 q$ a3 @7 o
return frequency;
% W% W( t7 W. B u
}
: z1 |0 h; `, p. B3 Z8 t* c$ B
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
$ J0 Q) {- m) [4 X. }' G
[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