嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
+ \$ t6 _, c& A% T
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
) ?7 F- e6 |; j
/* */
+ ^3 i0 X1 y7 h! M5 Z
/* 宏定义 */
& A8 s+ e3 z Z5 H% j
/* */
- U% m* p3 I: e: y. U4 W* B
/****************************************************************************/
, L7 I m1 E; e7 f
// 软件断点
: ]1 r. k: d6 E4 A2 B9 o; [
#define SW_BREAKPOINT asm(" SWBP 0 ");
, q/ T, p9 r, ` D& x
. x+ |. e! g. M' ]* r+ q5 c' ]
// 时钟分频
' v5 g) R. ~( | O8 s) h& ]
#define CLOCK_DIV_VAL 228
7 O8 _) B5 Y1 K
' S) ^" r- R D9 `& @2 P1 g, t
/****************************************************************************/
1 X2 S/ N" X/ T1 R
/* */
. w/ U" [% v0 c# c
/* 全局变量 */
8 L, p, _ w- ]
/* */
* U- g1 @: i. {: j, z4 n a7 g
/****************************************************************************/
4 _5 Q8 L6 d+ i% T2 g2 b4 x
ECAPCONTEXT ECAPResult;
4 e- w' g2 X$ V z" I$ {
; M$ k6 n$ @! Z( W$ a
/****************************************************************************/
# c: @4 E& e8 s. L, C
/* */
9 t. e. G- t( \+ ]$ n" r
/* 函数声明 */
' U( ^0 y2 t8 w2 V/ i" q! u7 \: s7 D
/* */
. M% s% w6 E" o& N
/****************************************************************************/
2 f# P" t7 x! H
// 外设使能配置
+ ^+ O) ]7 Q4 F5 n
void PSCInit(void);
" N9 u- Q$ Y& \; ]5 H" `3 u
2 x9 A/ m, q4 F/ x4 \
// GPIO 管脚复用配置
/ n6 F6 W8 h0 x X) w: K* M+ s: S
void GPIOBankPinMuxSet();
! |4 T, _. e6 s/ L C, P, f4 H; N
6 L7 A! _1 s3 c9 N) p. } ?- `
// 产生波形
2 m3 S, l/ a7 F' D5 h9 A
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
, Q" h$ ?. q; d! C; E; ^
void ChopperWaveform(void);
3 v3 C3 U4 z" n
3 {2 `% L: ?# U. `
// ECAP初始化和读函数
( U9 v# I4 Q' z# H$ v* ]
void ECAPInit(void);
' S" b2 W2 l2 E% b
unsigned int ECAPRead(void);
. m( w& \8 {# I& m: ^
% q, g k6 S4 Y4 [; Y" F
//ARM 中断初始化
/ c: v2 h' ]! Y4 Y# L0 d
void InterruptInit(void);
8 @. O9 f, X/ ^, v" H5 b
3 {0 |" S# _/ Q1 y/ @, Z
// PWM 中断初始化
" ?0 k8 a9 U6 n
void PWMInterruptInit(void);
+ m/ M! b0 f; ~5 W# U
// 中断服务函数
3 H" N! p& s3 w
// PWM 事件
5 {. b! I7 |: F% i( ]2 B( r( w
void PWMEventIsr(void);
# ~! |6 s1 z& C: u
// PWM 错误控制事件
+ d7 @: L$ M% q+ \% D
void PWMTZIsr(void);
( ? q- N$ g5 N3 a
& w; w, ^- ^. l: I
/****************************************************************************/
5 X- b+ D$ h2 r
/* */
( e- t/ b! A, y! g- e% C- |3 T& \1 S
/* 主函数 */
* N2 G5 K4 S6 Z( T6 m
/* */
. ^6 R$ A$ s* e5 F. P) N& q- s
/****************************************************************************/
, U+ A0 ?/ H; D$ I9 z
int main(void)
: G8 y7 R3 r5 Z
{
/ x4 T k6 y1 P4 A
// 外设使能配置
+ A: y. J; n! c$ K' m' W0 P+ r
PSCInit();
0 z/ ~- a4 K g* b" j; a7 Q: g$ Y
5 F; f+ }7 f- ]5 R
// 初始化串口终端 使用串口2
0 h" _$ f- L" p) {4 h p
UARTStdioInit();
: Y t7 e6 P, Z" t& S8 }
- S5 H0 F) N$ K/ d4 @7 K3 T
// GPIO 管脚复用配置
, C( h q1 [- }1 s& w9 {( Z5 H
GPIOBankPinMuxSet();
; z# |" J* _; x) F W: k
- k, R; ?: k" z5 T
// ARM 中断初始化
) P2 a2 U/ k) ]8 D' @2 ?
InterruptInit();
/ r. q' C! h' o+ C9 C, w
( q! i7 e M& j- D! u
// PWM 中断初始化
% N! j8 h1 ]. D: L
PWMInterruptInit();
U+ h- m/ a2 L# j, b7 u
6 j: V, i' G, P; `! k, c
unsigned char i;
0 L) f1 Y. o; k9 X+ K5 b/ {
unsigned int j;
* k# M- A* Y4 I6 J
2 v9 S. W! F0 W( g" p- W. n
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
4 w. {# C9 @% k2 ?5 ?5 b+ y
UARTPuts("------------------------------------------------------------\r\n", -1);
- c# t2 j. L2 j' ^! S- H/ U
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
( p: w+ i# u: W; Y9 \
// 产生波形
9 d F7 l6 o& s. l2 |, b8 H, I: @ E
PWM1ABasic(25000,50);
' p# z. l8 p. M8 o0 L8 l- {
+ T1 `0 y- A8 u$ n
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
* C$ N; n3 ^) X4 ~, P% b7 A
UARTPuts("------------------------------------------------------------\r\n", -1);
% n7 N, w7 N9 n# k4 s3 w- Z
/ I$ g: D0 c+ r3 T+ W! C8 U
: o! j# R" \% O7 P9 T
3 Y: c; ~/ [( i: ~4 _
UARTPuts("------------------------------------------------------------\r\n", -1);
4 }' H5 @" c! R. R" m
UARTPuts(" C6748 ECAP Test\r\n", -1);
, }+ b! w6 B9 \! |; H
// ECAP 捕获初始化
0 N$ v7 C" B3 _2 n
ECAPInit();
' J6 R$ a9 @% x' W" \1 v! v- W
UARTPuts("Initialize ECAP.......\r\n",-1);
0 L3 t. w( I. H" \
for(i=0;i<5;i++)
1 I6 U* q/ P( q+ J+ o' M
{
- R; `% h; H. s! n
for(j=0x00FFFFFF;j>0;j--); // 延时
$ P3 S* l* @; F# t: @
ECAPRead();
* h0 D1 L) l6 ]
}
4 H7 o8 v, H$ H- x' y8 l6 n
UARTPuts("\r\n",-1);
7 f7 c/ k! f& X4 p
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
; O# h8 x' z6 X6 k A
UARTPuts("------------------------------------------------------------\r\n", -1);
8 ^, ~7 T. J1 ^( C- m
1 a2 q/ ]/ c7 u8 i0 \
// 主循环
! H' t) n0 [) ]( C- x! b' u
for(;;)
?7 D" e4 K/ t) ?9 Z4 u
{
( G7 c* m/ Q( l- n+ Y
1 c$ _) I) W- Q. G
}
. U9 @; u! E8 v2 e2 P1 b
}
; e8 A2 Y3 g, a! y6 P! r
7 g5 K5 z1 v7 U; y
/****************************************************************************/
2 {* n9 _5 C1 [" ?
/* */
& R. u7 R) a" I% Q3 C$ E
/* PSC 初始化 */
! N- v" X4 [$ m( o7 v
/* */
8 n% a: b6 L4 A; R' M1 Q7 s0 T4 C1 D, V
/****************************************************************************/
$ P/ _; F9 f) [' e) C
void PSCInit(void)
) p* \4 l0 A2 p7 _0 w
{
# v# }- E: @" E8 b) e6 }
// 使能 EHRPWM 和 ECAP 模块
, B M) r! I( U! `2 P4 Y
// 对相应外设模块的使能也可以在 BootLoader 中完成
( }6 n; Z. f+ _4 a2 L
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
/ x+ E7 R! p& D4 H. S7 d1 b
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
( Q5 a+ w* r5 X! _
}
: _# {3 z6 P' r7 [
$ `! \* i. A1 b( b9 e
/****************************************************************************/
$ z# Q Q" u$ x _3 O. }, W
/* */
2 o/ s7 |* l/ L% ?" T Q0 T3 b
/* GPIO 管脚复用配置 */
) u9 e F/ @8 m. z2 z* Q1 h
/* */
3 [: V; w# ?/ D' o# I
/****************************************************************************/
# T6 x. ~ q6 Y( ^; v$ j. T2 H! l
void GPIOBankPinMuxSet(void)
m- z, v1 r% A2 f
{
9 Z* F) I( h6 d
EHRPWM1PinMuxSetup();
! f+ h' \# t `. i) \9 j* z1 ~( Z- T
) r( z6 X% p7 ^% B/ i( R5 j) w
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
' X3 ]& ~" e H+ P# K
// 作为捕获功能时管脚方向为输入
. g. P2 t2 {- q& Y1 k' @6 B
// 作为辅助脉宽调制时管脚方向为输出
) J j! O8 J: x+ B: j3 ~8 L$ t
// ECAP2 / APWM2
* f- [- v& H2 M9 d) {
ECAPPinMuxSetup(2);
5 `4 \2 h* }) T& I
( E3 w/ |2 Z9 G# j5 n0 g8 Q
// ECAP2 / APWM2方向设置为输入
' D- p9 Y% H9 M- i" m" ^% }
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
4 c. P3 }: I' f0 N3 S9 m
}
9 d6 P1 i, _4 z6 l9 i# l4 B
5 p2 K5 `- M+ d: Y% F
/****************************************************************************/
/ E/ X/ k5 B* ~5 L6 D$ {% ]
/* */
6 B8 t6 V; f& Q8 S1 `+ f
/* PWM 输出波形 */
]' W' E( I+ e- Z
/* */
' ~, t% N& I- u, u3 N7 b8 }+ V
/****************************************************************************/
, W: C$ W+ S9 \& o- ~
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
8 C* K- C+ P0 V9 e2 R3 Y8 a6 Y* G
{
8 c4 i- z( C0 a& H5 V, }
// 时间基准配置
$ X/ k7 |) Z4 {. u* L, V
// 时钟配置
$ Y& I$ W* _/ h& Q6 d6 N# a9 p
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
0 ]4 V4 C/ O! K) ]+ b6 S
6 W6 b6 M6 _: x) @0 r& b4 M
// 配置周期
r) e o; H7 j6 J- H1 J
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
) I5 m1 Q3 E; U o" F4 G
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
7 [/ E; z5 v7 i
7 ?6 r( J- M1 S' `3 ~0 _
// 禁用输入同步信号
' ?9 p+ g) j( }( Y2 A
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
g' V# O3 Q' ]8 U& l2 ]6 X% W
$ P: L4 b8 j! a& ?9 T3 f
// 禁用输出同步信号
3 s. M$ d! ]5 V U+ ?" V
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
) W4 h; v6 Y8 [$ f8 I* U/ O
. S( x, c# J2 F" ~0 U' c# C
// 仿真(DEBUG)模式行为配置
2 Z, P1 q/ u- X
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
. L+ D8 r8 y; J/ Z
. M7 W7 J4 s6 o, [2 m
// 配置计数比较器子模块
2 g( S9 E6 u! g" D% N
// 加载比较器 A 值
0 g+ q7 c% o; r% f# f
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
- W. g5 ?& u2 O/ ]7 g+ a- A* p
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
, Q( j6 _- P' f3 e' i( _2 ~2 J
- E5 Q: d* I j# X M* m) l: B: ?
// 加载比较器 B 值
1 a% `, a6 Y1 p) n/ Q
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
! J6 y& v2 ?6 b4 U* `7 a) Q
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
4 k: C: \6 D3 O1 z' m1 g
' P6 y* }# i/ I( t' _0 Y
// 功能限定配置(输出引脚触发方式设定)
& S% x: O8 u# _" D' c2 x- e; h
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
2 o: q( \+ d) E' Q1 B; [4 F+ @
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
' D I- p V5 T, a
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
3 J1 g& }( C# Y9 i4 [2 M- j
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
8 g3 m& v- {+ c3 S' w5 |6 h* D
5 N5 [/ ]3 T5 Y- v8 |- [
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
5 h! c8 u) Y# F
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
) |* k9 ?' w9 N9 Q
! _2 C; e) w% W: r) ]* h& y
// 禁用斩波子模块
! T4 d; W ^; d! }" n X- A) ]
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
3 d( ? L/ @; I7 t q, J7 s+ v
9 f: V* u% y/ i7 A
// 禁用错误控制事件
- F/ u# \; o( I! n+ J6 h: b0 G
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
8 g# X0 Y. A) u5 _& ]; ^
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
: M" m! p% @1 }( D5 V. w. R
' {; E. s3 v7 Q! }& u/ K
// 事件触发配置
; s" C% j i# D* ]( N: Z0 u
// 每三次事件发生产生中断
0 P9 `7 z0 H( @4 @5 _- ]
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
, E' _6 M/ h6 ^% V7 q
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
* J V' O1 I. _& ~# [. k! I3 [& s
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
" C. g2 k+ i' |6 o( H% u7 k7 `
// 使能中断
7 f5 X! d; V2 x2 R8 Q' w1 p1 z' o
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
( o' L: a6 l) D0 f) u# n
( s! n3 m# P- `! X1 L) ^7 _8 Y
// 禁用高精度子模块
$ {5 D! S# [( {8 \/ ^% {- L! k
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
) |0 S. N" J& Z2 m, u9 M
1 `# v2 s0 q+ m9 D# q- L0 a% m
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
$ k8 c+ M* | B' B
}
5 P" w3 C1 ?- p5 k5 M Z
) u! [9 b: \! I. t- E
void ChopperWaveform(void)
" u( R1 e* m% F; J* W; g
{
% M% Z5 B6 m, i
// 50% 占空比
# _+ n1 r7 I# C3 O
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
% x% P0 {& z+ h& \- @+ E
// 4 分频
+ p* O9 Y: @4 r8 D4 E5 h: |
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
! r, }/ [+ p. A$ ]$ b* N+ }- w
// 单个脉冲宽度
, i s6 b7 K3 K& L& W
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
, f/ B/ f {9 W" X: J6 Y
// 使能斩波子模块
& z& V% _; B. z: `
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
+ ~6 f. f' I# o9 r% i
}
! X' [7 F0 n1 S9 s
8 x8 r. q) }1 ]7 U( o# m- h5 m4 D
/****************************************************************************/
% r3 w7 V2 X. F, p4 j6 D) M
/* */
; R* b! X& R0 U
/* PWM 中断初始化 */
4 b! F$ F: D& x' O0 ^8 Z; A. K9 b
/* */
, T+ w. m# S3 Y% ~
/****************************************************************************/
% p1 O8 f5 X; {6 u- }, P2 {- s
void PWMInterruptInit(void)
7 e& Y% i! j% R9 u
{
. ?* n9 K U1 S% O' v
// 注册中断服务函数
+ |; R) |8 c, i8 ], J+ ]
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
; J+ f1 y* \0 L: j: V+ D& V% Z
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
1 k' N! N; z$ Z
- b0 R) t& F' b
// 映射中断
4 \+ Z2 [8 \$ I
IntChannelSet(SYS_INT_EHRPWM1, 2);
6 X# Y: ^/ Q% ]
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
$ Z3 L5 h1 y4 A* a; l( n2 A0 `
( n9 G+ Z8 j2 G# l a+ `
// 使能中断
: t% {" b! J/ u' |
IntSystemEnable(SYS_INT_EHRPWM1);
/ |: d* R1 v/ d/ {7 r" @& m
IntSystemEnable(SYS_INT_EHRPWM1TZ);
; V* J3 z. n# v0 ]# D
}
" n/ _0 l+ g9 n9 _7 | J7 T
0 n4 H9 [; c- _0 [* | X1 P
/****************************************************************************/
6 w$ Z! }/ a( E: C
/* */
2 K, U, e6 A; Q4 u6 x V3 Z
/* ARM 中断初始化 */
" p) `+ | J! S3 v( O+ [0 a
/* */
* |4 s* q( q; @4 ^& \! k
/****************************************************************************/
8 u2 m, Z* O! S9 Z! U7 g
void InterruptInit(void)
5 I0 n" F" E7 `
{
9 z' ~* Q; o/ L
// 初始化 ARM 中断控制器
3 [5 e% }6 {) ^! F
IntAINTCInit();
$ ~' [( R# e# c( k
+ l. U; J4 @# B1 p
// 使能 IRQ(CPSR)
* {. [' ~0 u# o, `! n- e1 T7 R. {
IntMasterIRQEnable();
! H, N5 p5 G7 [" E. m! t% B
9 o: S1 b$ y5 Z0 ^. }! a
// 使能中断(AINTC GER)
; f; ]: ~) Z( r& g6 L
IntGlobalEnable();
: Z) Q: i' S0 Y8 n( \9 T
" G& ^8 A8 R" Y4 [! T- `
// 使能中断(AINTC HIER)
- Z: p$ n3 C* k
IntIRQEnable();
7 d+ G! ]3 V3 f; I
}
3 x2 o( \( ^0 p+ b: |/ h
" d* e+ b# K5 W9 U0 f& G* p: ?7 P
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
% f y1 d- l! u: Q& [
/* */
; }! k1 d# o% R5 v+ t
/* 中断服务函数 */
; K( s, v$ y3 m% @7 A
/* */
% K# p4 K$ T8 P8 ?8 H4 Z
/****************************************************************************/
0 z0 r+ g) ]2 m P" u3 P
void PWMEventIsr(void)
8 @) q" F) Q* b+ R# d) `# K
{
1 u8 ~& }! C8 w- L! G( ~' ^/ |
IntSystemStatusClear(SYS_INT_EHRPWM1);
2 a5 N7 ?# ?, p
$ x4 O6 H/ Q" T( b# {4 j. w1 D
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
/ L' u2 f- d3 K6 \- ~ j( |
}
( q9 Q1 b* M! I$ \1 l8 j
) D2 |7 B$ X" P. [
void PWMTZIsr(void)
1 r5 i* @: Q' }
{
8 j9 i! k- D7 S, d
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
8 k, ] h) `" X% Y! t( R6 X
0 {+ u0 \* h% Y' L8 z) b
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
$ G2 k' l" g, I t; N( _' V) G- y
}
2 \% \: x3 h! |
$ I& {! I5 [+ a! S, p
/****************************************************************************/
( Z+ f4 q/ S$ M! x: I
/* */
& Q8 u# G* T: Z9 `, e8 g$ a# i! O
/* 初始化捕获模块 */
; x' v) a: ?/ F. U$ s& \' B
/* */
. f l1 y# }* N4 R8 j- u1 b" I# m
/****************************************************************************/
# U* ~! W! |5 y j% e
void ECAPInit(void)
3 b0 i2 V# H' I% f# @9 v
{
( f8 l# }$ S& f5 s2 {
/*-----设置 ECCTL1-----*/
: ?! N* N% f, i6 \
// 使能CAP寄存器装载
* I2 h, m, X$ D# z O
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
' r9 J$ r: j p( V- s G% @7 I
// 设置预分频值.
0 p( ]6 b' N6 b% M3 E/ l
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
# [& N7 m6 m; V9 l
// 上升沿触发捕获事件
e p5 G$ l. ]2 V
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
' ?# ?! J, `/ Z: z4 b$ b" [1 a
// 输入捕获后重新装载计数器值.
4 a5 [+ v C4 x; f& z# v) u: B: O
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
. P7 v4 h) _' i- b( f
; M% g, V& u4 `: K
/*-----设置 ECCTL2-----*/
2 f7 `: S/ _ b9 R6 Z! T
// 连续模式
8 ^, s3 j! @* t0 q6 |8 X' [
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
# ~$ z4 l M+ C4 L
// ECAP计数器TSCTR持续计数
0 d" F+ Q7 d; ], S! m4 V7 A
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
% F! p4 j; U8 ], f% E: E" u
// 禁用同步输出和同步输入
! G; R! w1 N7 g- o
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
' Y+ @4 L/ T9 u0 Q
// 配置 ECAP 2 为 CAPTURE 模式
8 U" ?. U; P$ e" w
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
' `3 i9 n; M1 C5 n/ e* _& c
' U2 `6 f- ^* e, c5 N( T
// 使能中断
& U8 i8 Z- a1 n0 W9 o6 A
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
: \0 ?- j$ G; ~( n: q" l8 R; y4 _, a
}
0 R3 F6 ?9 |$ b0 w
; G0 T' f( n4 d( h# m5 A
/****************************************************************************/
- K7 m* A( w' h
/* */
9 t5 v) U2 s& `. t1 z A& o8 |7 G# [4 {
/* 取得捕获结果 */
2 b+ p" x" f. G
/* */
( V: Q& M! [+ ^% n
/****************************************************************************/
: _- v/ \; b+ K I7 }# T: Q
unsigned int ECAPRead(void)
! D* b6 x" ^+ _
{
) H3 [8 @3 D$ f9 |! g5 `5 B P: ?
unsigned int capvalue;
6 e2 J" u( t# r% ~4 f
unsigned long frequency;
% {& P7 O! @: B# _4 v
, k6 I* D% x7 B( l
// Event1 中断标志
" X9 w$ {% y/ m Q$ Q3 E4 {9 t" U
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
/ j' o3 ?8 Q. Z
{
; h8 j: {6 \ b W. `5 T7 x
// 取得捕获计数
: F. s5 J0 x0 i( D8 K$ [
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
0 Y9 F. O/ l. M- ~/ a3 R l
capvalue = ECAPResult.cap1;
4 o q* y4 `6 A. ]: F3 p
9 D2 l) u9 g$ v4 l( E8 r
// CAPTRUE 模块 228M 时钟主频
" ?1 T1 i- R! a' g+ a) r. R2 g
frequency = 228000000/capvalue;
9 b7 g0 b$ q/ l S8 \0 D/ X
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
. g! P( t" y/ V) D1 G
) @5 J3 r0 j/ n* y
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
/ [/ Q* c" g5 q5 k5 o
// IntEventClear(SYS_INT_ECAP2);
; j& t; i6 d( \# R' c
}
, I, m5 U% Y% I: Q- }/ A
return frequency;
: c) Q2 Z3 `# i- x1 u$ h& x) ~1 m' ^
}
% a$ W" ^5 }9 E0 z5 `; X
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
5 M* J% l9 |( y: j/ _) v0 W8 S& y
[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