嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
9 y! r, e; f+ ~! S
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
2 Y. ~6 l0 k, K
/* */
2 X- V3 b! g8 s5 }: ^ c7 U* y
/* 宏定义 */
: ^# F" \* O5 W
/* */
* p6 Z1 e9 `* U: g1 {+ e
/****************************************************************************/
I, b" T) @) c q9 Q
// 软件断点
8 K q' Z/ O! _8 G1 i
#define SW_BREAKPOINT asm(" SWBP 0 ");
6 {" L. x8 J6 i# X
, P: Z3 j0 [3 C3 S) a7 r9 F
// 时钟分频
( u" o. S: I) s* O. K/ j
#define CLOCK_DIV_VAL 228
4 x0 V6 Y" g" n0 I w4 `
. `, i. G/ n; |/ \# u
/****************************************************************************/
7 E" R/ ^7 B6 H/ E
/* */
5 X- }8 V/ g7 Y3 i% n5 k
/* 全局变量 */
" |3 p* s9 W3 Z
/* */
8 O0 ^) a. b& J- l$ S( |7 H
/****************************************************************************/
( e1 K9 i, f) X
ECAPCONTEXT ECAPResult;
- Q' Y# P4 a$ V1 `6 @! @
* c- N- k+ ?+ Z; c" T
/****************************************************************************/
. D7 [8 ^" w( w3 h8 Y
/* */
. K; E8 h' f$ d
/* 函数声明 */
7 F& p) [* e8 H0 V7 I9 H+ `7 w
/* */
- x, C) V0 L% `; z- d9 w1 ^6 W2 i
/****************************************************************************/
' h' q& u- C4 s2 ?" p
// 外设使能配置
! p5 F+ i' ], i5 k. O7 l, [/ n
void PSCInit(void);
- Z3 p! R9 V( @8 e& U2 r- K
5 w. W' e9 D. b5 a, f/ n+ {
// GPIO 管脚复用配置
; s# t1 M/ U; u
void GPIOBankPinMuxSet();
5 ^- D) r% W1 y- `
9 r3 z) E' g0 {$ x: D: F6 g0 i# |
// 产生波形
; W( g6 W0 @# i" I' P
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
* R: y- i% N1 W, a7 u+ n' N3 R$ O1 E" A& Y
void ChopperWaveform(void);
( N) z( K' _3 S' e
( N" a) ?0 A7 B, l% C* h- s
// ECAP初始化和读函数
. S, ^. j9 {+ l4 t- [# `
void ECAPInit(void);
, b5 F0 E- D; k
unsigned int ECAPRead(void);
; Y) \( b+ P. O2 R2 c' h/ q. Z
: V' F3 t6 D0 @" q
//ARM 中断初始化
' w0 k) Q/ m8 Z9 P; G
void InterruptInit(void);
( Q1 z/ v5 m4 y
$ s3 M9 I; r* V5 [
// PWM 中断初始化
3 V3 o) u9 l7 k2 s; e. _
void PWMInterruptInit(void);
' }* B- P: P4 _
// 中断服务函数
* m: ?2 p( w' v- p2 K$ v2 `3 g1 P1 p
// PWM 事件
5 I/ A" Q+ J3 y" }; w
void PWMEventIsr(void);
9 J3 I* f; D+ M1 E, r
// PWM 错误控制事件
; G$ W$ W- O5 F, P
void PWMTZIsr(void);
0 [8 W# ?, M4 v
; W P; U8 A) A6 O6 k* `4 e7 l
/****************************************************************************/
& c \8 }# ]9 O1 g; P8 Y
/* */
9 L6 v5 S$ b0 a# U- p
/* 主函数 */
+ W4 F# S8 z) B7 v! y5 ?9 ?6 Q
/* */
/ @; @2 e5 Q9 u) R" M" l6 r
/****************************************************************************/
% s0 p% L( `: O
int main(void)
$ w9 g! `4 @$ ~4 e; O
{
, k5 p9 G& e+ ?# l
// 外设使能配置
! A; F* Q9 j2 M3 {9 {
PSCInit();
. d3 Y4 L% K* b% \
9 i% B0 C7 d( }: [* |
// 初始化串口终端 使用串口2
; \: B2 [& ~* z9 C! [
UARTStdioInit();
1 B: [) T- r7 b) y# z0 }. S
( A# g/ u2 F. B' n0 i
// GPIO 管脚复用配置
1 s$ N' E; U' U7 x" C
GPIOBankPinMuxSet();
2 {/ M0 V2 x3 i |( M7 H
0 u9 h$ _6 w( U) O
// ARM 中断初始化
: A7 C- u. x9 f& m$ j/ R3 U
InterruptInit();
3 c3 G: Q) }! @+ K& G3 j# {
1 L' E7 f% F/ B. O
// PWM 中断初始化
( Q; F8 n* F! C: ]
PWMInterruptInit();
$ F8 B! A% J2 W
, [2 z+ ~; `$ R: w3 V
unsigned char i;
9 `4 ]% f6 K4 x' r. g$ P) D# P
unsigned int j;
4 Y# G) f1 ?# l: D. M
# }3 T" O: m+ f+ j- V$ j! G8 i
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
7 d7 l. Z) \/ y3 o( K
UARTPuts("------------------------------------------------------------\r\n", -1);
; _* {, D- E# P
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
2 e5 u9 A+ B5 P( n: `- q
// 产生波形
; W/ v- w; x* \, P8 F
PWM1ABasic(25000,50);
- h @+ B, H1 n% ?. v
4 F! v! T" r6 s2 f8 f: H
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
6 j7 p, Q: j1 P5 H
UARTPuts("------------------------------------------------------------\r\n", -1);
" ?2 j- f2 Y n$ A* {
& u' B' K0 d6 s7 U+ m
X$ U- X* j- S9 L
* H0 F, z- n9 P
UARTPuts("------------------------------------------------------------\r\n", -1);
* n e. T; a0 N8 w$ e) R1 B' W. a
UARTPuts(" C6748 ECAP Test\r\n", -1);
7 o# ]+ J+ S9 {* C
// ECAP 捕获初始化
* `( r8 {* O+ E3 p$ S1 Q
ECAPInit();
* d" D J, G, m$ u6 c; J5 Y) j
UARTPuts("Initialize ECAP.......\r\n",-1);
. d9 K! A& m; p! c- n5 T7 n
for(i=0;i<5;i++)
; \$ X1 P% v ]' b2 t1 Z
{
- _6 R. F: H9 U+ \' N7 A7 _' ^" h
for(j=0x00FFFFFF;j>0;j--); // 延时
, [4 R" y. j$ [
ECAPRead();
4 H: [5 R5 D- O$ r
}
; A' L" i P' ~0 t3 k
UARTPuts("\r\n",-1);
& g9 k; X" x1 h+ c$ k
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
A) Y9 B% Q- p* C
UARTPuts("------------------------------------------------------------\r\n", -1);
. K0 \; k6 H5 R, y
# J6 y" I3 l* P$ o8 X, u
// 主循环
R, h [' {% b& P; a% ?0 Q
for(;;)
5 c; J4 G4 o9 O6 k
{
( ?2 Q3 t1 U& K N; Z7 C4 h
" _* M5 Y2 W* w" u2 D6 B
}
( f/ [' n# W) p: |
}
s# A+ P, B1 x2 C
3 K( a! Y n, `( b
/****************************************************************************/
- s+ P( K+ t+ K8 Q5 z) T" M
/* */
4 Q! C# L7 ?# `
/* PSC 初始化 */
- t8 ^! f; c# a8 g: V& u# L! d0 x! O
/* */
* Z7 N- G) k7 \* u+ K/ x
/****************************************************************************/
/ O) ^* v! @4 g
void PSCInit(void)
6 E7 b7 u2 n# m7 s' Y
{
# s! Z K, _: l) D
// 使能 EHRPWM 和 ECAP 模块
3 M7 K: y; W2 g4 o
// 对相应外设模块的使能也可以在 BootLoader 中完成
9 B! C* W, P9 c2 d
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
( N/ W/ V$ v! B& T( u4 s/ O
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
, O l* I( M1 F6 A) D5 E& R
}
( B, S! C/ L2 ^: I0 R
B: P# O# k% r
/****************************************************************************/
# s1 D+ W- K9 a+ d8 l; `& O
/* */
4 t6 [7 N+ \) p
/* GPIO 管脚复用配置 */
( E) p0 ?' x. e
/* */
4 q' b% G" g1 x: ?
/****************************************************************************/
6 J& g6 F- b! V* f5 y
void GPIOBankPinMuxSet(void)
# B# q9 A- U( F6 ~
{
0 x, }& G+ u: [# O" d
EHRPWM1PinMuxSetup();
) w+ r, |) D$ S) i" m7 d R$ ^
- `; `/ D, a3 M4 u
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
1 a7 n2 e, c/ Z% q. E
// 作为捕获功能时管脚方向为输入
9 t2 w) z7 K5 S9 y; W n4 X
// 作为辅助脉宽调制时管脚方向为输出
+ }+ K6 s- J+ \
// ECAP2 / APWM2
6 \6 l6 l$ B" w# j
ECAPPinMuxSetup(2);
( r* L' p9 r* ^+ W* W8 z& p
8 g+ t- F" p' [) N' c T- X
// ECAP2 / APWM2方向设置为输入
, x* P( m& D. |' x. Y t' a" n
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
7 m; ?" v/ ~! c i, M7 x
}
/ X& f, G7 Y! V4 x: P" h9 B9 \( F; C
V0 f2 U1 f P) o$ D
/****************************************************************************/
9 f+ W, b& h: Z2 @" a+ O d% k
/* */
9 x% W0 q; ?. }8 F h1 Q& b
/* PWM 输出波形 */
8 F. p/ P; P, ^$ f( E
/* */
2 J: {+ N2 [' j) |
/****************************************************************************/
$ J* e- \4 L/ D" i
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
( K7 Y6 ^% e! q, O8 c9 T' I, s( G8 G
{
* ~/ f5 m: A6 ^1 P" l
// 时间基准配置
8 i A8 Z# s5 W- o+ b
// 时钟配置
. w$ s6 {. p/ _; g. P. G
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
& |, h7 u5 E1 f# b w4 Z
6 V4 n% `$ a1 x' K/ X2 x* g" n3 [
// 配置周期
3 o. {5 d% H1 n* {1 T6 c6 b
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
/ o [' m% r5 j3 W# G+ g
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
5 f1 B1 J* H, r) e1 S
1 n3 ?9 @8 V0 Y+ I6 b
// 禁用输入同步信号
; B7 c0 j" Z9 W2 m7 a& B
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
8 s0 B5 R9 B" E$ i& H5 N8 ~
- y! u! o6 Y* h" P% y$ t% _7 H& e
// 禁用输出同步信号
# i2 d! h9 Z7 w9 A1 z
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
% V6 Z3 u1 L7 w+ f& K
9 s+ S/ J% O4 R3 M# D
// 仿真(DEBUG)模式行为配置
1 x' {! g4 [* X9 l: k7 Z
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
0 A# Y( j2 D* r7 w# L) w$ ]5 d3 C
5 c+ b: {+ e0 q* e* A2 k
// 配置计数比较器子模块
0 E5 i' D) {# j4 x0 Y
// 加载比较器 A 值
: s) k/ U9 M. j: Y
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
" W8 X, `1 e% k. x$ Z
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
" ?4 R" N: o$ w) @+ v) x# p
& u$ y; x' m, X" H7 x. \3 \- f$ k
// 加载比较器 B 值
/ s- U+ a7 g) {9 u5 F/ w
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
K% E: J- S" P: Y4 Y2 F
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
+ w8 t' M$ U% E$ |/ U( c
" ` v! B$ K9 Z) s! L; I% Y2 d* p
// 功能限定配置(输出引脚触发方式设定)
9 R5 q4 r) H- K! A w
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
# n/ v* B( F4 L5 ]' T6 q( Q' f
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
# _/ E, {2 l$ R4 i$ H
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
+ @* U G6 x+ b: G
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
' T2 u9 a& A" k1 |
5 a6 }% h6 D" L2 W# A1 ~' o
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
; d# E9 f. p5 E
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
# w. L; {" i" i# o9 `: N
$ \/ m) f. v S; Z) c; e. T3 d0 i
// 禁用斩波子模块
$ B! K' d* e1 Y2 O0 L
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
8 t$ H, C- L8 z
) p, H2 P1 u ]5 f- G9 J
// 禁用错误控制事件
8 |, T; g* }0 t" n" F6 `9 u
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
I0 W2 u% ?% Z; m
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
# q9 d& o- W G+ K3 j! D1 E
+ ~3 e1 D% \6 q X- i F
// 事件触发配置
9 \$ G$ i' e' X: H% T
// 每三次事件发生产生中断
: z8 M, j" G: ]9 d% E3 |* a
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
0 G$ _8 c+ ~2 p& y. f
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
4 u' r8 j7 s2 V- K+ C+ L
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
1 g# y: R& n: z# x6 d0 J9 D% @
// 使能中断
) s0 H# N% b+ C
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
6 d' ]) Z! D) f
( @ |" U; p! r2 O r/ _& ?- H# }
// 禁用高精度子模块
3 n1 g" x4 L/ X. F) W
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
& X3 M% o0 d. W# z% y* A0 {% ]
9 T9 ~, Y% w: c
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
9 A4 ~2 T3 b) m: i, v3 @
}
7 f/ o( X3 k, N7 ~ |2 C
. K3 ^2 ]1 E- F1 g) E$ ]8 e5 z
void ChopperWaveform(void)
. X: t5 |( j2 \
{
0 U8 l$ I+ x% b% r
// 50% 占空比
& f$ O/ P# Q4 F
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
O6 u! [( V7 G
// 4 分频
0 k1 v$ S' U5 g( I9 J& \
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
5 s. a- Y3 p# A0 R$ p8 D9 |
// 单个脉冲宽度
9 Y% h! z+ N7 ]% `6 _0 L6 A3 h
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
. o8 e- `% e7 r% a( ?, R
// 使能斩波子模块
' s" S2 H( r# H q V
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
# l! i% K! {/ L9 t7 j- p8 p, `* m
}
/ S0 P* O: k3 K$ M' ]) Q/ }* y3 ~
$ l; [8 I. n, C; p; }. v$ I. K- R
/****************************************************************************/
6 l- D& j5 y- m' Y, L; v* i! Q4 J
/* */
9 |+ Z% [8 V2 k) W8 K5 Y- v
/* PWM 中断初始化 */
4 I4 _2 \. Q% M
/* */
$ \- ~- z, a# D% W3 v9 ~7 O
/****************************************************************************/
1 D9 N, W# ^* l+ ?$ s. @- K, s
void PWMInterruptInit(void)
* I( g% T/ x7 d# v' K8 k& c' Z# {
{
9 t, n$ ?+ O6 H2 C/ G
// 注册中断服务函数
( j/ g$ ]. q! U* [! g3 _
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
' u# F( N8 }" F- {3 d
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
% P5 }, k, q! M- L' O: s2 L
0 z. f9 U1 k0 l% B
// 映射中断
; N' U! A* W" ? X: H" K# C
IntChannelSet(SYS_INT_EHRPWM1, 2);
, j3 }' ?' T* m2 C! ~8 p
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
$ D- Z" x/ m% r, C3 C: l
5 L7 G6 r: E5 A
// 使能中断
& m$ {- ^2 H# s
IntSystemEnable(SYS_INT_EHRPWM1);
6 y1 ^+ `! F! W( U8 F( Z5 R
IntSystemEnable(SYS_INT_EHRPWM1TZ);
9 u! C( l8 ~! K3 x0 |* ?% ~0 w
}
( B4 c A1 e3 q' V* F3 a7 B
( [ m: w* ~8 ^$ R0 L6 w: H
/****************************************************************************/
2 B( z' l- _5 y8 P
/* */
, m3 U Q! A' D9 ~7 S4 T+ X
/* ARM 中断初始化 */
2 }- K( l4 ~8 [
/* */
' N! E9 W/ s) G9 b* W- f
/****************************************************************************/
% g, Y1 f' y- B/ I7 z
void InterruptInit(void)
7 x4 H6 W+ G* N4 ]6 p# E7 Y
{
, R g/ i# n, A% f8 ~
// 初始化 ARM 中断控制器
! Y2 [0 z( G; H; V4 A* K5 j
IntAINTCInit();
' B) ~) n% R8 @/ T9 m |) s
6 w: F% W8 i- F- ]2 s4 D
// 使能 IRQ(CPSR)
4 B5 N1 q& a) m, w
IntMasterIRQEnable();
2 K4 F7 }2 |- u- M% [! b: x
4 n, N6 `( v- H) c3 s/ I" y
// 使能中断(AINTC GER)
) Z9 i; y; [/ p- Y
IntGlobalEnable();
) H% J, |6 i9 B8 X1 f
7 V! i. O$ m; O; C3 A
// 使能中断(AINTC HIER)
0 k0 P+ f% x4 O* z5 J
IntIRQEnable();
% j. l1 ]& z: r% `1 g1 z$ A( z5 W
}
# C# o2 F. s1 `7 ~9 p+ c% s
4 G! v* s6 C9 y4 V* j1 F
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
L* [0 ]6 L( x: N
/* */
0 c" R1 O( ^6 t! o; y/ t" g
/* 中断服务函数 */
m. t# U" L7 M
/* */
% l7 @, X& }8 e& I. b4 M t
/****************************************************************************/
; j; x' R% P4 O* T2 z5 }
void PWMEventIsr(void)
5 y& [2 E/ U+ w0 R5 ^% r
{
) M1 ^' O! v; [' Q& N, J
IntSystemStatusClear(SYS_INT_EHRPWM1);
@/ g$ Q a: d+ l( a9 i
7 S' w+ c8 w, s; Q2 s
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
% n. h y$ `, g5 j1 Q4 v6 B
}
2 O+ ?2 v9 d& o9 c' s0 i: z
; n- A p6 x( J5 B
void PWMTZIsr(void)
& J- _7 ]' b( r
{
2 c6 c7 n% D. e$ I; G) Z
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
+ E# k) ^/ k4 Y6 D9 p9 F4 s, A
7 }+ f4 X" y( K3 j* M" l; T
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
, n5 l/ @# m% W3 q+ v5 O: y
}
7 ` J" y% p% {2 q2 z) M9 Q
) F1 A/ n, M+ t) k, t
/****************************************************************************/
+ N1 p) Q; ^; q9 `
/* */
1 G9 e! M4 q/ \/ O3 Z
/* 初始化捕获模块 */
* X: Y. C/ O) O2 E( H! X* b7 F8 W" h# Z$ z
/* */
& l) C' Y- H' A; H$ A4 t# m3 \. S% d
/****************************************************************************/
5 M4 ]3 c% i p) ?% W+ W# ~
void ECAPInit(void)
" E1 U) u; V3 A. d& [% _( c6 z+ [
{
4 {: ^6 K) u( p5 ?0 @
/*-----设置 ECCTL1-----*/
F- O. p; N: ~! I
// 使能CAP寄存器装载
6 j; k" k/ c) `
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
7 [+ z) @. f3 O3 s& d0 u
// 设置预分频值.
8 R3 t: d% L' U' Y& H7 Z
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
5 K% B/ w0 b/ B. a$ M
// 上升沿触发捕获事件
& h) a4 E- d8 O) c5 h- C
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
3 f# S: b, }0 R+ j
// 输入捕获后重新装载计数器值.
" g: w* C7 Y0 i5 [$ x8 ~
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
7 R" _# Y$ ], k g8 }4 N
0 Y0 T$ s& O* ^& q, S3 X+ f. C6 h
/*-----设置 ECCTL2-----*/
& H. T6 S: w: l8 C
// 连续模式
! A7 q6 F2 e/ P6 {3 }# n$ q
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
: s6 p+ F4 U; x1 L4 z& X! x" z
// ECAP计数器TSCTR持续计数
' p2 c4 @- w. w( Q
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
+ c% v9 ]4 N- @$ @( I( ?. ]/ q
// 禁用同步输出和同步输入
2 ], {4 ~3 x) N$ D8 j7 d
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
) Y# t" J' }3 k' B1 s. G
// 配置 ECAP 2 为 CAPTURE 模式
0 `9 B9 W9 B" l) q" y
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
/ v8 I B0 G4 u' z9 [/ N
C7 x5 m \* P7 Y9 z: N! j
// 使能中断
* ~% Y6 Z0 J" m9 }8 a* \
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
m4 J, h! m X* Z
}
* S1 Y7 @6 O$ w# `2 u
2 ^) M2 l% f* H O; M' c8 c* O d
/****************************************************************************/
M$ |" g, G4 E
/* */
! x3 p& I( M% r$ T& o6 R4 z
/* 取得捕获结果 */
! ^+ W" G' e0 x
/* */
) |' m! J1 ^/ B# O4 u
/****************************************************************************/
* s* m; D+ @; Y# I$ `% }/ t7 F8 p' X
unsigned int ECAPRead(void)
8 n4 p, e- A: @# l
{
/ a$ P/ w1 g" R/ f) y
unsigned int capvalue;
, D! @: v. i3 u+ q& `( m& ^
unsigned long frequency;
- t# \' X8 b' S" R
3 `1 L6 R1 n; F! G+ o1 e' q# p
// Event1 中断标志
# _& [7 H( m; D" E: d0 u- j/ \
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
8 Q. R& [, `" @ Y/ T
{
5 @: h. _$ S7 U) a+ V g
// 取得捕获计数
! \# K, O8 m- y# s1 b' v
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
- t n+ e6 y h- a# G- Z7 X
capvalue = ECAPResult.cap1;
" f+ Q4 U* U7 G; ]3 U1 m# j9 y2 I2 J8 y
0 ^# `( f% A1 M; A
// CAPTRUE 模块 228M 时钟主频
+ e- B s0 B2 j3 c$ W4 _: ?
frequency = 228000000/capvalue;
# S. f3 a/ ^, l: G; Q& \% N5 y
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
" n) z( G# a9 _/ {8 z+ a& T9 q6 }8 |
5 D1 m. G7 f, H) g) U* i9 G# @
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
" m5 D6 k: Y% B( |2 o$ Z' f) t; V
// IntEventClear(SYS_INT_ECAP2);
- v2 j; |0 H& R! b3 Y
}
, v' a5 v% s# `$ f- H* {
return frequency;
9 m: k' T5 ? B! W; i4 v
}
; ]; l$ ]+ l7 L: w
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
- o# _% }/ R+ v; O" {9 i
[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