机械社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 3146|回复: 3

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

[复制链接]
发表于 2018-11-5 20:08:17 | 显示全部楼层 |阅读模式
本帖最后由 冯喆喆 于 2018-11-5 20:11 编辑 2 `! s8 ]3 ?+ Y# u+ @3 E& |4 W

$ z0 z8 j/ }/ d8 Z用PIC16F887单片机产生方波,当我把方波频率设为4KHz时波形是正常的,当我改变TIMER2的分频值,从4改为16 ,此时频率应该变为1KHz,此时频率是对了,可是波形却变得很奇怪。  求有经验的大神指导下
+ W, c8 b0 n* I% ^这是产生的4KHZ正常波形,占空比为50%, |- {. M, u- j: t, s4 E
5 [! `# K* c* b( Y# O: `
微信图片_20181105201023.jpg
' w7 Q3 s  }% K! V9 I
( u1 z  z, ^' |- W  Z6 C这是1KHZ有问题的波形,占空比为60%1 ]  O0 ], x# d
微信图片_20181105201034.jpg
7 `) W; Q$ X4 Z- S+ S  Q9 a: n: p2 h7 s) ]. C4 j; h5 j4 {' `
回复

使用道具 举报

 楼主| 发表于 2018-11-5 20:14:34 | 显示全部楼层
主要的程序我也贴上来各位看一下1 ~* j- s9 E9 A
; T2 m; [, f. L: R9 h( v
/********端口初始化函数********/$ {) R8 v# B' F2 e
void init()
( G1 O  w, ?! b& T" X3 q" e{6 \% I" A2 a! R
        ANSELH=0x00;                     //设置B口为数字I/O口. Y& X1 T; @4 D% E, J0 b& @9 V& |
        OPTION_REG=0x00;
. D' F3 T$ `  x        WPUB=0xFF;         //设置B口弱上拉3 r9 u! w( X+ h- k: j' ]9 M; I
        INTCON=0x00;       //关总中断
; Z# r) `0 `' ]* G        PIE1=0;            //PIE1的中断禁止
0 a& j1 u1 p3 @        PIE2=0;            //PIE2的中断禁止  ~" {0 u' n9 f1 }; d* d- O! c3 X
        TRISB0=1;
& B( ~0 T" ?3 O7 C; m7 H        TRISB1=1;          //将RB1设置为输入口,按按键
8 Z6 m2 W* J  q( z( i* }* o6 i        TRISB2=1;          //将RB2设置为输入口,按按键
+ z/ l8 e  b* W+ w0 q+ p: W        TRISB3=1;2 q) W, y& ~/ g0 i  d4 Q4 _
        TRISB4=1;) o9 [7 L- E& a) E. `. Y7 U! o
        RC1=0;9 d* X. N" r) U" C+ \
        TRISC1=0;          //脉宽调制输出引脚,设置为输出
) u- i" p" B# c( t0 m' D- C}& \/ U- t6 m  n
/********PWM初始化函数********/
. y; \  W2 h9 \void PWM_Init()
$ ]" k- W0 e) X5 P4 I8 S4 }{
5 `2 C2 u/ W; ^- v        PR2=249;           //脉宽调制波形的周期为1000us       
3 K* M( N  ]+ o! i  ^        CCP2CON=0x0C;      //CCP2模块工作在PWM模式,占空因数的低两位为008 @: J& b4 f2 A2 ^. U
        T2CON=0x02;        //禁止TMR2,且前后分频值为16,同时开始输出PWM
% \+ w9 k+ a7 Y; c. C5 p: ^' _        CCPR2L=0xB8;       //脉宽调制波形的占空比初始值. f. t$ D  X6 T" q3 o- G" i* L
}
' L6 y, a+ Z# V4 ?4 P; V: L/********键盘扫描函数*******    */
4 A0 H; y  ], x- Tvoid keyscan(), F. d( L. E* ]
{. L0 n6 K( ?: j  P5 z, ~) d: M
        if(RB1==0)                  //如果是RB1键按下2 a) [" e( s: N! J) K# x
        {
$ p8 B  m9 a1 v% b: \9 [                delay_ms(5);              //延时去抖+ q1 H/ G# P$ I: ?
                if(RB1==0)              //确认是否有键按下2 S, A8 x" p3 r# P# W7 h) C( L
                {
# a2 M" S0 C$ s0 J                        while(!RB1);        //等待按键释放: }& w* l+ e2 S0 e: F& T( l
                        CCP2CON=0x0C;
/ ]! K; b+ \$ C2 H8 n                        CCPR2L=0xB8;                   //80%占空比
9 l; M3 b5 [9 @0 P  ?2 z1 ^8 X' x                        TMR2ON=1;
, G  Y( F3 K1 x! a& \; |0 }3 e' I4 \: d1 U                }
) n. O, T; J0 L        }& b( O& q- G/ y) P$ |
        if(RB2==0)                  //如果是RB2键按下7 @- i! V. G  f: r
        {* g3 L2 ^  g% V$ f: D6 t
                delay_ms(5);              //延时去抖
1 l9 B+ P* y! T5 {                if(RB2==0)              //确认是否有键按下
9 L# W- ^3 e; F: ?6 J, d+ T                {- b& y! n; s; t8 k" B* T
                        while(!RB2);        //等待按键释放
8 ^! Y0 B* Q1 V6 H7 ]8 k& x                        CCP2CON=0x0C;
2 i9 H5 Y5 Z1 _8 w) o5 }                        CCPR2L=0x96;                   //60%占空比
6 k% f' s0 f0 n+ z1 e' `% g                        TMR2ON=1;
/ H) ~+ E8 Y6 f: P2 @                }
4 B5 w  ^- U+ b$ }: Y        }4 Y1 q  T* q! C
        if(RB0==0)                  //如果是RB0键按下
6 x/ K0 E/ Q! _/ I7 @3 e1 t        {+ H8 F+ O  q: u$ _% W, r$ L
                delay_ms(5);              //延时去抖
% K$ ?& H4 x8 \& [                if(RB0==0)              //确认是否有键按下* E  u" y+ A# T* c2 I$ O8 v8 ?
                {
9 k) \0 {+ P1 d2 X# z' }/ `                        while(!RB0);        //等待按键释放; A& X" K3 {; q5 U( i
                        CCP2CON=0x00;                   //关PWM
6 X3 {2 ?, y. C* x7 y9 r3 h                        TMR2ON=0;                        //禁止TMR2) V/ d, Q/ F: V
                        //delay_ms(5);
/ U* h* v$ P8 R8 D8 Q& r1 Y" ^6 Q! T                        RC1=0;( U; v  z  `2 v& h' a/ N. q8 g
                }
. L% c6 I0 _3 V# A! l        }0 X/ p0 p. m0 E
}3 V9 \4 W; a) r5 _7 B
/********主函数********/
* h5 P7 ]: `+ M2 ?8 b0 Zvoid main()1 ^1 K# O4 |. l. T: V
{, E* {: b9 i6 R
        init();                     //系统初始化. \2 B# _4 h" l) f, G  v9 t2 ~
        PWM_Init();                 //脉冲宽度初始化
& v* a2 T: V- T  `        while(1)
% Q, C4 k8 V- Z+ {+ t: W) N4 S        {
* M3 X( ^% {1 V& x; K, _' Q5 Z5 g; \8 i                keyscan();              //调用按键扫描处理脉宽因数" e$ x# l- g# B
        }
3 @0 K$ M& [/ ?6 u; R% i- U}
回复 支持 反对

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2018-11-6 14:45:37 | 显示全部楼层
远祥 发表于 2018-11-6 07:38
6 J( ~1 r: Z* }; e单片机常用问题吗?
0 N/ V5 p( E3 A, f* M
这个是用PIC单片机产生PWM波,应该比较常见吧
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-18 16:58 , Processed in 0.060629 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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