找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 3279|回复: 3

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

[复制链接]
发表于 2018-11-5 20:08:17 | 显示全部楼层 |阅读模式
本帖最后由 冯喆喆 于 2018-11-5 20:11 编辑
( _& l5 h, j% Z7 Q9 ~- h! \+ u+ S5 ~. s
用PIC16F887单片机产生方波,当我把方波频率设为4KHz时波形是正常的,当我改变TIMER2的分频值,从4改为16 ,此时频率应该变为1KHz,此时频率是对了,可是波形却变得很奇怪。  求有经验的大神指导下! R) v; t6 m0 x4 K) Q& K
这是产生的4KHZ正常波形,占空比为50%
+ d( L- O3 w* a! g* G0 C% u
3 [' e# ^: G* r/ _ 微信图片_20181105201023.jpg
$ o# V  L0 M9 G6 j; {2 ]8 s5 y3 j( \2 s( ~1 d; j, M; M6 D1 x! H$ U5 d
这是1KHZ有问题的波形,占空比为60%/ ?  B/ s) [, M* I
微信图片_20181105201034.jpg
% r. X( b- b1 E; `1 q( T! ^, L- c" D
6 e& [  K7 \2 z8 o* s  a& j2 ~* r
回复

使用道具 举报

 楼主| 发表于 2018-11-5 20:14:34 | 显示全部楼层
主要的程序我也贴上来各位看一下2 [; p# c) U3 j9 T
$ g- Q* q6 ~8 g% Z! I3 r
/********端口初始化函数********/
7 ~) Z( [5 O1 x# t* o2 B# Zvoid init()% c; r' U; q+ z( R0 i+ @
{
6 w- f# s2 ?# N9 T5 C% r2 t        ANSELH=0x00;                     //设置B口为数字I/O口
  s, c/ q' y! t1 B: Z5 I0 M        OPTION_REG=0x00;
$ b) t% x- b' _7 |        WPUB=0xFF;         //设置B口弱上拉( }* s0 m8 j6 S4 d
        INTCON=0x00;       //关总中断4 r' K$ R6 u2 m6 \( s2 Z
        PIE1=0;            //PIE1的中断禁止
: U! l' b( ^6 @/ h# Q- g0 N" T* _        PIE2=0;            //PIE2的中断禁止
, i5 `: u; K" A        TRISB0=1;$ h( j+ d4 f' K
        TRISB1=1;          //将RB1设置为输入口,按按键
& l+ p; j0 ~! ?4 S        TRISB2=1;          //将RB2设置为输入口,按按键
8 y: a. \. m" [1 T7 `, F4 m/ C        TRISB3=1;
# n' @' h! k' s0 q$ c        TRISB4=1;
/ ~$ j7 W: R- [* l        RC1=0;5 Q9 U6 z+ A* n" y) I9 D7 u* m9 y
        TRISC1=0;          //脉宽调制输出引脚,设置为输出, n0 ]' I2 x; W4 l) Z! R( M) b
}5 N6 `3 z  z% n" G2 j) j
/********PWM初始化函数********/
6 m+ J* i1 u& p! ^. K$ [0 tvoid PWM_Init()+ H3 F  P3 ^9 x
{$ K6 L- o$ t1 p, p, l- B
        PR2=249;           //脉宽调制波形的周期为1000us        ! i' ^* O6 H0 L# x! ~; o2 t
        CCP2CON=0x0C;      //CCP2模块工作在PWM模式,占空因数的低两位为00' o$ a* ^5 T) k& H% v; C+ u
        T2CON=0x02;        //禁止TMR2,且前后分频值为16,同时开始输出PWM
* d* T1 f; T; U3 |; n. `2 D        CCPR2L=0xB8;       //脉宽调制波形的占空比初始值) l- N- T% |! c+ K
}7 E) x, Z; _) ?. w. Y: {
/********键盘扫描函数*******    */( @/ \- R/ J. e: D; ^' _5 e
void keyscan()/ ^0 u( n) o7 v
{3 F4 C: P1 ^) y/ Q6 @- d3 ~
        if(RB1==0)                  //如果是RB1键按下
/ A: a. D9 X$ ~) ^+ X) j; _/ O# [        {: X8 F3 S! r1 y2 J. d+ ]
                delay_ms(5);              //延时去抖, h. b8 ?( c- R4 u+ ^, T1 x9 @. x7 _
                if(RB1==0)              //确认是否有键按下0 Q# U: H# u* F1 ^" {
                {* {% w1 N6 q) n: Q5 U7 H+ {) U
                        while(!RB1);        //等待按键释放
) i; L+ k" k% @3 R                        CCP2CON=0x0C;
3 O2 ]8 l4 D5 K: Q$ {                        CCPR2L=0xB8;                   //80%占空比& J9 Z7 R& S4 f1 l9 g$ y& ?
                        TMR2ON=1;$ ~, a( r0 V0 t; r, X
                }& x  x; ]6 s! o
        }
2 |- g: B7 k8 J( s4 F6 s        if(RB2==0)                  //如果是RB2键按下
) b& U0 z6 h1 {' H2 d! N) d7 X        {
( b/ ~9 B8 v+ @+ c& V                delay_ms(5);              //延时去抖
. l- B: N; z8 @; x( ]                if(RB2==0)              //确认是否有键按下
# r4 R7 `. p5 `4 \, m! E9 y                {
1 l: }* P9 o4 z# F7 c) ]                        while(!RB2);        //等待按键释放
: C# B+ u& y' ~1 z( S                        CCP2CON=0x0C;4 s1 Z& }& h/ k5 x: u
                        CCPR2L=0x96;                   //60%占空比
# b* b; S$ i) u, u- I# t7 X                        TMR2ON=1;6 x( u3 U$ H, X
                }
2 t  Y  q5 Y, w" p        }/ z% P3 r; P& L) Q
        if(RB0==0)                  //如果是RB0键按下+ X. W3 Y6 l8 S+ |. ]
        {7 K2 z$ u6 m! A8 C, b; d( ~/ m
                delay_ms(5);              //延时去抖
$ B3 X5 X. u% a8 [% K                if(RB0==0)              //确认是否有键按下
' n3 b2 p) a6 R& j                {# c3 \9 G, ]1 `9 G2 M- u" L8 b6 j$ [
                        while(!RB0);        //等待按键释放
$ \2 q- G/ b; x: x& V                        CCP2CON=0x00;                   //关PWM
# N; f$ ^' n% r% [                        TMR2ON=0;                        //禁止TMR2
) M1 d  j; e, F' V6 k' S                        //delay_ms(5);) S3 B/ s# b/ m& V( d7 ?
                        RC1=0;
- G6 \6 W+ {# k3 z" V; e# z                }
+ l7 E4 V' B2 v7 r- z        }
' y* w* s/ c5 N# A" }; k  L}
4 J" ^& W( N1 T/ }+ |. x  ?2 W/********主函数********/
1 x6 l* m9 |4 Y" b/ Ovoid main()% c3 D* g! a. T0 H- R
{
" v, q6 B2 R3 C- Y- P) ~  o  Q8 x        init();                     //系统初始化
; }9 F8 f7 u- @- _9 X        PWM_Init();                 //脉冲宽度初始化% h) v. p3 v- A6 @' C! M
        while(1)
$ R8 M* z/ Y. Y% Z; n9 L2 S' T        {& j/ D0 R2 p8 w7 n$ `
                keyscan();              //调用按键扫描处理脉宽因数3 `6 |, a$ y2 c/ p
        }" _4 v& c' F$ f5 J
}
发表于 2018-11-6 07:38:09 | 显示全部楼层
单片机常用问题吗?
 楼主| 发表于 2018-11-6 14:45:37 | 显示全部楼层
远祥 发表于 2018-11-6 07:38' Z$ X$ Y8 Y& O: b7 r% W8 i
单片机常用问题吗?

, \& I$ j! Q- @/ V5 \+ E+ ~这个是用PIC单片机产生PWM波,应该比较常见吧
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

GMT+8, 2025-7-6 00:26 , Processed in 0.070921 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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