找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 3267|回复: 3

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

[复制链接]
发表于 2018-11-5 20:08:17 | 显示全部楼层 |阅读模式
本帖最后由 冯喆喆 于 2018-11-5 20:11 编辑
8 }- T& P( J4 z4 a' _* b. \0 e( K% X/ R+ k! [$ }
用PIC16F887单片机产生方波,当我把方波频率设为4KHz时波形是正常的,当我改变TIMER2的分频值,从4改为16 ,此时频率应该变为1KHz,此时频率是对了,可是波形却变得很奇怪。  求有经验的大神指导下! T1 X  W% W  _. y4 [) K
这是产生的4KHZ正常波形,占空比为50%
" @! c8 r8 N9 }9 z" ]/ j6 ^: w) c; W: u; Q
微信图片_20181105201023.jpg
. r, E! M/ ~7 e! I0 Q8 Z! H6 R
/ U$ ~5 Q5 ~; ^2 k! b5 \: K这是1KHZ有问题的波形,占空比为60%; V' _' R; a  ]9 o
微信图片_20181105201034.jpg
( H) w- n9 Z8 s. y. ^: p+ o
. \& x5 e1 H& W" i
回复

使用道具 举报

 楼主| 发表于 2018-11-5 20:14:34 | 显示全部楼层
主要的程序我也贴上来各位看一下
8 K9 j& z6 f/ c; a% T! n/ o" N" t" z5 {4 X5 F  g
/********端口初始化函数********/, H2 S4 Y2 f* |0 A; C" [* z
void init()/ [0 D7 }. D2 ?$ T; ]) k1 b$ x4 E
{* N1 T  [# g; F! O" S4 y
        ANSELH=0x00;                     //设置B口为数字I/O口
6 T) w6 W9 O4 M        OPTION_REG=0x00;
5 O( L1 r% N! l( |5 R. {' O, E        WPUB=0xFF;         //设置B口弱上拉8 f3 k$ k$ n" K, }0 r
        INTCON=0x00;       //关总中断4 r8 l3 w' v+ _; K: u3 _' p
        PIE1=0;            //PIE1的中断禁止: p! G. @' ?! a# I1 v* H; l! C, m; t! `
        PIE2=0;            //PIE2的中断禁止
7 [/ H0 K0 j  [# D& c% H# h4 D        TRISB0=1;2 Q, B$ b+ n1 v' u
        TRISB1=1;          //将RB1设置为输入口,按按键7 m9 z/ ?3 T' Q' u
        TRISB2=1;          //将RB2设置为输入口,按按键" ?: ^: o5 ^3 h/ H- R% T/ j8 S: H3 ?
        TRISB3=1;9 q( b" R1 {5 z% W2 X, k2 y% h
        TRISB4=1;) [6 y! ?, o! a) T8 F9 Y9 u5 s
        RC1=0;
8 w2 G: v* j' |* P7 u, u5 h) K        TRISC1=0;          //脉宽调制输出引脚,设置为输出
4 E/ d! y- \/ B8 e1 ?9 J8 j6 Q/ m" e}
; h7 f5 H7 }- c. [/********PWM初始化函数********/) h0 ^' j: M' w/ Y2 f
void PWM_Init()
# Z: A  p9 m6 e+ n3 T" g{
) M3 t- W0 o+ p        PR2=249;           //脉宽调制波形的周期为1000us       
; |5 _1 C7 e% X2 ]% r. P9 v        CCP2CON=0x0C;      //CCP2模块工作在PWM模式,占空因数的低两位为00
& a3 D' H1 T3 E% J% L! B3 G        T2CON=0x02;        //禁止TMR2,且前后分频值为16,同时开始输出PWM
, N3 M3 N: e1 J) E4 Q' \2 I7 L        CCPR2L=0xB8;       //脉宽调制波形的占空比初始值
* O! g. ?4 D# d% o* K}
/ `* g; g1 Z6 Q/********键盘扫描函数*******    */
/ ~3 C- d7 {3 svoid keyscan()) T6 X! v3 ]  Z0 w0 Z! \$ I
{# R0 Z( N/ k/ ?* N5 m$ v, W
        if(RB1==0)                  //如果是RB1键按下4 k# p. q! Y5 g
        {, P% h# _1 l0 c
                delay_ms(5);              //延时去抖4 d: X+ j5 P3 b! i! R
                if(RB1==0)              //确认是否有键按下9 T* ?1 W7 E9 W% B0 j' \- B
                {
8 M  E' F1 f2 Z8 c9 q                        while(!RB1);        //等待按键释放
. g  \, j$ b. Z                        CCP2CON=0x0C;9 P5 }" n" P6 x1 q/ ^$ l4 d
                        CCPR2L=0xB8;                   //80%占空比; ]+ j+ b( H0 R$ k( p9 S9 H/ P
                        TMR2ON=1;' a) }7 l! s% C. t4 k/ o- m# X) `
                }/ V4 K! a  z- v% q( |1 s: R9 Q# }- S
        }
. E7 l+ K$ @' n) ~        if(RB2==0)                  //如果是RB2键按下
9 r5 z' w4 ?' t$ I        {1 j+ M9 `3 V; D* u
                delay_ms(5);              //延时去抖
1 d" q& j; D. j% h+ B1 I8 k                if(RB2==0)              //确认是否有键按下
# @0 {5 {; S' D* P: S, y                {
3 [* M$ g, U/ V3 ^* U9 y                        while(!RB2);        //等待按键释放, N2 \! ]7 }- x; ]* h9 C2 ~* N
                        CCP2CON=0x0C;" @5 D* @1 s5 r. b: Q- Y
                        CCPR2L=0x96;                   //60%占空比# ~( \# r8 o7 m" z- U$ O
                        TMR2ON=1;8 c! D# ^/ A& m
                }7 Q, W' K' S5 O3 Y( e/ q
        }, C% h! k( ~7 T+ x" |9 y, g7 t
        if(RB0==0)                  //如果是RB0键按下
" c4 E* Z1 r! g/ E  J0 l        {5 c8 h5 S2 E1 i7 c- t
                delay_ms(5);              //延时去抖: T9 U' o, Q, S( u, S6 L
                if(RB0==0)              //确认是否有键按下% J) ]% q, x' `6 I- j5 F
                {3 {  R/ }0 A6 O% Q
                        while(!RB0);        //等待按键释放# f, X7 G' o4 W9 `: Z  S' Q
                        CCP2CON=0x00;                   //关PWM1 O% k+ @& ^0 t/ F
                        TMR2ON=0;                        //禁止TMR23 m3 y$ t' w9 E2 ]
                        //delay_ms(5);$ [+ I. G9 W6 }; C- z; y
                        RC1=0;
- F  X' T, Q" l) P4 y- A  i' m" ?                }
. Z5 `$ N2 G; c* `8 b3 a, n        }2 b& U4 c0 G4 O" p3 n1 e! k
}, j+ E; v* W! d! y1 c$ Z
/********主函数********/
/ g; w5 {/ J; {1 D. h0 Ovoid main()7 ]/ s. d$ f, g4 L
{
; J8 ]  k% Q! s        init();                     //系统初始化2 r" {7 X$ r6 o0 V/ C
        PWM_Init();                 //脉冲宽度初始化' y9 B. a% L8 M4 e
        while(1)
) X4 L6 V: Q4 t* Q        {
- W7 u/ I5 p3 o( S                keyscan();              //调用按键扫描处理脉宽因数
5 k9 q) z) @! \  a" U' I2 s  A, Z        }* {! l* ^. s* J) G! \
}
发表于 2018-11-6 07:38:09 | 显示全部楼层
单片机常用问题吗?
 楼主| 发表于 2018-11-6 14:45:37 | 显示全部楼层
远祥 发表于 2018-11-6 07:38
" f! |4 z5 f6 A7 k$ b单片机常用问题吗?

! H& D( o* n7 f8 u2 {  z6 D这个是用PIC单片机产生PWM波,应该比较常见吧
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

GMT+8, 2025-6-24 21:22 , Processed in 0.080993 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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