找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 3278|回复: 3

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

[复制链接]
发表于 2018-11-5 20:08:17 | 显示全部楼层 |阅读模式
本帖最后由 冯喆喆 于 2018-11-5 20:11 编辑
/ F( A/ u: K' l: h, M# F9 a+ F' ]% W  |1 b  a# y
用PIC16F887单片机产生方波,当我把方波频率设为4KHz时波形是正常的,当我改变TIMER2的分频值,从4改为16 ,此时频率应该变为1KHz,此时频率是对了,可是波形却变得很奇怪。  求有经验的大神指导下
6 ^$ T! _" ^" y# X( E9 u! z3 P这是产生的4KHZ正常波形,占空比为50%8 d% }5 m% N, E. s% {$ U6 E

8 m8 E: w2 c2 ^8 A9 L 微信图片_20181105201023.jpg
" M% Z" I  X; x$ C6 y
% M# o& g3 h# L. @* M这是1KHZ有问题的波形,占空比为60%& I# k5 L* Z: s. \( M
微信图片_20181105201034.jpg
1 H! Z( \8 {% [- o- ?+ x. p3 |% E  G( X& Z
回复

使用道具 举报

 楼主| 发表于 2018-11-5 20:14:34 | 显示全部楼层
主要的程序我也贴上来各位看一下. f3 n. i7 Z' K% G, ]+ b( q
6 _* e0 V  z+ o
/********端口初始化函数********/' m! X! F* ~2 e9 e$ W
void init()
7 i% o" r' K+ D' F{
9 f- i" S2 k  E) G9 p' z        ANSELH=0x00;                     //设置B口为数字I/O口% p" Z) K$ ?% C, P1 [. z9 P
        OPTION_REG=0x00;9 Q0 D' y. T  s$ c1 E( |/ J
        WPUB=0xFF;         //设置B口弱上拉
2 _# k( a+ ]( W+ `0 ~6 p9 @9 J        INTCON=0x00;       //关总中断
% P9 k0 {: P' Z3 [7 a        PIE1=0;            //PIE1的中断禁止) j; f, m; Y# ^1 v9 i
        PIE2=0;            //PIE2的中断禁止
' [% a9 ^/ c( M1 i" w; k; R        TRISB0=1;
4 U. B* G# I7 g# v. t" K4 X        TRISB1=1;          //将RB1设置为输入口,按按键
% o4 V& y: d1 \) g. k( z( s+ O        TRISB2=1;          //将RB2设置为输入口,按按键
, V% a: K" ~2 ]/ H7 }' G7 y- W3 |  d        TRISB3=1;  S' h' `: @3 n: P! q( e
        TRISB4=1;$ z* H' a0 I- D7 b, b6 V/ i
        RC1=0;' M/ A! ]% f+ H% v: ?9 {
        TRISC1=0;          //脉宽调制输出引脚,设置为输出
# c5 |5 c7 [) m0 I/ ~* Z$ T' B}
! W4 A) t- U1 q4 {1 I/********PWM初始化函数********/
  H3 a$ K+ ~3 ?: c5 Fvoid PWM_Init()
/ E/ p* p; x0 ]{
! Z! \& Y. ?$ S        PR2=249;           //脉宽调制波形的周期为1000us       
( _6 B9 P( i$ j# c, \        CCP2CON=0x0C;      //CCP2模块工作在PWM模式,占空因数的低两位为00
; E4 T& W- F+ q8 [! J4 V: X. P/ W        T2CON=0x02;        //禁止TMR2,且前后分频值为16,同时开始输出PWM
; Y7 J/ I7 q4 \5 U$ h+ \8 S  E        CCPR2L=0xB8;       //脉宽调制波形的占空比初始值2 \7 n7 D& K% l  v
}
. Y& h7 o$ i3 ]. \" p. j8 g0 n9 ^/********键盘扫描函数*******    */- h6 k1 l% r9 j+ F  o1 ?2 |
void keyscan()5 y. A2 E- v) |' y# i% Y2 j
{2 o! u5 e! N& c6 g& z3 M+ W$ W
        if(RB1==0)                  //如果是RB1键按下. C- c% j( P& q) _! C* S9 S7 G
        {1 [& h( a) L& U. o8 Q5 a: [2 Y
                delay_ms(5);              //延时去抖
2 A/ V, g$ o8 H/ m                if(RB1==0)              //确认是否有键按下0 I: ?& T0 o0 K3 S3 o
                {
! f) K- U4 Q5 b& A                        while(!RB1);        //等待按键释放
6 q$ e- g2 a/ _+ K9 z                        CCP2CON=0x0C;
( z- ^# {  h6 ]8 E, U                        CCPR2L=0xB8;                   //80%占空比
; o& `0 s9 `! r  K4 R; m                        TMR2ON=1;, F& A( H$ W- N
                }0 t- ?: X9 k3 Y- Y
        }
% l. H4 ]" Q3 \& H5 H/ H1 l( d        if(RB2==0)                  //如果是RB2键按下( O% ~$ B$ w5 D
        {
- H  v8 E  V7 ?' t                delay_ms(5);              //延时去抖
# `* g! K) f. T+ d) A                if(RB2==0)              //确认是否有键按下8 ?3 e$ Q; N# o/ M2 f
                {
- P! \. q% K4 l, c- S# a                        while(!RB2);        //等待按键释放0 p/ W+ Y3 `9 C( V
                        CCP2CON=0x0C;  _5 w% p7 `3 g) n0 c: e
                        CCPR2L=0x96;                   //60%占空比
6 i) b  R% \( Y                        TMR2ON=1;. X' `5 R+ u! ^" g( f. S
                }: ?% c& m' N+ y+ m, s
        }
2 I! m$ q, z& c: k( b        if(RB0==0)                  //如果是RB0键按下' S9 w- S6 s3 L
        {* `; R: _6 q" c! T9 f
                delay_ms(5);              //延时去抖9 c3 _% c% y1 i3 R3 h( ^' O
                if(RB0==0)              //确认是否有键按下" L5 b3 `2 P( I, w! n
                {8 u) B* J/ d) @: x
                        while(!RB0);        //等待按键释放
  E/ B, K2 E  }2 b, k, s- Y                        CCP2CON=0x00;                   //关PWM1 K0 ?0 t6 q( I8 f& m6 u4 q) N% I/ ~
                        TMR2ON=0;                        //禁止TMR2
- }7 x$ E! K. J# r6 Z9 e# W, l- y                        //delay_ms(5);
' W2 W3 O! V; n1 o- _9 R                        RC1=0;% y8 j+ R) E  K( k0 C) Y3 _' B
                }1 D% w; @% f$ B. V, o2 G
        }* p! E! m& R3 ]% p+ @: c
}* v4 l' i1 n* e1 S
/********主函数********/! F' ?4 Q. K0 f5 F. z% ?" \2 @  C
void main()) s) l2 z( m: c
{
* f* S! g) ^" w6 ?+ n* F! Z        init();                     //系统初始化6 j  p1 E) K% j& R" R- ~
        PWM_Init();                 //脉冲宽度初始化. S, }; F; J# c
        while(1)$ b! Z" r: q" x
        {* o7 _! T! w' n" U1 d
                keyscan();              //调用按键扫描处理脉宽因数
2 S9 A: G, K1 k        }# ]4 n/ A4 X0 t/ Y' D- n
}
发表于 2018-11-6 07:38:09 | 显示全部楼层
单片机常用问题吗?
 楼主| 发表于 2018-11-6 14:45:37 | 显示全部楼层
远祥 发表于 2018-11-6 07:38" }* h, X) @. B: R% ~
单片机常用问题吗?
. g  n. H8 L, e6 S, J
这个是用PIC单片机产生PWM波,应该比较常见吧
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

GMT+8, 2025-7-4 08:55 , Processed in 0.061059 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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