找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 3345|回复: 3

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

[复制链接]
发表于 2018-11-5 20:08:17 | 显示全部楼层 |阅读模式
本帖最后由 冯喆喆 于 2018-11-5 20:11 编辑 8 p. k  Y# R6 W: O9 M( X
- @1 y; y4 @! X
用PIC16F887单片机产生方波,当我把方波频率设为4KHz时波形是正常的,当我改变TIMER2的分频值,从4改为16 ,此时频率应该变为1KHz,此时频率是对了,可是波形却变得很奇怪。  求有经验的大神指导下
3 g+ a) b& f4 w6 [6 d7 Q, ^这是产生的4KHZ正常波形,占空比为50%
, I4 H& G5 q% F7 {+ J/ x2 E& s  t* J% u$ P" p% A9 i% |
微信图片_20181105201023.jpg
: x  ?- P/ n& R. \- i) Z* `$ X( s$ y, J4 T7 g  G* j9 a- ~
这是1KHZ有问题的波形,占空比为60%
3 c/ ]0 R) i3 e8 E" F* t* z 微信图片_20181105201034.jpg $ j9 E- f' X1 f' k, g. A1 H
8 q4 E) v' |4 Y$ L
回复

使用道具 举报

 楼主| 发表于 2018-11-5 20:14:34 | 显示全部楼层
主要的程序我也贴上来各位看一下
, t/ z- ~, G1 c  z# R6 L9 Z4 _" i$ J$ p# `  x* S
/********端口初始化函数********/+ e  j/ {' d6 u" W7 I& ^7 r
void init()
9 {% w9 d1 }3 |  c! p! h7 \{5 u( b- {; }  I
        ANSELH=0x00;                     //设置B口为数字I/O口
: D+ n1 R" `& b, |9 U        OPTION_REG=0x00;
9 E$ o5 m. t# C+ U6 f        WPUB=0xFF;         //设置B口弱上拉
$ d/ `0 B8 u2 b. `        INTCON=0x00;       //关总中断: M+ k6 F! X/ y# d, c6 \
        PIE1=0;            //PIE1的中断禁止
+ b0 h" P" N( j; E) A        PIE2=0;            //PIE2的中断禁止1 W; E/ k4 ]+ ~% x
        TRISB0=1;* y( ]' F9 h$ Q! n
        TRISB1=1;          //将RB1设置为输入口,按按键
0 U. f' @  o8 C$ Z        TRISB2=1;          //将RB2设置为输入口,按按键1 H2 c2 L4 K: I7 B. p
        TRISB3=1;
- r. h/ ?$ S" _, _& r4 w2 S        TRISB4=1;
5 }; j& r/ t( {3 b" i( b! ~( f        RC1=0;
6 i6 ^6 i0 ?+ S9 v. `, h        TRISC1=0;          //脉宽调制输出引脚,设置为输出# g" Y% F8 D' E& a% `
}  a' P* Z" i5 g$ a1 a
/********PWM初始化函数********/; R) E3 c& w4 t% Q2 z! I
void PWM_Init()
: O0 g5 c! m3 x0 J: n8 s{0 F3 s' I. r/ a3 a  f
        PR2=249;           //脉宽调制波形的周期为1000us        . j/ V' L" z' O: Z% U
        CCP2CON=0x0C;      //CCP2模块工作在PWM模式,占空因数的低两位为00& b6 L, l( f# X; m) M. }; K
        T2CON=0x02;        //禁止TMR2,且前后分频值为16,同时开始输出PWM  B) I6 v$ \# j+ h/ G
        CCPR2L=0xB8;       //脉宽调制波形的占空比初始值
9 Q* Q- J! w# @1 G}! u* h: Q" D: K# M
/********键盘扫描函数*******    */
0 q. m3 n% \% e6 B: H" {5 \9 R/ k2 xvoid keyscan()6 l0 z$ t* |, T3 f  n8 v, [
{
* O4 V. o  c1 n1 x+ J0 X* k5 |        if(RB1==0)                  //如果是RB1键按下+ H3 ~* `1 e5 z$ q8 }: K2 d
        {. W+ O  j9 u: V4 D9 ^
                delay_ms(5);              //延时去抖
/ z2 a# z1 q& H& k4 {                if(RB1==0)              //确认是否有键按下+ @( N3 s, i  Y* j. c
                {
/ f  V# j2 o) N& S3 w! B  n" Z, a                        while(!RB1);        //等待按键释放: O. F8 e9 g1 M+ ]0 j
                        CCP2CON=0x0C;
/ d1 x+ a) q) t6 S1 ~1 ]                        CCPR2L=0xB8;                   //80%占空比8 m8 v) v# X8 j- b% \+ T2 Z
                        TMR2ON=1;: S' L8 q) K4 U2 e: u
                }
% r* @* r1 R/ m4 _: s9 r$ W; I/ G        }) c3 S* N( E  J
        if(RB2==0)                  //如果是RB2键按下
7 ~% ~) j2 _7 F        {
- o  ?1 \1 Z2 H8 {                delay_ms(5);              //延时去抖
+ s( ?3 o1 t# B, D# F1 G                if(RB2==0)              //确认是否有键按下4 x( v* d& q+ H! D5 l9 l
                {, W( Q) w1 w  O( f8 J1 W
                        while(!RB2);        //等待按键释放0 b5 R" }$ l" Z- s
                        CCP2CON=0x0C;
; ^& _  i. n; d8 r7 j2 Q- g9 N0 N                        CCPR2L=0x96;                   //60%占空比( K/ Y) {7 m+ N7 f! n' ?
                        TMR2ON=1;! j2 i: K: M' x; Y, T+ Y
                }3 D% p( K9 {% K" b0 [$ b( s. _7 j
        }
# x5 i8 e) f( C  _* p' l) Z+ ], a        if(RB0==0)                  //如果是RB0键按下
8 _) q; r) X* ?, R1 T4 r! s        {
% [! Z. |$ O- q0 C/ j0 N: g                delay_ms(5);              //延时去抖6 N7 [  L8 a' X, ~7 [6 l
                if(RB0==0)              //确认是否有键按下& d  s0 x- p. w/ L6 K) E% n% J9 {! x1 h
                {, N# h# B5 T3 o
                        while(!RB0);        //等待按键释放* a/ G; [2 W' t& J
                        CCP2CON=0x00;                   //关PWM- W0 x# g/ c' h
                        TMR2ON=0;                        //禁止TMR2
: F+ }( W' A5 {                        //delay_ms(5);* W) C/ [' y/ ^/ e" X( C
                        RC1=0;, ]' o3 v# T9 k3 Y3 X: [: {0 K- K
                }
! V% A# E" j1 @2 a        }
5 I) q: Y: ~+ u' G; s+ b6 N}6 G4 n; i+ m9 C% l- B/ u7 i
/********主函数********/
  N$ @/ k4 z, `% x. ~0 M3 }void main()3 C' W1 k* o, A. \* {
{
0 h! \' H2 t9 \# a, h: @        init();                     //系统初始化- K. L* O7 ]9 S5 [# \$ P8 H
        PWM_Init();                 //脉冲宽度初始化6 S; d, X, o8 U2 N
        while(1)! [; f' l( W. v+ u- q5 v
        {; v: N) F# \( x2 |# e' g/ Y' j
                keyscan();              //调用按键扫描处理脉宽因数: ^& Z. T' g  ]0 r# b$ y; C
        }/ z3 R+ `, Y$ ?  e# H! J7 `
}
发表于 2018-11-6 07:38:09 | 显示全部楼层
单片机常用问题吗?
 楼主| 发表于 2018-11-6 14:45:37 | 显示全部楼层
远祥 发表于 2018-11-6 07:389 e5 w5 x+ L- a" k) o2 J
单片机常用问题吗?

0 V1 e0 D9 P- }: ?7 Q/ T7 C3 e这个是用PIC单片机产生PWM波,应该比较常见吧
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

GMT+8, 2025-8-19 06:09 , Processed in 0.062029 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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