嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
9 F. s) }0 y2 f- b
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
; |+ u! X* e" s; j' h1 D
/* */
7 S. t& H+ N4 m' w' D
/* 宏定义 */
: k5 \& ]5 f6 m
/* */
! V9 F9 ~, F% n/ T* T: X4 M1 i
/****************************************************************************/
$ g. U# N( q" }7 }5 t
// 软件断点
3 M- E2 u- ~9 H9 ]) a- e/ \9 q4 ]
#define SW_BREAKPOINT asm(" SWBP 0 ");
0 Z5 k E; }7 r! ^% | }
8 D2 \7 W" X! I, u3 Z$ g2 ]
// 时钟分频
3 ]6 j& n5 K" R8 l* [) k: T- F
#define CLOCK_DIV_VAL 228
6 u7 d& J% ?. F# `1 o3 _
Y* f9 h) P- [+ d( y
/****************************************************************************/
9 P) r4 \+ l+ X# p& g; Y
/* */
( l$ j+ O" b% k! r
/* 全局变量 */
4 W' ]! h% S3 }; Q9 N( t4 A2 `
/* */
5 b$ o7 F4 w1 H! T
/****************************************************************************/
/ C% X% k3 y. q3 i7 b! {' A1 E( ]
ECAPCONTEXT ECAPResult;
4 F2 L* [: T4 G" [
# f* i4 I- U) q. I2 z0 W4 k
/****************************************************************************/
# V7 Q3 r! m6 B/ ^; e2 o# d
/* */
! j0 N0 w9 t1 W, L( {2 Z# h# T
/* 函数声明 */
. t8 L+ m4 A5 o* Z1 i3 A
/* */
; |2 w/ g0 o g2 b( X. J; |- n
/****************************************************************************/
5 s1 M( Q5 k, T8 b4 @5 |) ~& s& y
// 外设使能配置
3 U& `+ g [2 d3 R5 h. D4 R
void PSCInit(void);
3 _1 {( \# K/ [
: o9 q1 l0 t% m$ a9 e6 u
// GPIO 管脚复用配置
: m7 J/ A& @& G% _2 q# V
void GPIOBankPinMuxSet();
" c+ z6 H& T9 v t0 U
" ?) S* W* Q8 R
// 产生波形
& [7 ]: @5 g) U! E0 U( [
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
8 }. M. S+ f7 L( L
void ChopperWaveform(void);
7 F. }$ s% L& [3 T
7 \( j) p0 H0 V# G1 R
// ECAP初始化和读函数
. ^$ m% o+ R8 J- x
void ECAPInit(void);
6 @- t Q! e( X" j/ y3 l
unsigned int ECAPRead(void);
% d$ x& e- w) o0 l
, f' ?* A N, U
//ARM 中断初始化
+ s) f- g; P7 P/ u5 ^: A* j. f
void InterruptInit(void);
1 C9 G( ]* Q/ d" H5 M8 x9 R
6 L) I/ }* k P
// PWM 中断初始化
# U6 d; M. z* s6 `. `) L' T
void PWMInterruptInit(void);
, j% s0 W x @: e& D( d
// 中断服务函数
' ^, r8 V; G% i3 l7 l1 V/ W9 l
// PWM 事件
! F' ?$ G0 l7 Z7 o
void PWMEventIsr(void);
/ o0 {; e e8 B1 C) ^/ |; S G
// PWM 错误控制事件
' t6 l* s. |2 ~) a" g4 i4 ?: w
void PWMTZIsr(void);
. U* r0 N% a7 R [
& p( k2 H' \% d, s! f8 W) R8 u
/****************************************************************************/
0 z9 u5 d8 _# V: {1 [9 K
/* */
3 O+ Z& Y! {6 e; {! e7 C& n# v
/* 主函数 */
9 P* o/ c% M' i0 n5 u" E
/* */
7 |. W. f5 o: Q. g- k, s9 X$ @
/****************************************************************************/
2 ^/ r& z0 s9 p: M3 d
int main(void)
- f7 ]0 u, _0 N e. T7 g
{
], a/ V; z) F1 S5 w/ e- R
// 外设使能配置
5 Y! a% D; d% `! |+ T
PSCInit();
' K6 V" m' R' w& [ \$ b
% O, v; M8 @. _: I0 {& m1 T) P
// 初始化串口终端 使用串口2
. j; W( _9 ^3 h& Y) @
UARTStdioInit();
7 M6 q, E" I- V* C s6 g
4 D$ R3 T" i2 l% C& k% B9 U$ O
// GPIO 管脚复用配置
( g) f. I6 S' S! A
GPIOBankPinMuxSet();
5 |9 _; n) h4 C" t% Q
1 J7 o- J0 g3 u" S# L7 ~2 c7 B- W
// ARM 中断初始化
5 e( A: [" O# j& V
InterruptInit();
0 f' v0 T7 T) \: m( D
% O G) u* b1 ]: H
// PWM 中断初始化
/ |- A% w; |8 _' K/ ]- Z1 x
PWMInterruptInit();
V* m& Z( l, f6 w) y% }, Q9 P
3 n% A# p; r, r+ l
unsigned char i;
% Y: _) c$ ]' \ z+ m- M$ q
unsigned int j;
- h2 c& v4 Q' ?* V6 j# }
) S- [5 y1 O5 B: n% F* B
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
9 J- {# k- V) W% Y/ x4 a
UARTPuts("------------------------------------------------------------\r\n", -1);
9 u5 P& W. C) Z7 u& s- X
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
9 b4 `8 H! n1 r" V% v9 x1 `
// 产生波形
X6 I1 J% d- G) z3 n# M& B# X9 u& \$ I
PWM1ABasic(25000,50);
$ R) Y" ] a0 V2 C2 v: ~$ z
$ g7 |: P! M0 }) B" u$ t: z: X
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
, ^& Z, X9 y5 l5 O# c6 K( ~
UARTPuts("------------------------------------------------------------\r\n", -1);
. g$ n# [$ z# j* r$ ~
! T+ i. q2 L+ e% v1 ?( q
k5 @- W1 h6 D7 I; m. h" @$ Q
# L9 Q; W3 z r3 \& C: r
UARTPuts("------------------------------------------------------------\r\n", -1);
8 ]) _; ~- ^" `/ O! h
UARTPuts(" C6748 ECAP Test\r\n", -1);
0 }0 ]% O6 o1 W% V6 O
// ECAP 捕获初始化
$ P3 W! V: x* p7 o: N$ ?+ k
ECAPInit();
- W) @2 X* Y& H8 ?+ b! v
UARTPuts("Initialize ECAP.......\r\n",-1);
9 \9 E! T3 ?6 G8 w+ d
for(i=0;i<5;i++)
6 c/ u: \& p0 h
{
# g. z; C0 T. S- M) k$ o/ s
for(j=0x00FFFFFF;j>0;j--); // 延时
; l( P- g) v) x b& w5 ]/ V" J
ECAPRead();
5 @$ w8 b' c1 O) D1 V1 w
}
/ m: [ O8 k8 m' u. o% }
UARTPuts("\r\n",-1);
, x* a' U# @& d5 v/ P) `* }/ q
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
6 ] S$ `: v d7 x8 b8 ^
UARTPuts("------------------------------------------------------------\r\n", -1);
* B0 W9 A! m7 `$ O4 H
' l$ e' N8 u& k a' p6 a7 F' t, ?
// 主循环
# B( o& b5 Q. h2 n( j% P, r
for(;;)
% c! X7 L) u0 j3 N
{
* y/ p3 _7 y: h4 G
5 ] a, U" H8 I, R7 H& V9 L
}
, r* @/ w# O8 @5 p) @
}
/ |6 m: X; i9 ?6 ?8 V
2 d7 q) Z4 H/ W
/****************************************************************************/
5 I4 r: i* T) r3 U' \% c% Z' F
/* */
3 K( A4 T6 k7 \) O- Q6 l$ t) e) F
/* PSC 初始化 */
+ k1 a0 |) d) h
/* */
( F* k6 u2 v( D- ]/ O' o
/****************************************************************************/
a' w @5 b& J, I: t
void PSCInit(void)
7 `9 C* L2 W5 H
{
; |) u! q$ k, k7 F; c3 u/ u
// 使能 EHRPWM 和 ECAP 模块
/ V6 E! Z2 G% k& s" F
// 对相应外设模块的使能也可以在 BootLoader 中完成
% A, B" d W; c; F) g, q- e; T
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
. b0 ?0 z3 n, C5 u$ @
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
5 ?% a% S I; C8 ]1 f
}
% L' d' U5 o. A2 n1 p0 B _
3 R* J1 \: e. h
/****************************************************************************/
" N8 o' A' r {+ _3 ~
/* */
0 \" `7 T! _2 e7 [
/* GPIO 管脚复用配置 */
8 J7 F. b- c5 d; N' M& o
/* */
5 T' O+ ?- E3 T
/****************************************************************************/
2 j- F5 g+ A& N; F* @* t _
void GPIOBankPinMuxSet(void)
o; M. i) r0 R0 X+ ?& v
{
' f" i U. R& y
EHRPWM1PinMuxSetup();
0 C" B7 Q. k6 c( F6 `6 I
+ s. o3 ]; k8 n2 g( z8 h
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
: r. E0 j( B) ?' g; _9 V& ~
// 作为捕获功能时管脚方向为输入
# f7 D6 I7 ^1 P/ S; L0 z$ u- C
// 作为辅助脉宽调制时管脚方向为输出
$ z% K- m$ r7 l: \% D) J( M m+ S
// ECAP2 / APWM2
$ n; k- [1 |* |1 {
ECAPPinMuxSetup(2);
% S8 c/ B0 j* w/ I. J+ i
+ f( K+ S& f# g! a; K8 A; M* D- x1 C
// ECAP2 / APWM2方向设置为输入
" G. P& W) m& q; F
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
3 c4 \) d8 Y% q. G1 B$ F: H0 }8 r
}
( H0 Z5 h' @. t. y1 q& t
' s, P+ t _% V' k+ S
/****************************************************************************/
0 r3 _6 V8 Y* b* H
/* */
; c5 q: A; Z1 S5 i" x$ |4 G
/* PWM 输出波形 */
1 W+ n9 A' l0 a+ g" h
/* */
5 A4 u+ a& \! l+ Z
/****************************************************************************/
1 o6 `0 L3 W0 }1 z; ]4 Z! _
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
* Z& d2 \" k8 e; _4 [. v1 R& y
{
* I" r. |. q9 B4 V) |
// 时间基准配置
* |! f; @! K* z4 ?/ Q+ v' I, c
// 时钟配置
( H& P6 E4 {1 {5 d$ p7 S
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
$ W7 ]: d2 A; `, D" `5 i7 m, a' E
, N$ e. E3 }( {0 ?! g" K& s1 V. ]) e
// 配置周期
% d* `3 N/ n6 z" e
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
6 @; H) @7 i8 v: g! q" N
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
- L4 c; W) c6 J! F; B9 G
# g+ p' j1 g2 o* ^5 ] W+ V
// 禁用输入同步信号
$ o* T# R" m! Q& m6 _( B7 I
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
# m B, T1 Q4 n* P; B% V* }
2 _4 Z8 K0 I1 Y% P$ p/ Y2 n
// 禁用输出同步信号
]" N/ Q& J' Y
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
# V1 E+ o% I" _+ N
+ I' } n: l; X" D
// 仿真(DEBUG)模式行为配置
& m' U% {( a. z+ r; W4 J8 a
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
2 t3 S+ L, P Y6 P( s4 B+ {
3 o# z% q, I |, ^
// 配置计数比较器子模块
/ _1 z6 e: a2 b
// 加载比较器 A 值
* ]# Q% O' X# }( [' H
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
0 I+ R I: d; s9 E
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
$ i- g$ L2 D8 b- F9 L4 {
! }2 p( p4 h+ w/ Y. L1 k. h
// 加载比较器 B 值
( b5 N) ?9 u0 S/ m( J
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
! V! F+ d( x" o! y
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
h; v8 i. o# w+ x( N5 T3 r. |
( a: F8 B) I9 }; @) Y4 x m
// 功能限定配置(输出引脚触发方式设定)
6 `* L/ }; O; a' h
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
; `; s2 y: ]! U$ O9 _8 u! f+ P
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
1 w8 ]8 L+ T" m5 f% a& B/ V }6 \3 ^
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
5 \; k! N/ }; `8 @9 ^, f
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
& D1 s6 a/ i7 m7 R" Y1 r) j
9 w4 `* j5 f- ?/ _; x
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
% H {2 m# U- H; T, _
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
1 H& L1 u! ^# T% P1 E
- L9 N- ?( d: ?- @
// 禁用斩波子模块
0 W8 d( ~2 k) J9 @
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
/ [4 H3 ], B; H8 A. o
- ~( C5 Y7 R& q9 {: Y' I' Y
// 禁用错误控制事件
; |* t7 P+ o5 R
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
6 z( d, T |2 ?+ U) ^( @9 [
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
1 D4 N2 k$ c% Y1 S0 H, @3 O
* S/ B. d& A1 r2 M% g8 d: D
// 事件触发配置
: ?2 m. X9 w" p3 a" ?1 ]
// 每三次事件发生产生中断
^8 [+ l. q( K: K7 L+ U5 s
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
1 x- T3 Z% L+ Q
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
9 U- o% D8 L: P0 ]- I
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
+ r$ B2 A' r& z r
// 使能中断
& A4 M9 B$ N8 C! x' {
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
9 x. s* g2 x6 s
% `* k* n3 V8 y2 L7 y
// 禁用高精度子模块
+ a* ?2 {' I4 A1 ], ^0 ?' k7 W& S
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
" [% K' F3 B3 s8 t$ j- w
; b: n* {" a% F' ]- X
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
- q/ t: }# ?- s5 D6 n
}
! e5 J4 o, Q/ h4 V% k. }
2 O. O# _! q9 z4 ]! w
void ChopperWaveform(void)
1 |; O g* v3 s4 a; q
{
+ U* ]: I7 l/ b x$ J7 \% N5 I
// 50% 占空比
; P. G6 ?0 ~ X" a* J
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
6 {$ c/ ~3 c4 C
// 4 分频
f( _: ~( a+ j5 e4 u% t& _
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
- ~( l! s& N7 P
// 单个脉冲宽度
8 ~( }. g" Q& ^7 n
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
2 M- [5 j6 D% T% r& W1 Z
// 使能斩波子模块
9 f+ W% J# D5 T5 C3 m
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
: w! B0 H, B4 E1 l4 w* B3 f
}
5 {) P- v( `' x2 I) S
+ p/ n8 u* r9 q9 G
/****************************************************************************/
$ o% R: e' P& x( ]) y( c: C/ c
/* */
/ ]& k' h3 N' }4 g: X: y/ [5 b
/* PWM 中断初始化 */
1 t0 N; [2 @8 J% c5 X
/* */
0 y8 X7 s e5 E
/****************************************************************************/
! G+ @5 U8 R* ~* C
void PWMInterruptInit(void)
+ J( @9 f I, X( M$ L9 l/ e# m7 g
{
9 q0 G" ^# ~ M+ E0 {9 S4 }( o0 \, m8 ~+ [
// 注册中断服务函数
) U' Q0 w |: ?+ l. \
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
* V: N1 C2 e/ {% h4 ~4 V3 x3 ]9 n; @
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
5 g; f8 j4 _; b: f5 d" t+ v
9 B$ T- k0 r2 a4 n% c) N
// 映射中断
S4 w$ y, q8 L3 P% Y+ n
IntChannelSet(SYS_INT_EHRPWM1, 2);
8 I8 ]+ f, [9 K4 k& ~5 A. c
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
+ i( ~$ m- s' `3 U
, G% ^( w- C( Z8 s$ J
// 使能中断
, J9 A" f; m B! x! z
IntSystemEnable(SYS_INT_EHRPWM1);
y+ X4 c- E7 O. R) ?
IntSystemEnable(SYS_INT_EHRPWM1TZ);
7 B% V, t# R6 t/ i" H; u) q
}
1 b: e2 c, l( l* Y
6 T7 s9 P0 J9 N
/****************************************************************************/
/ N' ~& _+ Z. s- j
/* */
% L; E. \7 _' T) e/ j
/* ARM 中断初始化 */
4 _4 N( `, q( R6 T( E W. ?4 a
/* */
' _. w4 Q8 D& A1 x3 i# N" _
/****************************************************************************/
" {- b) V$ [0 n( F6 H6 l8 c9 _2 P7 f; G
void InterruptInit(void)
/ B! w- W2 _) G; Y2 y
{
4 p) d: B) `3 L, \8 Q Q
// 初始化 ARM 中断控制器
- @/ }& Z- U* s% V" g% h: X1 x
IntAINTCInit();
& ?; k8 ~7 M' I. i5 g5 i1 O3 Z m
1 q+ L$ d6 R* T& p
// 使能 IRQ(CPSR)
6 _3 b5 X; o, C& a: U- J1 [: M
IntMasterIRQEnable();
& _9 ~7 F1 \+ `/ M
4 V) {& l3 E A
// 使能中断(AINTC GER)
& h% k1 w4 B. u7 }/ A0 ]( Z
IntGlobalEnable();
7 c$ ?# z; g8 @" B
7 |# V' U; Q" n9 Q
// 使能中断(AINTC HIER)
" u' B5 B+ Q9 a: K5 ]" L
IntIRQEnable();
- ?( `. h; W* m
}
( F) o4 [: ]7 Y% \/ t8 Q1 ]* Y4 s
3 ]# Z$ q1 k8 o" e
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
/ ?$ `2 h/ q7 ^8 o$ `# h* W
/* */
4 S% o$ ~. b6 ]; j% ^" T. a/ R5 }
/* 中断服务函数 */
+ x& y R" k X. y8 b* @
/* */
, V! Q9 D- N' b- m ^, l
/****************************************************************************/
, F0 d0 N: q3 Q4 \; P; y: A7 g
void PWMEventIsr(void)
: h$ v# E Y" }
{
6 ~& O# ]0 [& K2 P* r
IntSystemStatusClear(SYS_INT_EHRPWM1);
m) r! v$ R) @6 @5 l' Q
7 y0 ?% K( \: `# L$ o
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
0 K9 D* \0 b; z9 E+ K% F
}
' J# Q9 ?) x/ ]: ^7 {2 \
4 ^8 D6 s& @$ Y3 F
void PWMTZIsr(void)
9 t2 c* A' I# m1 P, d7 S
{
- j/ w# B+ A9 V/ s: m# |
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
. {. l6 K$ w6 c0 M. E$ G
3 T1 F& @- o0 W
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
: V s5 E, b+ ]# ^* h, V/ Z
}
; @) C( p) F, ~
+ O: v) o3 W$ Q' b" I
/****************************************************************************/
e8 O$ I+ S+ N0 E2 {: ?% a% _ a( }
/* */
2 n: U, g$ S( g- y$ j! u6 }1 M+ t
/* 初始化捕获模块 */
5 F! ^1 m. X# o2 {- Y+ O# z, _
/* */
3 D0 U9 Z- a4 f3 p
/****************************************************************************/
) N8 G6 e1 f* D/ @2 ~% Y
void ECAPInit(void)
, s( y+ u" Q9 g [
{
- v8 l/ D4 X0 Y- z3 Q7 R
/*-----设置 ECCTL1-----*/
- C; M5 l) ]# i3 r8 J, t' Z3 m
// 使能CAP寄存器装载
5 z& x2 s- d, W1 H
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
3 j1 g, o1 d! H* H. A
// 设置预分频值.
( p8 q8 K- p8 |% d* w$ T
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
# z2 q- n9 }' i8 F# I4 H2 f
// 上升沿触发捕获事件
4 s" }7 D* m# V5 F& B6 {. G
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
# M/ O ]$ d4 ]( m
// 输入捕获后重新装载计数器值.
% | |5 e9 j6 P# y
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
% {0 d3 q( d7 }3 l( ]8 ~
3 c5 Q* i4 g4 T; b. S% n4 _! I W1 r" M
/*-----设置 ECCTL2-----*/
* `$ h: n2 ]* Q# } g$ Y# ~
// 连续模式
8 q* L6 \6 z+ y1 N
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
* Y/ E ^ T0 Y3 q4 z/ h" x
// ECAP计数器TSCTR持续计数
( s# h' A" k- C, K
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
( ^ s4 o' n) w8 ?+ Y( r
// 禁用同步输出和同步输入
- \8 y0 `' B4 r$ d- p" [9 s' L
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
* t! z0 x$ R3 f) A5 r/ T
// 配置 ECAP 2 为 CAPTURE 模式
: _4 H" j8 W: w- @# L
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
% s% f! T$ K9 ?% k- l& b8 p
" t) n6 i2 n5 m5 R5 v
// 使能中断
0 k7 k9 O+ ~7 P6 Z, [) d4 U5 a+ B# _
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
( a# l* Q: g5 o8 T
}
4 d& Q0 g( q" B
$ d3 U1 K! j+ R) i( H- w5 W# X
/****************************************************************************/
8 d) D8 [, k/ {& W8 Q" v
/* */
" b- h% B( Z! _* @4 z; r
/* 取得捕获结果 */
3 G) w* n. {# G
/* */
1 N; h, [$ W6 y
/****************************************************************************/
* ~: }5 s! }2 X$ f$ d
unsigned int ECAPRead(void)
7 V/ d. {, T6 y$ G0 w8 j6 B
{
) [# X0 i. d+ w4 D. s
unsigned int capvalue;
Z2 } `$ X1 P( y7 J+ h
unsigned long frequency;
8 k: g# w7 J$ H3 w" ^& ?8 q
- T/ [. v0 l8 @) _0 j6 | A
// Event1 中断标志
; R0 D1 u. m7 M- ?5 ~: I& ^
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
' B- M) `: c6 m/ Z
{
1 y9 H# _5 a4 C& i( q9 ~
// 取得捕获计数
O& `9 Y! s* F9 q" w
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
7 S; W0 s: s1 ]
capvalue = ECAPResult.cap1;
2 w* [7 A K: E: a
: g5 x6 Y& f5 Y7 D/ P+ [
// CAPTRUE 模块 228M 时钟主频
% {' ~/ N' G2 |9 }! @2 A
frequency = 228000000/capvalue;
7 S; D: Z7 i a7 F6 R3 U* k. z4 A
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
7 G1 O4 f( G w% J% m" }
$ N8 J8 t N p: ^2 ^; N5 R, `4 i
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
4 I7 w: g7 h. e5 n7 r' g
// IntEventClear(SYS_INT_ECAP2);
' }6 A; A- U6 p4 d( }/ V
}
8 J6 G. J9 W" b
return frequency;
/ f. u) w; S' C4 f
}
0 @# I9 L: _ D- x4 k! A1 d
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
+ R$ x% f8 `0 v( Y3 B; E$ k" t
[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