机械社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 3053|回复: 3

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

[复制链接]
发表于 2018-11-5 20:08:17 | 显示全部楼层 |阅读模式
本帖最后由 冯喆喆 于 2018-11-5 20:11 编辑 + `+ T' g/ {( m7 n+ B. M

0 h' i8 p4 K. u5 B+ N* o用PIC16F887单片机产生方波,当我把方波频率设为4KHz时波形是正常的,当我改变TIMER2的分频值,从4改为16 ,此时频率应该变为1KHz,此时频率是对了,可是波形却变得很奇怪。  求有经验的大神指导下
9 K) D3 G/ v# U$ I% N这是产生的4KHZ正常波形,占空比为50%
6 @/ r) t6 D/ j' m+ G! l6 G$ |9 n6 e$ G% I) u! a
微信图片_20181105201023.jpg
1 Z  Q0 v' O) Z2 X3 \; B* C4 z& T% i  F% Q
这是1KHZ有问题的波形,占空比为60%% e+ @( B' W4 P; T9 U
微信图片_20181105201034.jpg & X: A( ^# w( ]. X, G6 B
* W6 \1 m5 w7 F( D9 I3 M1 T
回复

使用道具 举报

 楼主| 发表于 2018-11-5 20:14:34 | 显示全部楼层
主要的程序我也贴上来各位看一下: L6 x: ]4 n1 V
$ a6 v7 Y8 ~4 T3 d9 @2 c9 W
/********端口初始化函数********/
2 h( a8 v$ a7 _& {void init()' W: s" a' u& b; c
{' a$ r0 l5 O' g$ r9 Z
        ANSELH=0x00;                     //设置B口为数字I/O口4 @, \7 ~/ [  w/ ^2 U
        OPTION_REG=0x00;
3 y' O7 r8 Y: p2 W6 L% m        WPUB=0xFF;         //设置B口弱上拉+ a- O. w3 s: D: S0 S5 A
        INTCON=0x00;       //关总中断: g% Y+ K- N& `( `: m' K9 z) u
        PIE1=0;            //PIE1的中断禁止* c2 E. X# Z( w2 \8 T0 ?1 a
        PIE2=0;            //PIE2的中断禁止% s2 n3 `. M5 X7 N; a4 I5 n- Q
        TRISB0=1;' Z- J: L& ?$ R! G* g4 d
        TRISB1=1;          //将RB1设置为输入口,按按键
. f2 Z1 x9 U0 n  n$ j& E* S. V        TRISB2=1;          //将RB2设置为输入口,按按键
! w* v2 U! }! ]% @! V        TRISB3=1;2 X. g$ N3 e  O! x
        TRISB4=1;1 I7 g) g- G" `; o7 g6 B9 m9 b
        RC1=0;) F/ W7 r5 l- N, r) @+ Z2 n% B
        TRISC1=0;          //脉宽调制输出引脚,设置为输出
9 U8 A' Y! H) v" O$ V}8 S) [) `- M% P# }5 D4 C3 T
/********PWM初始化函数********/5 C5 C) c4 s5 G% E& F* ~! ~
void PWM_Init()
7 L1 w, G! v2 [& O0 Y# t" B{6 ?4 B( s5 d. p5 i9 `
        PR2=249;           //脉宽调制波形的周期为1000us       
! p3 H" L7 \; Y; l! T- r) N        CCP2CON=0x0C;      //CCP2模块工作在PWM模式,占空因数的低两位为00
" A3 i; [, v0 o/ i" `& _  s( Q        T2CON=0x02;        //禁止TMR2,且前后分频值为16,同时开始输出PWM+ s3 C3 z6 g$ B- s& }' v( z
        CCPR2L=0xB8;       //脉宽调制波形的占空比初始值+ `' i, m8 \/ q2 N
}' i& O7 i$ n5 u6 N
/********键盘扫描函数*******    */
: G7 a" K. x5 {! k8 m) F6 |* O1 kvoid keyscan()
. n* A8 B8 g4 p{3 r% O' [- ^' w- Y5 P) v+ D
        if(RB1==0)                  //如果是RB1键按下3 a7 _# v, P: Q! Y
        {
, R6 T& B# X# E3 G, z( a- J                delay_ms(5);              //延时去抖
6 P1 F& j9 t2 Z9 J                if(RB1==0)              //确认是否有键按下& i, @* x+ U' L, T
                {
6 g# S; O1 J0 K6 b5 x+ d9 S) O4 F% c                        while(!RB1);        //等待按键释放
/ T$ v( ~# `: d" v- u                        CCP2CON=0x0C;
+ w" n& X8 ~# a0 @- `: `" c/ I: v9 ^$ }                        CCPR2L=0xB8;                   //80%占空比- W- p+ {: e0 |8 S4 ?$ Z
                        TMR2ON=1;" R, O8 _" V3 B6 Z/ c! ^
                }+ N9 o5 j. n$ {: U- x
        }: F2 j' d3 H  Y4 O0 b8 b0 f
        if(RB2==0)                  //如果是RB2键按下
+ y) v. B4 r7 `        {) W7 e7 z, c3 Q8 w9 X
                delay_ms(5);              //延时去抖/ n! t. V( ~* u7 T
                if(RB2==0)              //确认是否有键按下1 _/ M- D" v( v8 e" g% Q
                {: q4 ~! |/ s1 x2 A  }, r
                        while(!RB2);        //等待按键释放" C" j  A  Z0 S, i. S
                        CCP2CON=0x0C;
4 M( f  c) s0 D" z+ O$ o* Q! _  o( f; }7 l                        CCPR2L=0x96;                   //60%占空比
) |4 j: M9 R% L: l% T                        TMR2ON=1;* H$ z& r6 S9 E( C" ?+ a: t9 u8 w
                }
. [4 M# m( r+ `( G  y        }* T) e; T7 w6 V5 j7 X4 q" A
        if(RB0==0)                  //如果是RB0键按下! Y7 F. G" X% n+ s6 |
        {
, D  h6 e' ]( ]2 L8 I* R( n0 t                delay_ms(5);              //延时去抖# o: d5 N) i# Y* a" _
                if(RB0==0)              //确认是否有键按下
4 T1 f6 w/ d: Z2 s                {% a* E, `; r: ?, a+ C. W
                        while(!RB0);        //等待按键释放
) V9 r5 k/ I; d' g7 x: A                        CCP2CON=0x00;                   //关PWM" x7 C) W8 X( i" t
                        TMR2ON=0;                        //禁止TMR2
; n4 c9 a/ B) ^( f: M                        //delay_ms(5);5 O  p' y1 B! p. C: p/ s4 l
                        RC1=0;. c0 V- X( S$ B- l. V8 ?
                }7 C3 d' P; |9 i5 _
        }( H! B/ ^# D6 {# c& R7 Y! @
}. z8 N6 X1 B5 C4 Z( u
/********主函数********/
* B& ?- M! R( {2 |  p- svoid main()( L: U8 j5 p! T5 L6 `' s
{, b6 Z# J: g( s0 O% {  K6 P9 X3 _$ K
        init();                     //系统初始化
7 u% m( K+ Y. [6 y1 |! W        PWM_Init();                 //脉冲宽度初始化8 m0 G# d8 |% a; ?3 X5 l) I
        while(1)( }! l$ ~" V' O0 D
        {. Q! o3 Z( E6 X2 a: X8 Z% f7 C
                keyscan();              //调用按键扫描处理脉宽因数0 y% g7 j( r4 u' c6 j7 i& g7 u! d. A1 U
        }
$ T" X& _( w7 V% u" `  _: R# M9 L9 N}
回复 支持 反对

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2018-11-6 14:45:37 | 显示全部楼层
远祥 发表于 2018-11-6 07:38" e, `- b' v" x% l0 G5 D% l
单片机常用问题吗?
4 @* d& r, c. Z* d
这个是用PIC单片机产生PWM波,应该比较常见吧
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-2-23 19:53 , Processed in 0.064125 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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