标题: 请问一下怎么产生PWM波 [打印本页] 作者: 浙江第一帅 时间: 2018-10-30 16:46 标题: 请问一下怎么产生PWM波 请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家: K8 n# u) f6 y& i 作者: 浙江第一帅 时间: 2018-10-30 17:00
/****************************************************************************/ * Q! o: w6 F' u2 h$ X+ u/* */ ' a+ D, L% T1 o/* 宏定义 */ - q: j# w+ G! J/* */- }) O2 ~% g. n' B, G }% R* A( U
/****************************************************************************/ $ R" C0 t* \/ [9 i/ ~( W$ x// 软件断点6 T. p, K% u n+ w/ ?) a9 P, t
#define SW_BREAKPOINT asm(" SWBP 0 "); # C5 J" A) p7 t: Z( b6 l ; K$ T: z, i, X8 a- M' Y' L: U4 u// 时钟分频" s- V8 B! j9 y) L# j( y: N
#define CLOCK_DIV_VAL 228 " Q- |" |" E2 j9 t# j' ]( @3 B% {. u) r2 e; ^
/****************************************************************************// A# J% I# K1 V) F }6 o4 p
/* */) y- | k9 @2 n$ b6 d
/* 全局变量 */ 2 b$ N* u4 d4 z% V' z* Q! X2 R% R0 J/* */ 0 K' n; Y" c, n$ u( O/****************************************************************************/ 2 P5 M( M1 ~) _4 }, iECAPCONTEXT ECAPResult; , s& b4 |8 P& e* y, S& h5 ]$ U& G: w8 @+ ~) P; d# q
/****************************************************************************/ - v+ Q+ o3 j7 j9 D/* */ 8 I5 Q( t) A" j {( ^/ q# [; |7 s/* 函数声明 */, K6 ]# o: F! F( d( ] {) t; ?/ J' P, x
/* */; r+ _: L; Z8 x6 g
/****************************************************************************/ . i. V* M d% ?5 Q4 D) f; d// 外设使能配置 8 G& W. J' Y9 t5 u9 d; Qvoid PSCInit(void);! l+ k& g2 C* v% v
( M' {, G- N' {% p g6 M, a# S6 j0 N
// GPIO 管脚复用配置 5 K x9 L9 D" j9 b' `+ kvoid GPIOBankPinMuxSet();+ ~1 @; E! Q0 G* X$ @( C
# A+ N3 A; V$ R8 `- u
// 产生波形! q# f o8 {: |9 @% U. s+ V& r
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio); # y+ f8 X: |- i" k D. q, B0 u; lvoid ChopperWaveform(void); / `, \6 p1 w4 o5 F; X/ h' d7 S$ L; g& Y4 X
// ECAP初始化和读函数 ; h4 q3 C' D0 Mvoid ECAPInit(void);% N' m( b5 ^& g2 E- ?8 Q5 m5 t
unsigned int ECAPRead(void); ! Y9 Y( y" f9 a+ e* O9 ~ 3 {5 v( e$ ?, Z//ARM 中断初始化 ) f+ J+ h. e4 A) Z3 Dvoid InterruptInit(void); 4 F( G c5 h5 F, G, _' T4 o) J9 v1 b
// PWM 中断初始化' l/ R3 S6 v' C3 w
void PWMInterruptInit(void);1 O8 m& q2 K( D9 Y+ _9 M
// 中断服务函数 L1 {7 p# M& t! v2 D& _// PWM 事件5 x; g$ D7 Q- a) k# `1 G. }* }
void PWMEventIsr(void); % Q. Z6 m1 R% _! S V y// PWM 错误控制事件 5 k2 l% m) L1 M3 T1 s7 h& q& ]void PWMTZIsr(void);% }! A0 k. P- ?7 f4 c- [
6 f5 O& V1 l, m) [/****************************************************************************/ 8 a1 l- X; i* G' [2 `0 b/* */ 7 a3 U5 _" S+ q( v1 G/ c/* 主函数 */+ b8 x0 _! L& }* P! N+ x( m
/* */' I. M! F+ @4 b0 O0 S
/****************************************************************************/1 @, e" ], b. E U0 h+ [' I
int main(void)+ a2 o" R% y# m3 |
{3 u* _' U# I6 a) e! m( ] A
// 外设使能配置 % ^2 d9 J- H$ k( h3 y PSCInit();+ w& {0 D! u- L! B* |
7 m/ F* E/ b) B D // 初始化串口终端 使用串口2 $ P# i# A/ u1 o2 I0 R UARTStdioInit(); 5 o. \ M& c' W( V5 }/ ? 3 E; e7 ~7 a" k
// GPIO 管脚复用配置 0 M4 e6 p6 @+ g GPIOBankPinMuxSet(); ) ~5 r( Z. x2 s0 O % G4 q4 Q3 t! K5 x, G$ Q // ARM 中断初始化 . X' i4 D! _; o/ X3 t; B InterruptInit(); 8 C6 {0 p; C7 M! o9 J, g" @7 ?! P o% [3 d& R
// PWM 中断初始化( k' Z% b7 R5 S5 h; j
PWMInterruptInit();' j0 o4 Y) d& y: n0 q/ \
& k& d3 E2 l4 p# Z; |4 e
unsigned char i; 9 ^- e1 D _/ c5 P5 y ]; q. O0 D unsigned int j; 1 U" N. w, w) c! Y & J% l$ [! ]3 R/ E# j* T/ g% v UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);6 z2 n6 k7 h/ m9 W% C; ~
UARTPuts("------------------------------------------------------------\r\n", -1); ; R, ~ v! W% O. T7 a UARTPuts(" C6748 PWM Test\r\n\r\n", -1);% k3 R. ^! f# c' t% s' {( \
// 产生波形4 {' p3 Q$ o! ~- ]' @) @+ V
PWM1ABasic(25000,50);* Z2 ?* A! c9 J
1 F4 R' ?, x3 z, {+ `! u UARTPuts(" C6748 PWM Test Over!\r\n",-1); 2 K4 d1 t2 B' q2 F- l4 u UARTPuts("------------------------------------------------------------\r\n", -1); " f. h; b4 {; b' f 3 l% C5 s% N( I2 I1 R U& T2 g2 R
5 a5 {: {" K, q# `7 o3 W* ?0 O UARTPuts("------------------------------------------------------------\r\n", -1); ; v! Z/ ^3 D' E F$ f; l# C j UARTPuts(" C6748 ECAP Test\r\n", -1);6 j' x- D2 g; Z0 ^
// ECAP 捕获初始化, ~ x3 t) z! Q# ~: u2 K, ~! p& S7 q
ECAPInit(); 5 Z8 D$ w$ z" J+ D& Q UARTPuts("Initialize ECAP.......\r\n",-1);" b) b- H: G+ d: i* @5 S
for(i=0;i<5;i++)0 W' I: k+ B) O0 T. h
{ 1 a- c- U* B( C7 W: C; p( ~* }' W for(j=0x00FFFFFF;j>0;j--); // 延时 ! Y( ]) ]1 m; g, i, z% |- U ECAPRead(); + e. a7 y- K' t, ?2 c6 b+ ^ } 6 w( q# M" |. }$ k UARTPuts("\r\n",-1); 4 |4 B0 a1 r4 w! g UARTPuts(" C6748 ECAP Test Over!\r\n",-1); : F% `$ k9 h" y* h- @# Y0 @ UARTPuts("------------------------------------------------------------\r\n", -1);1 G$ B% i& f, C1 d, |
, |4 I q# I) B1 K- I: y9 ^
// 主循环 ' s O `6 \7 O1 B' w1 t for(;;)) n8 @$ v: ~: e2 u. a* R2 ]
{ : N- H0 k; }7 j4 V/ W; o2 b, {/ j. k0 c: W, u3 d# I
}/ \) X: o! }3 {+ Z# n
}1 _3 F+ V: l7 C- h0 O5 M
6 U8 O. o$ X$ @7 T
/****************************************************************************/ 8 X$ K: ]1 b1 y/* */ 0 S% M& v# R2 l: C2 A/* PSC 初始化 */ / M+ D" |+ b9 f+ o, j% @/* */ & ^) I G( S. q( h7 h- V4 A/****************************************************************************/- I/ ^7 @/ {! j
void PSCInit(void)) b$ V( A6 O4 n/ d) G! p8 x
{* f. z+ }6 l7 x: S
// 使能 EHRPWM 和 ECAP 模块7 [+ n1 a7 M; I" V! [
// 对相应外设模块的使能也可以在 BootLoader 中完成8 g; m& K6 ]+ [9 m% D- C
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);/ K- V5 N" Y5 \# }7 i& `( M
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);" `9 ?5 D& b0 k" E, C# f
} Y; C8 ?" J, u B( n
% @7 Q7 d `' F, L2 h2 o/****************************************************************************/! l" I/ J4 l; L4 S
/* */- @3 b# O V2 D) k @ L7 r2 A
/* GPIO 管脚复用配置 */) a" L, D9 d, w: ?7 ~ n2 n- k' n+ h( y
/* */, c1 F% d& T* X" W
/****************************************************************************/ 9 T$ j4 L' v: e, n: o9 M0 R8 a. k0 Lvoid GPIOBankPinMuxSet(void)1 u8 }% O: n) d; {# n
{! j2 H: E# ~9 p! q9 V' |
EHRPWM1PinMuxSetup(); " f9 ?. n7 b5 O! z5 F; H8 ^* N# s1 l, s' O' j) D* W
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)1 y( K. Q: Q8 O% Q8 |* M
// 作为捕获功能时管脚方向为输入$ Q1 s! V- b; @+ Y, F! e# t& [0 k2 e
// 作为辅助脉宽调制时管脚方向为输出 . s0 f3 Y0 _0 O8 J6 g6 g" P- [; h // ECAP2 / APWM2 * J9 j, U( }4 e3 L' s ECAPPinMuxSetup(2);( g; A! T6 S T7 E2 i
& W f5 e; c( E9 B( d% Z0 w
// ECAP2 / APWM2方向设置为输入 K! o( ?/ Q2 O" l( d
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]! [* I- u+ X' ?8 k
} % |8 @) B, w& ]. W' {! G6 i% _# E ' l! Q, D6 m6 H7 I- e/****************************************************************************/$ c m+ K7 @5 v
/* */ ! V) Q" M$ _8 N0 j/ w3 `2 E2 w/* PWM 输出波形 */3 |: Q. D# G8 x0 Z" f8 o
/* */; a: K! z+ d- k' |
/****************************************************************************/. p8 t/ G5 `4 o4 H9 M3 g9 q
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)& U$ w0 t u f
{ % s" a7 a X* R0 M1 W! Y // 时间基准配置 3 t- m' y m7 Z7 ^7 T6 j* m8 D // 时钟配置* H+ k# R5 W8 l" ~( ~
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);! V# V/ `# B( m# Q1 f! E; S
6 F' F* l+ i* k R
// 配置周期0 R# Y. b) }8 N
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,- V1 F3 n; c+ i% [9 @( A
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE); 1 m6 l; ~+ p( t7 s& h' y 0 b: Y3 a1 c; F; A0 v Q1 J6 D2 ~ // 禁用输入同步信号/ [+ t- K7 @* l+ ]5 t" h4 V+ l2 t
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS); # Z. P" ?5 S: i- Z. O- x9 i6 D3 U. V7 n8 l9 T5 ^0 p
// 禁用输出同步信号 , c9 `. _" x) V+ O- | EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE); , [5 B9 E4 B$ q' p& m( P+ _0 y+ B* Q; ^% o4 ]: {- e, \2 A
// 仿真(DEBUG)模式行为配置 3 I1 F* @+ ~7 W8 `& y EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT); - Y# l; V2 L! I+ _; L! X! R4 o" M 1 y& ?* c1 l' i& P% ^- Q // 配置计数比较器子模块' k4 B `# b0 L' s$ O9 G$ ]' [, \
// 加载比较器 A 值( K2 @. \# Z/ }0 T, K
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,6 v; ^/ R6 L ?7 J. o
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL); 8 j8 R0 l. [ j6 E' ] , r6 y9 X' ?3 V2 M7 \) B. T // 加载比较器 B 值 : A* v: b0 m* B+ X/ O. z6 v+ a% O EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,: p! R( L* W# T1 `3 R: [/ F
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL); ! g) T3 |) n$ v- r; J `$ m0 P5 k3 J+ j // 功能限定配置(输出引脚触发方式设定)4 W0 F+ k" P9 r2 c. }
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出 ) `" Z; K) h" v( r' |' n* { M* z9 J EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,4 {2 l' J h9 H& l C8 _
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE, 6 N7 I3 C" `& }. U EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING); 0 i: n5 w) Z c+ c% t # {# X" X2 d6 k& k2 c. P3 Y // 禁用(旁路,信号直接输出到斩波子模块)死区模块 3 t. S) O* b8 l& T6 F EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);& m/ L5 w* d2 I9 L, t
7 ^% z3 {# ]! N3 L% U2 U // 禁用斩波子模块4 {( W4 V0 g1 [& E8 s* r0 I
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);) N# J+ q. V$ u: z, n6 K( e
+ O4 ^* `, ^' {5 k6 k
// 禁用错误控制事件0 L5 h/ k# j7 Q B8 `7 s
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);) L& Z# _5 K0 s. r# q' i% v& T
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE); $ n) B, O8 R7 v7 I ( C9 I( t& e- R5 r! x! r8 k // 事件触发配置5 m$ L$ E. D& u$ U) t0 P
// 每三次事件发生产生中断 3 L+ ?; @: n" @/ Q EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);: q7 w2 ]8 l# ~. M# _
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件! Q0 _# ?- |" ?" Y2 h& J
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC); 3 m2 |8 F( H0 T# _3 U3 @ // 使能中断 2 M2 {; T9 X) u8 ` EHRPWMETIntEnable(SOC_EHRPWM_1_REGS); ! K% b/ z. \9 N ' r; u& ~& {# w8 R; P // 禁用高精度子模块 K4 O3 ]" Z- q
EHRPWMHRDisable(SOC_EHRPWM_1_REGS); - ^0 Y7 h( I* k2 g" G; w6 J3 g$ v6 a+ V
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);" K% s# i$ H) ^2 H
} . M8 ^+ v0 X% |( o$ U8 g3 }2 U1 Q0 a3 ?3 t& B; p. a4 X
void ChopperWaveform(void) 4 b! g, V c2 i1 E{ 3 z/ E# @) J6 t // 50% 占空比( N y5 b& F n1 p1 u3 t. U
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER); + {! S* K( ~- q) T& y% e // 4 分频. n3 s2 F5 ^- W; I E% H
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4); " ~, C: ?# B5 M# w( i v% @ // 单个脉冲宽度( n0 P: x( M( E: S' y: V; v, R
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);) a" F- X) Q% j) w# @# p4 r( j( i
// 使能斩波子模块0 r8 z- a/ a8 D0 X J; U
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS); * |( X" z4 |6 _# e4 c Z$ {} + q9 j; h- \% h' j* V # H. w9 D5 q f9 h7 m1 P/****************************************************************************/ ' L( j0 B. w5 g# A: w( q( B9 V8 ?/* */ - D3 P! t5 |! S0 x7 k' o. e/* PWM 中断初始化 */; M3 V! U2 n! q) k3 B
/* */ ' a' j7 l0 U. |: N! m; E/****************************************************************************/% x7 X. J0 b: J% _4 f
void PWMInterruptInit(void) 1 H* F5 s" w+ B3 p& N5 h2 u{0 O' f, A; Y9 | K( `- K: s6 m* X$ X
// 注册中断服务函数 S. w+ Y% w; ^, e( U! x2 D) z IntRegister(SYS_INT_EHRPWM1, PWMEventIsr); % {; L1 q0 f8 R" e' [% D/ B IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr); 2 M1 h' c+ K; C 8 q1 X% G- U0 t- ^- x // 映射中断 3 k7 R: C) p6 G/ Y6 N IntChannelSet(SYS_INT_EHRPWM1, 2); ! q+ m# g% g/ b j% { c IntChannelSet(SYS_INT_EHRPWM1TZ, 3); 3 @8 l# E& y* K! M: ~; E4 K / b) S9 k, F2 F6 n" l // 使能中断$ N @- m3 t% b- O
IntSystemEnable(SYS_INT_EHRPWM1);8 s2 \; n: P4 `2 T/ {
IntSystemEnable(SYS_INT_EHRPWM1TZ); - _( T T' D2 ^; u- a8 E} 2 H: f. W. c/ b, O+ u2 F5 p) W 6 _& U( U$ f& W0 i# d/ V/****************************************************************************/ 3 h3 g6 |+ N( @5 l- f6 }/* */ [$ B, S9 e- z9 {6 ~9 p5 s4 k/ g/* ARM 中断初始化 */8 Q. o( W3 a3 Z
/* */9 \& k) L5 k" V5 c3 R1 Y# F h
/****************************************************************************/ 7 `5 {$ h" @1 o; [9 a4 Z3 hvoid InterruptInit(void)8 f0 E4 B( W/ n2 l- z
{! A2 M/ f' r1 M; c3 G/ U/ y
// 初始化 ARM 中断控制器+ e1 N" [/ E4 B6 N
IntAINTCInit();! B' H/ G$ n; }' l$ x3 M: d8 j7 J
+ T4 D" s9 B7 g {4 x( O: h. r
// 使能 IRQ(CPSR)3 n. I# I' E7 o' f2 @" b
IntMasterIRQEnable();/ j7 X5 ~- W% D9 a