机械必威体育网址

标题: 用PIC单片机产生方波遇到这种波形 [打印本页]

作者: 冯喆喆    时间: 2018-11-5 20:08
标题: 用PIC单片机产生方波遇到这种波形
本帖最后由 冯喆喆 于 2018-11-5 20:11 编辑
2 ]" v0 e7 n+ T" j/ y+ F( I: b/ K# k# b* j! o; E* t
用PIC16F887单片机产生方波,当我把方波频率设为4KHz时波形是正常的,当我改变TIMER2的分频值,从4改为16 ,此时频率应该变为1KHz,此时频率是对了,可是波形却变得很奇怪。  求有经验的大神指导下
/ V  H5 D7 H& T$ j  e: O这是产生的4KHZ正常波形,占空比为50%( k* Y( Y  X6 c/ }
+ V" B: {7 a! }# k
(, 下载次数: 44)
, q4 n1 F# z. e1 ~8 X5 G
+ J  M( V" a2 Z! [8 B" C这是1KHZ有问题的波形,占空比为60%) q  k% B# y! Z8 x1 Z" s* b
(, 下载次数: 38) , ?2 P( T  o, I8 y6 p% N

0 y' A- ?1 C( \6 W0 A1 X9 y
作者: 冯喆喆    时间: 2018-11-5 20:14
主要的程序我也贴上来各位看一下) [# z# p! Z) n* m/ I

5 v* i) [9 F  M1 `/ z. Q/********端口初始化函数********/% ~( s9 P# V$ x, r3 u' }
void init()9 @/ l7 f2 i4 Q; T
{! i! O$ k- ?! D, x
        ANSELH=0x00;                     //设置B口为数字I/O口: D& ^. u8 i" F4 X. y4 N  L
        OPTION_REG=0x00;5 L: n1 l$ X' c. p- _3 G# h
        WPUB=0xFF;         //设置B口弱上拉* X; W# y# i3 w# M0 W
        INTCON=0x00;       //关总中断
: B- t0 B4 F1 G9 H6 c! n        PIE1=0;            //PIE1的中断禁止( H, S1 s+ M' N9 v- t9 ?
        PIE2=0;            //PIE2的中断禁止" `( [( I8 e: ?1 _0 s. l
        TRISB0=1;
4 B9 l* w! |( \) O5 F        TRISB1=1;          //将RB1设置为输入口,按按键0 x9 c, E, ~# l3 W3 y' N
        TRISB2=1;          //将RB2设置为输入口,按按键
0 p1 l: w( [; n        TRISB3=1;+ f4 l1 A! ?, E" R3 a1 w
        TRISB4=1;
: U7 d7 F) ]$ U- K& }: r0 [' n" S        RC1=0;
: K( ~' C5 W8 E7 J& F        TRISC1=0;          //脉宽调制输出引脚,设置为输出2 m) d) p/ {( {" h4 o" r( U0 i# R* k
}7 q3 w# J, N% P
/********PWM初始化函数********/. J3 V" ^$ I$ g8 j: @- t
void PWM_Init()
) G/ s& ~0 F8 X{
/ p7 q- @8 N1 o/ ^$ r, \5 ?        PR2=249;           //脉宽调制波形的周期为1000us       
& d: R" n4 P# o; g9 _        CCP2CON=0x0C;      //CCP2模块工作在PWM模式,占空因数的低两位为00
; Y% T% o5 B7 d        T2CON=0x02;        //禁止TMR2,且前后分频值为16,同时开始输出PWM! b8 A$ `* l1 \4 d/ @) ]8 H) S# N
        CCPR2L=0xB8;       //脉宽调制波形的占空比初始值
6 s: ], F8 `  O' V}
6 L  t  G- e: w) @; F3 w/********键盘扫描函数*******    */+ t2 J. W+ l+ z8 s: T2 `
void keyscan()
: }/ g/ ^7 w1 [) `  a{
5 @. \2 Q$ p' R+ Y' J/ V        if(RB1==0)                  //如果是RB1键按下
+ l, M& y3 G6 w$ X        {
1 y- V* V, N9 |9 A$ D% u                delay_ms(5);              //延时去抖
' I: v* Y# @7 c7 ?+ ^+ u                if(RB1==0)              //确认是否有键按下+ Z/ k. x6 p8 V5 q
                {
. T3 E) A& N8 l: z" H3 t: q" u% {                        while(!RB1);        //等待按键释放
: v7 Q5 {4 g( M1 ]! j* k                        CCP2CON=0x0C;; i6 H6 I& [) P% G# N0 x+ @  `
                        CCPR2L=0xB8;                   //80%占空比- m- Y% |2 G6 L: T
                        TMR2ON=1;
7 e$ G3 Q# x; l" e- K: _                }
9 }+ {) p4 [: t* k( c# U# |- O7 O1 z# O        }
/ @8 ?& P% U0 w/ q6 L1 w        if(RB2==0)                  //如果是RB2键按下3 x) a9 Q, w6 G
        {7 G6 x3 j( P  |2 P% `1 k$ p3 N
                delay_ms(5);              //延时去抖
0 d- \4 N$ B' e0 o; _                if(RB2==0)              //确认是否有键按下4 C3 y5 g/ y" `
                {
' ?/ H; T, p, K4 y/ R5 _. R/ c; Y+ J4 K                        while(!RB2);        //等待按键释放
# V) i4 ]  q. ]  z3 Y; r) e* \: ?1 C                        CCP2CON=0x0C;
+ V0 r$ g$ \+ Z1 m- S                        CCPR2L=0x96;                   //60%占空比$ u/ o1 e- u/ p( u
                        TMR2ON=1;: A9 n; D  }) X' e4 V
                }1 j# p4 S! K  T" v  m3 \8 y" z& y+ }
        }
  J: V5 z1 B: ]6 a/ ^+ I4 {- i) A        if(RB0==0)                  //如果是RB0键按下/ b+ j1 t: `/ X+ K% g
        {
( ]* m, T9 B: G: ]                delay_ms(5);              //延时去抖
) G. @2 g  m4 X                if(RB0==0)              //确认是否有键按下) k- z  a( W+ U/ C$ s
                {
6 B3 I- P, O/ k$ Q! x. k; F                        while(!RB0);        //等待按键释放
- J; n0 J# m$ X5 p* V                        CCP2CON=0x00;                   //关PWM2 H: r9 D8 C( E( [( H+ `6 N
                        TMR2ON=0;                        //禁止TMR2% B* J6 s' a6 @7 I2 U3 A
                        //delay_ms(5);
5 `! {* f1 K1 |1 ?  {                        RC1=0;
: T" u8 w8 B2 H# T: S$ \4 |  t5 [                }7 e- [, z4 `1 Z1 ?( |  T
        }9 e  }/ g: \7 G& Z: V
}7 u, [/ {) J3 o. U
/********主函数********/' K1 w: w1 }1 u! k  |
void main()
' d# ^+ ]9 `6 R6 h, _' x3 T3 f{
+ \/ v6 Z8 c# z7 K9 V" s7 s        init();                     //系统初始化2 X, [- ~; Q' O5 {" z; ?" r
        PWM_Init();                 //脉冲宽度初始化
+ W5 q, Z$ ]! M6 Y* c: L2 Q        while(1)- O, Z6 D  a% g( U( n/ c2 a
        {
! `$ d1 K6 e2 f; p/ p                keyscan();              //调用按键扫描处理脉宽因数
) [8 I' T1 B' J        }: n: @! g  D( J. T" p
}
作者: 远祥    时间: 2018-11-6 07:38
单片机常用问题吗?
作者: 冯喆喆    时间: 2018-11-6 14:45
远祥 发表于 2018-11-6 07:380 f& {/ L. ]. |9 W
单片机常用问题吗?

+ v/ ?# }: h) y2 @这个是用PIC单片机产生PWM波,应该比较常见吧




欢迎光临 机械必威体育网址 (//www.szfco.com/) Powered by Discuz! X3.4