嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
* k1 o# k9 j& U: d# z
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
" z+ T4 y! v$ r$ |: w
/* */
, \% U+ D6 U% H6 M9 \# D
/* 宏定义 */
0 a$ D. ]1 r6 U& ^: N* K% s5 t: Z8 I4 p6 d
/* */
7 Z6 k% r. e& |* }
/****************************************************************************/
f2 s, z e* v: h: c& T& f
// 软件断点
% z6 O) o, d9 G6 V! }! r, _; v
#define SW_BREAKPOINT asm(" SWBP 0 ");
, j$ h' N( n! @
% S. k1 ~- S6 t \
// 时钟分频
6 G: r2 E, ?8 p$ U5 H
#define CLOCK_DIV_VAL 228
9 x- }5 a6 B, p. i1 p% f! f
9 b7 t# N) U+ t) T2 {! W
/****************************************************************************/
! @0 s, ~# h0 x( v$ ^" Q+ G
/* */
' c' {# j, \$ f: ]
/* 全局变量 */
N" f7 a& X% U/ ~& N) t
/* */
* g$ `$ E" W i! ~/ W: S
/****************************************************************************/
# W2 C* m1 V8 \
ECAPCONTEXT ECAPResult;
. p+ _% B2 R9 Z
2 b- {. \7 x+ V
/****************************************************************************/
& N1 w9 x% Q6 n" W" ]& E0 _+ q- H
/* */
, k) H) g: ]5 o
/* 函数声明 */
1 g& h( L$ U1 a9 Z8 U9 F
/* */
! ?0 k) [$ E) O) R
/****************************************************************************/
8 l2 h5 k8 D0 J: _
// 外设使能配置
1 e+ W/ S& J2 k3 j. e& A' K. T
void PSCInit(void);
. H$ `% y3 ^7 M5 d* l: W
2 g" N- f' N% h) X5 N
// GPIO 管脚复用配置
; i0 }0 C6 R P
void GPIOBankPinMuxSet();
. S2 W" Q6 s- S- p4 d
* M. ]* M* c" P, o# p4 s
// 产生波形
z ]1 M2 E4 m& K
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
8 c# `1 \; G9 p% r& x
void ChopperWaveform(void);
" K. j5 N, w( r* o
7 w, H7 m N( y+ Q* J$ [6 G" ]$ z Y
// ECAP初始化和读函数
, K: ?$ u' C2 _6 Q
void ECAPInit(void);
' c7 U8 h% v( _/ Z8 i7 \( x3 k
unsigned int ECAPRead(void);
2 g) y+ K2 q# `1 k0 F3 D
1 A* ~4 v- z5 q
//ARM 中断初始化
$ c" _+ n$ q; W( x& A/ L8 K4 H
void InterruptInit(void);
5 p; v* Z" K8 O% C% G
# s% o+ i! S- L6 G) w. D
// PWM 中断初始化
' I$ @- B8 o/ g2 A/ t! ~" Y
void PWMInterruptInit(void);
& T' ^- @4 u- W, m u% K5 G
// 中断服务函数
, r; l _3 i) w9 M$ [$ ?' e
// PWM 事件
9 _' I. z. W" E3 _
void PWMEventIsr(void);
0 g d+ d7 Z! W' ]! w L f
// PWM 错误控制事件
, K/ u1 \8 ^9 p% c; m
void PWMTZIsr(void);
) A: M& f" G3 s H3 s2 x: P; I0 U
% H* E( K* M6 v, i: p
/****************************************************************************/
' b2 F& I0 ]% J) e M1 M- S
/* */
% y; y2 I" x: W5 s
/* 主函数 */
. v/ @& ?# g* @$ M& `) Q6 h
/* */
) Z, u k6 b7 x3 T' t4 P2 Q. l
/****************************************************************************/
% D. q1 V' u4 S/ B. j4 z ]5 J
int main(void)
4 N* q7 {8 Z6 [( Q9 ~3 t6 F
{
' C/ O5 h- S$ _4 G/ r
// 外设使能配置
; L, P* W- D1 _5 P, @
PSCInit();
& {# @: m( y2 `' `3 |2 u3 g# F
" i; X6 y/ }* Q. V5 Z) I. E. X3 f
// 初始化串口终端 使用串口2
4 M, I9 n% o0 A$ A7 L2 `& S
UARTStdioInit();
" m) n9 S3 ?, G* k
% w: x- q$ q8 }! _
// GPIO 管脚复用配置
2 u$ t" ~# Y1 P: _9 N
GPIOBankPinMuxSet();
: d5 @) j5 {; s
2 v5 E" S$ l! Q% C- x
// ARM 中断初始化
: g. a" `3 w. l4 g/ D- ?% A: `
InterruptInit();
1 d- a) r6 H1 h* @9 ~
7 {( E V& [ C- k
// PWM 中断初始化
, o: V8 e B `- d |
PWMInterruptInit();
2 l6 O# P4 q/ E+ h+ n# X
: k! A* H+ Y+ e7 \2 c
unsigned char i;
/ n- G3 `" {% c
unsigned int j;
6 S4 ]/ }) Z3 Y; |( \, }4 h
4 M" z: W G) k( o3 p9 {8 Y( _
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
+ ?4 \& ?! M9 `/ }4 N
UARTPuts("------------------------------------------------------------\r\n", -1);
4 h2 o: H5 j, u' b* Y
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
8 I p4 ?6 \, l
// 产生波形
: V! o3 x4 k/ q
PWM1ABasic(25000,50);
& T% T/ H# u! Y, W
( b% C& l; _% I8 b# U2 T- a |! I
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
: m0 q, @7 r* Q
UARTPuts("------------------------------------------------------------\r\n", -1);
% D1 M+ o N; \! u0 A7 q M1 W( Y
8 O) f6 G# n% T& Z* E7 N& @
* d s, P( ~; }) l6 w
_9 u2 P8 ]9 D% }; h& ]; x
UARTPuts("------------------------------------------------------------\r\n", -1);
, H; b8 Q q& H% m3 M$ V( H
UARTPuts(" C6748 ECAP Test\r\n", -1);
! B' t0 q' H t% n* J0 M
// ECAP 捕获初始化
+ a3 Z( y8 Q- D) V5 Z
ECAPInit();
' k. T6 A! C! Q
UARTPuts("Initialize ECAP.......\r\n",-1);
( x2 e$ b3 n3 Y4 ? k, \7 \# N0 N
for(i=0;i<5;i++)
+ l! ^5 n# p @4 i+ V& Q; g
{
* n. P% O/ [% @# q7 z& F; V
for(j=0x00FFFFFF;j>0;j--); // 延时
4 n, N7 t- E& k/ n6 T
ECAPRead();
4 H6 t' W s7 b9 {
}
5 [9 }5 {- a/ E2 d9 T' Q
UARTPuts("\r\n",-1);
0 h" ]# I- a2 `: W5 d1 o3 U7 B8 M
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
& K. \' q# v6 t% ?# R9 U
UARTPuts("------------------------------------------------------------\r\n", -1);
* Z+ |7 [9 Y3 d' ]
q% r' i4 @' k
// 主循环
1 P# R3 ?7 w! e$ k4 U+ f+ d1 x
for(;;)
% C. z. ^) J6 N a0 w
{
3 D. [& H+ Y, H! o; z* A# L! P* ]3 J% {
) r z8 H' x: T6 j2 `$ k" U2 J8 A
}
7 T+ a3 Q7 ^+ u
}
. z/ x- L4 `$ A; J0 b" Y
1 A6 s: h! y7 {6 H- J9 V$ C
/****************************************************************************/
3 m4 l d: _3 l; M! W3 S2 Z
/* */
7 C& T5 [9 Z+ n; |# C+ S" P
/* PSC 初始化 */
, c; b+ P- h* l P& x4 p) b
/* */
$ N$ Y! a# G1 k: v
/****************************************************************************/
( w* A$ f5 l/ l7 w
void PSCInit(void)
$ ?! X% G4 c" Y; C9 K
{
1 |4 A. D% H3 M: u# e
// 使能 EHRPWM 和 ECAP 模块
9 U! ?& Z' V. ?4 I( C
// 对相应外设模块的使能也可以在 BootLoader 中完成
- x8 Q; k. p Y! D4 [
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
6 H& L4 [+ i. n/ Z! P- h: o
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
' c$ v- E, K* J5 S" \& a
}
2 ^% L- o6 r* [& \3 j
' G( v, H' `, ~/ ]& ]
/****************************************************************************/
) a" @- p& L. ?9 K/ V% L; f
/* */
" w! U' _! r( H! l* C: I+ V
/* GPIO 管脚复用配置 */
& e* n( d; r3 \% k2 ]% H
/* */
. @5 s0 D7 \8 u% C( w$ k
/****************************************************************************/
; f Q" ^( q+ p( e8 _ Y
void GPIOBankPinMuxSet(void)
2 o# k, q r* C, B5 r3 g# L9 h" m
{
; v( b+ m; ^. a( ^( j2 L
EHRPWM1PinMuxSetup();
' J1 l2 R9 S7 [( ^6 n* v
8 [/ `& ]) }5 j, {0 ^$ }3 b7 M7 ?
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
$ ^8 C0 a% Q, ]8 d$ g, W5 n7 q
// 作为捕获功能时管脚方向为输入
: p3 r! b" ?0 Z# l8 V2 s0 m
// 作为辅助脉宽调制时管脚方向为输出
2 P+ w: F- r& @! Z2 [% o4 F
// ECAP2 / APWM2
* W1 L) ~& r H$ Q2 O
ECAPPinMuxSetup(2);
$ D ]3 N* R# M0 Y
% B3 W. P( S. {" g2 c4 a' S
// ECAP2 / APWM2方向设置为输入
. s+ G' s# i! y. V3 Y8 J# s' O
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
X/ o# ]$ g: [0 ?& {
}
, y4 r0 H( u; o* \$ N" ~2 e& G g7 z
4 y4 E: q8 e! I7 l2 {. {
/****************************************************************************/
5 D) i9 b" V% M% j% M! S% W
/* */
4 H3 {8 M) o; u. p! K, z! Y
/* PWM 输出波形 */
: T' O) s/ U8 Y: U \
/* */
# o# }' Q3 R# [% ^" r
/****************************************************************************/
& ~8 Q1 W% @) L+ P0 M# h
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
$ I& C- Y) u9 j+ t/ S+ r# }- b+ v* @
{
/ ^% X* y, m; F
// 时间基准配置
- @) X0 z V: B2 Y% m' e1 r$ V: [
// 时钟配置
8 M8 E$ E4 @1 Y$ \( M
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
6 l6 ?: C, H& ?/ m! V7 f: C5 v
* |/ z0 M5 V9 g/ ?- S
// 配置周期
/ D" o! I5 [. ]: Q: h
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
# e, f6 Z* Z7 g0 S0 i4 W" J& \
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
2 H% [. e7 S& ?) k+ v6 D
8 @5 Q3 t& W* b9 m8 R( F4 m6 Q
// 禁用输入同步信号
& f) v4 v& H- T9 o8 C3 W0 B. P
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
9 n4 P, L2 @2 n$ _
( Z( L0 `6 d" [% x
// 禁用输出同步信号
6 o' I" s1 w/ g+ H. j4 s5 u5 S
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
9 s; t* F# D! D1 w- C# ]+ U0 j4 w
5 z# S- Z5 v! B+ p, t6 c5 I
// 仿真(DEBUG)模式行为配置
' N7 Z; V7 B( L$ ?* c
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
; x6 W. E* _+ P- }
$ h+ g# [* p+ ^1 V% N
// 配置计数比较器子模块
8 t2 b5 i( p. r- I" j1 B& i
// 加载比较器 A 值
" b- K6 v! S. E9 i5 q/ q! ]& t: N
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
5 Q$ X. o: `* Z, t
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
: q2 H* w. `5 p3 t
2 s- \1 `# m" x4 \
// 加载比较器 B 值
: ^& I/ x: t0 @' }1 E5 Q
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
/ ~1 N9 w- E2 y
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
' P8 |( A( l9 p# V2 t
2 y! Y `* t7 L6 X, a
// 功能限定配置(输出引脚触发方式设定)
3 M) b+ W- c, |' H; I) {
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
" f. f) m2 `2 e3 a6 a7 D
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
3 P( K4 d% ~3 b
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
3 `1 {9 o, ^3 n
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
& p, {0 _1 v C; N, ~. }
5 B/ r3 q* h! i" ^/ g
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
- E0 y& i5 j; \$ _
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
/ d9 P7 l. J& A9 B2 F D6 w" g
( s# X, B" K2 u* I/ w! E' s
// 禁用斩波子模块
3 B) I1 B# h" D
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
7 J: v7 X& I5 V5 f4 T2 @, C4 K
, E5 ~% f1 v( B/ i' }
// 禁用错误控制事件
3 b; r. w+ {6 t( Q
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
6 T# ~- Z* q; E
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
8 ^# \+ s& U O6 }
% L$ R% h) u: l( `; p& W
// 事件触发配置
Y9 t/ F- @$ I' ]
// 每三次事件发生产生中断
! E# H$ O i+ |
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
' v3 \7 S7 Y" ~" X
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
% i9 ~! h! }7 ^0 }9 M; R
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
$ f5 v% `2 M- p+ t+ D
// 使能中断
' s+ @8 t& x( | x2 g0 v8 Y$ {& b0 j
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
- ^6 O6 X! n; q# D' L5 H0 @
! ]' P! r/ z/ S6 t9 I+ B% t& g6 X5 ?5 N
// 禁用高精度子模块
# E o/ X- B; |! ~3 z
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
1 G: w0 N* N8 F6 T
, q1 T! P; G$ b8 v
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
" T0 u d4 m3 x ? K$ F
}
: H$ a5 g, y( h# K/ g7 N5 g
$ T3 T) b, ^: _' J3 E' e2 I6 ~9 q
void ChopperWaveform(void)
1 x7 E( O u8 U0 ]6 y0 @
{
5 \8 {4 e# z0 U2 O9 x9 Z* K
// 50% 占空比
5 X( x# Q& b4 Z+ X. D: G
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
2 h( ^: G, c: S6 p
// 4 分频
8 D# L& V0 y8 d8 D( h- u
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
" L( j! s. a( G9 `
// 单个脉冲宽度
+ c' b, F% `8 l3 H1 I+ k4 Y0 [
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
0 l* H0 v8 P2 [/ A& f2 a& F
// 使能斩波子模块
& q" i: }4 M: Q k' t( c; Y9 ^1 Q7 S: q
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
1 Y" r" } K6 P0 ^' K
}
7 b) F0 v& K: I+ [8 e6 o; f
! }# w5 U& x- V7 o( ~) p7 `
/****************************************************************************/
" w6 U7 J& M M! L/ [7 n
/* */
3 x; l& u% O0 X% l9 {5 _- m6 O
/* PWM 中断初始化 */
+ ?1 T" X6 t/ ` S# a, M9 J- x
/* */
! q0 y, n- v& P) G+ m
/****************************************************************************/
8 F7 j2 V; r6 _0 L
void PWMInterruptInit(void)
5 A# `4 |) b6 V2 }: Y2 ^
{
3 _: v5 Z4 Z8 r- o T/ a' g
// 注册中断服务函数
( Q: P. h8 m4 k0 o
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
, Y+ L ]6 r# s1 v: L. L ~: H$ g
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
% t7 {# M) \4 K) @8 ]& a2 S P
4 U2 P/ ]& n4 }: ^/ r! x6 S. t0 k3 ]
// 映射中断
4 F# @% t1 ?% _& s r2 Y+ W" v
IntChannelSet(SYS_INT_EHRPWM1, 2);
' i' A6 |7 {5 I- ^
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
) F' p9 O" N1 M9 v- m- @2 Y& J
0 T+ `$ b6 }8 O* I
// 使能中断
) q0 z( V H, A0 \
IntSystemEnable(SYS_INT_EHRPWM1);
3 R7 M1 A6 v" P* t& w
IntSystemEnable(SYS_INT_EHRPWM1TZ);
' t0 g: m; y) d, |0 o
}
" k; I$ t" s+ ^1 b. G$ e# I
' {% j" @( K8 _* c
/****************************************************************************/
, y4 T( q( }7 E& G# {; l
/* */
# z9 E, c- t$ K# s) v, A1 _
/* ARM 中断初始化 */
; c/ q7 _3 j: T' Q. n$ l
/* */
' b# P+ Z* `+ @ g2 U }, f
/****************************************************************************/
( b7 S8 p, B# @' i8 l$ M9 i, n
void InterruptInit(void)
: G% ?& t! K8 V) W4 O( k7 T
{
* G( p, k9 d u8 x( Y( F3 [
// 初始化 ARM 中断控制器
! l; X) c1 ^3 }9 v
IntAINTCInit();
( d% b) B) O3 R7 Y5 T6 h( \, z2 Q s3 ?
/ ?1 e# D/ W# z
// 使能 IRQ(CPSR)
: g+ t* p; t! E
IntMasterIRQEnable();
6 c9 W3 ] ?4 | S# D; Y
; B7 }( m: b' J' I) I+ k
// 使能中断(AINTC GER)
1 K# e+ `/ v6 K% `
IntGlobalEnable();
" a6 K" n! k. n/ w7 x
' \/ z; @8 U5 s3 Q" m* r( v
// 使能中断(AINTC HIER)
0 V, R2 E8 {" `6 w6 f/ }
IntIRQEnable();
: y3 ?) i! Z5 F3 f9 h1 D1 Z+ _
}
& h& s) o/ S7 G* W' x& L
/ U: Y3 s$ }0 B) K, \9 W
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
. }: ]$ K% ?6 v# D8 g
/* */
3 O' X' m- }+ Y( y# `8 x
/* 中断服务函数 */
) V4 M0 A" V% N1 |, N) @9 n
/* */
% `8 K) J# U* I& i3 \3 a3 E x! }
/****************************************************************************/
# J6 s* _9 z) a* i+ H) J$ Z
void PWMEventIsr(void)
! [, K Q% s- } n# E$ q0 G
{
Q0 U/ i6 q0 q
IntSystemStatusClear(SYS_INT_EHRPWM1);
) S5 p0 C4 Z0 u( J3 m
/ C" E& D! |' Y1 H+ {
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
7 L: a1 z! V& r
}
7 E6 K H; g% d
8 `( P, [" Y1 A0 {
void PWMTZIsr(void)
x; }9 @1 k7 O/ o" b# ^
{
# q; G1 E d& K6 |
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
5 K& d- k2 d" n8 S
; x- V T$ R( G. b6 ^: @* y& Q
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
9 _3 |! o. k1 [1 l
}
# ], D* i/ b/ q* Q- o
( I& v0 `2 ^! F: e/ p6 a1 B3 ]+ X/ Y
/****************************************************************************/
6 c4 a* _; s. ~0 }
/* */
' I+ e4 i& E3 d/ s6 R6 O" z
/* 初始化捕获模块 */
! W/ f W% o9 z/ _, D
/* */
) g: ~3 @% I& h9 y3 s) \( i; i& i Z
/****************************************************************************/
' v2 H: c6 p; {# o
void ECAPInit(void)
2 G8 t2 l$ F* @
{
2 O% t9 U% y& O+ @9 j
/*-----设置 ECCTL1-----*/
/ |6 C' D3 W; K& Q! O+ w$ w
// 使能CAP寄存器装载
+ c6 K9 _; S! W3 [# u
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
1 g+ t2 S% }1 g% e4 }
// 设置预分频值.
2 c# Y: E* ]9 d" v- s1 ~% Q
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
+ P, _5 n8 }; l! r& C
// 上升沿触发捕获事件
* R+ A( X2 |0 W6 z+ [ n" |
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
! I7 m3 C9 n2 {& A. z* ~
// 输入捕获后重新装载计数器值.
; ~7 T; d, Y9 t5 x2 [/ h
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
/ r6 Q1 }$ E9 B
2 P8 w+ V: p8 A4 ~ f) `
/*-----设置 ECCTL2-----*/
* G0 v' q1 a: I/ R/ m' j% t
// 连续模式
6 l& h( S, r( [0 N. w7 }4 y P
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
x* B E% x8 `, }6 T
// ECAP计数器TSCTR持续计数
$ V7 |6 U7 E- V) g' x, f
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
: _( e' n J6 R* m& [9 s0 J
// 禁用同步输出和同步输入
( P4 J: a, Q0 f# u; l
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
5 U* v% k2 B8 N4 N9 a1 V+ [& |
// 配置 ECAP 2 为 CAPTURE 模式
5 N$ q" D& `% s
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
/ G9 A: H9 ~8 V$ ~ d# k( \& P. B
0 `, F4 F A! S, x
// 使能中断
& q2 q. i# [3 v; e1 F) X8 F
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
) T9 S6 m E: D; e' q' s
}
& @2 D* `9 v. S: V3 f
8 o* A6 S& \) q' |( k
/****************************************************************************/
* q$ A0 p- y) ^7 L
/* */
+ a% d* q; `! Y* P) S/ f8 Y5 ~- l
/* 取得捕获结果 */
$ F% m5 a* t1 V! M7 O6 h
/* */
* q* C6 G/ ^' V ?5 g$ p+ ?
/****************************************************************************/
) w" I5 B+ f; T) G: o# D! I
unsigned int ECAPRead(void)
& V6 r% N8 A* X
{
9 w( N! w1 \- d3 U, |; r& S
unsigned int capvalue;
- z6 ~8 N' F5 p7 U
unsigned long frequency;
6 t0 o! @5 a7 [& Q! }# ]: \% B
$ _% e( @7 l5 k5 o3 Z* ]
// Event1 中断标志
% Z4 Z! Y; _5 v. b
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
( ~, y1 h' c* q) y* R7 {# j
{
2 |5 ^6 D( s# R' K# ~* M: f/ ^
// 取得捕获计数
& V# h$ M3 d, a* K+ Y+ Z0 c3 r
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
4 `1 T/ ]+ {% b/ D
capvalue = ECAPResult.cap1;
: o& T" ^/ k/ R7 M [5 t! l
2 {5 E- j1 V! r& i4 F) h
// CAPTRUE 模块 228M 时钟主频
) V& j. F4 N" G9 P. p% h
frequency = 228000000/capvalue;
& y9 B/ g; y0 U
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
6 n( Y s4 x: V! R# L. w% Q
_' f& |- h/ a4 ~6 b9 O
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
! R2 d1 L( m4 {$ C! ~) y; S* j: ?; F( m
// IntEventClear(SYS_INT_ECAP2);
+ b( d, P6 c: W: d A6 o
}
. D& q; ^2 A5 W5 l- ^# \' D5 W& a
return frequency;
# [. ]: ]$ E0 Z: D6 @* P$ Q
}
( U9 A O% G) U! R/ U5 |9 R
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
" s ]* m5 {0 d0 x! J, d' |
[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