机械社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 2864|回复: 3

用PIC单片机产生方波遇到这种波形

[复制链接]
发表于 2018-11-5 20:08:17 | 显示全部楼层 |阅读模式
本帖最后由 冯喆喆 于 2018-11-5 20:11 编辑 3 V; r& N; a& o! l' I# |2 L

0 X7 i# a3 j4 j& Q" x用PIC16F887单片机产生方波,当我把方波频率设为4KHz时波形是正常的,当我改变TIMER2的分频值,从4改为16 ,此时频率应该变为1KHz,此时频率是对了,可是波形却变得很奇怪。  求有经验的大神指导下9 x) v) b* A+ j( z3 G. s
这是产生的4KHZ正常波形,占空比为50%
" d2 Q8 S( j5 K# w7 A% U* v" ~. [# T& f& R2 w/ ^% l
微信图片_20181105201023.jpg $ k; j/ `+ Q6 x8 T* k

5 ^- J, E. `' F3 `3 S6 p这是1KHZ有问题的波形,占空比为60%7 W; X  _5 H/ q9 e2 i& |) [
微信图片_20181105201034.jpg 6 i# Q; ?# V, K4 W! C

7 x) s+ i! T7 _* J
回复

使用道具 举报

 楼主| 发表于 2018-11-5 20:14:34 | 显示全部楼层
主要的程序我也贴上来各位看一下
9 e( z8 X7 R& j* Y$ e" O3 L2 W2 A4 W
/********端口初始化函数********/; B$ M+ t) m9 M; m  ]9 A6 E
void init()
: }! g* v7 {( `{# p7 z3 y% o, V
        ANSELH=0x00;                     //设置B口为数字I/O口0 |  G! x6 F1 D$ a
        OPTION_REG=0x00;
9 G5 d' ]# }7 W$ Z% u/ T        WPUB=0xFF;         //设置B口弱上拉1 G8 f: O3 r4 G5 o
        INTCON=0x00;       //关总中断
7 i1 u: y# T! p9 p        PIE1=0;            //PIE1的中断禁止
( `# D8 N6 c/ ~  s2 C' h2 {& m        PIE2=0;            //PIE2的中断禁止1 W/ s) C( o) j
        TRISB0=1;
  i4 F  l, m9 L3 g% g3 Y; }        TRISB1=1;          //将RB1设置为输入口,按按键, u$ d8 y- {2 ?5 Z+ f
        TRISB2=1;          //将RB2设置为输入口,按按键
9 y) s/ G4 X1 |# m; R        TRISB3=1;
$ l* p7 h1 a% F$ c7 @$ u        TRISB4=1;
, W6 ]7 m* |5 o  z& b1 C3 e$ E/ m        RC1=0;
, _2 L6 d, b2 r) L" t$ {        TRISC1=0;          //脉宽调制输出引脚,设置为输出1 y0 g" b- I: V( d. w- W
}
) o8 r, h6 `9 |3 X/********PWM初始化函数********/
: J6 k* ^; i  b4 L# X, l+ _void PWM_Init()
( w9 ?6 C# D6 |) R* H{
3 A0 w% Y2 Y4 ?) C1 g# C% ~        PR2=249;           //脉宽调制波形的周期为1000us       
/ x" g* q; a+ J( i; Z        CCP2CON=0x0C;      //CCP2模块工作在PWM模式,占空因数的低两位为00, G: C6 s/ m5 h# T
        T2CON=0x02;        //禁止TMR2,且前后分频值为16,同时开始输出PWM) s4 t' J& o# k3 T  Z9 z
        CCPR2L=0xB8;       //脉宽调制波形的占空比初始值, ?. W2 ?; x/ p" ?; X, S' M+ ?
}4 B# O2 h' L* F+ \4 s0 ]/ V
/********键盘扫描函数*******    */
4 [  L9 `/ k8 Q$ E( O  M2 q+ Gvoid keyscan(), ]* X4 N% A' P  y
{  R% _: q, \+ \, \& l( |) v, Q8 p: Q- J
        if(RB1==0)                  //如果是RB1键按下" g6 T/ |/ N$ N% Q4 X
        {7 r2 d6 C6 J  {& X" M; D4 G
                delay_ms(5);              //延时去抖
3 m2 \/ ~2 [8 F3 z) C6 V0 C                if(RB1==0)              //确认是否有键按下( I+ G8 w5 _/ ^5 `
                {8 C( }4 x0 k3 L2 ^4 Y; s
                        while(!RB1);        //等待按键释放$ k2 ^4 e/ p: r6 i' d% P# F: h- |; J
                        CCP2CON=0x0C;) Q5 k) S7 G( Z
                        CCPR2L=0xB8;                   //80%占空比
! x8 e' P6 }/ Q* [: Z8 U7 r0 G                        TMR2ON=1;( s: \( W) ]3 N! b
                }+ }$ p) h& D: d: Z% L  h6 |  j/ d
        }
) ]3 |8 r. u+ C# R        if(RB2==0)                  //如果是RB2键按下( ]' M* O+ Q0 S" |" x7 h7 w" k
        {" C/ F% e) _7 E. s/ L
                delay_ms(5);              //延时去抖
% |- K* N2 N3 @) M" X7 T                if(RB2==0)              //确认是否有键按下
; \- \$ J/ Q4 f+ k                {
% v. n# I! }2 G! j* G" N7 e1 B                        while(!RB2);        //等待按键释放
7 p4 V, T; M4 h( e) J                        CCP2CON=0x0C;) S5 H) o* X8 S! p3 V" E, A
                        CCPR2L=0x96;                   //60%占空比* X- @4 R3 _: E, U
                        TMR2ON=1;
: _* J& X: v" M7 `9 k                }
* z6 q2 }8 \' N2 [% p* [. v        }8 y- A1 k% [% ~) n) Y( ~2 H' v
        if(RB0==0)                  //如果是RB0键按下9 m8 }- r# I. X
        {
/ ^1 G6 ?8 H. L$ r3 t                delay_ms(5);              //延时去抖
) K/ I+ s2 Z! A* S' W$ y                if(RB0==0)              //确认是否有键按下
1 }: z! U! ]# E5 K: s# m8 P) B, {                {
$ z4 B/ ], ]5 F; G                        while(!RB0);        //等待按键释放  A' y+ s* j8 a
                        CCP2CON=0x00;                   //关PWM
* A- t7 O; w  ?  w2 s: K                        TMR2ON=0;                        //禁止TMR29 L2 a) S* o1 Y8 F* w  l$ t
                        //delay_ms(5);( z4 f5 t. ^! N
                        RC1=0;4 K, g- d. Y: `
                }
3 g0 X4 L" K4 |4 j        }
: T* s. B1 h7 k% n8 Y* _}; `# l- i6 g  |, J4 W) U2 x
/********主函数********/
' R) J; a8 o# F# R$ q% i: Bvoid main()
, @5 k  O- B  B0 c6 Q) D{
0 [$ P5 \5 ^! z        init();                     //系统初始化
! U: u! d  p% k" @. `; v: W        PWM_Init();                 //脉冲宽度初始化! q& |# N2 e: n9 i" W
        while(1)$ [0 Q1 U& W' v. v* I9 n& z
        {: i9 s5 M1 r4 }# V4 G6 ~; W
                keyscan();              //调用按键扫描处理脉宽因数
4 l6 X5 F; U0 O/ z8 C7 v# b        }
( P( D; h. ?8 e; g5 S/ w}
回复 支持 反对

使用道具 举报

发表于 2018-11-6 07:38:09 | 显示全部楼层
单片机常用问题吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-6 14:45:37 | 显示全部楼层
远祥 发表于 2018-11-6 07:38
6 M3 w: x; m* \7 G$ k1 O& |4 P$ v单片机常用问题吗?
& ~8 C& y+ ]# ^
这个是用PIC单片机产生PWM波,应该比较常见吧
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

小黑屋|手机版|Archiver|机械社区 ( 京ICP备10217105号-1,京ICP证050210号,浙公网安备33038202004372号 )

GMT+8, 2024-11-17 21:17 , Processed in 0.060972 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表