找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 3355|回复: 3

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

[复制链接]
发表于 2018-11-5 20:08:17 | 显示全部楼层 |阅读模式
本帖最后由 冯喆喆 于 2018-11-5 20:11 编辑 & O0 t' d+ v2 M

" e0 F7 J" s% g: b用PIC16F887单片机产生方波,当我把方波频率设为4KHz时波形是正常的,当我改变TIMER2的分频值,从4改为16 ,此时频率应该变为1KHz,此时频率是对了,可是波形却变得很奇怪。  求有经验的大神指导下
+ R$ ~6 j' `2 f" q6 T, a9 L6 l这是产生的4KHZ正常波形,占空比为50%
* J6 d3 H% M* M; {& e1 B( i* I6 g) j5 y2 z# Y
微信图片_20181105201023.jpg " j  b2 S8 q+ \- Z

. _% ~& o, `; ?7 G, r# f5 O2 q这是1KHZ有问题的波形,占空比为60%; w0 j$ M$ O+ D! _
微信图片_20181105201034.jpg % Y' H5 z' p. v' ~0 y$ }: U& I- L

; K, r0 }8 W$ }) [
回复

使用道具 举报

 楼主| 发表于 2018-11-5 20:14:34 | 显示全部楼层
主要的程序我也贴上来各位看一下0 T' Q- k/ J, }! e. K
$ q& s) t2 S4 E; {- e
/********端口初始化函数********/! R" u& q/ V+ f2 b/ U9 s
void init()- A2 w8 P, C3 J# B( n1 U: v
{' s7 q+ p5 c. i0 j  Y0 R
        ANSELH=0x00;                     //设置B口为数字I/O口
/ ~4 n! W. D$ k; q( ^# ?        OPTION_REG=0x00;
( N& @( L- B$ l7 r8 C% K* c        WPUB=0xFF;         //设置B口弱上拉
2 o  A4 b, N7 ]! [7 k* O        INTCON=0x00;       //关总中断% l, W4 y* [3 k8 M, n: l
        PIE1=0;            //PIE1的中断禁止
" Q& Y+ E1 R0 W9 G$ b3 q! D* u        PIE2=0;            //PIE2的中断禁止
' a* a+ \0 V" o        TRISB0=1;
6 E7 P2 P/ r" _5 o7 f        TRISB1=1;          //将RB1设置为输入口,按按键
! i/ W( b3 j% P$ y7 o        TRISB2=1;          //将RB2设置为输入口,按按键
+ [1 z3 v1 [4 k        TRISB3=1;8 H& S" U7 v0 i8 Q
        TRISB4=1;
2 p" V' a  h  S4 Q6 |3 L% v, G9 g3 H        RC1=0;
) l6 F  i, M0 q7 s        TRISC1=0;          //脉宽调制输出引脚,设置为输出
' j# j9 v6 z8 a, _8 S$ d& r}0 B; k) f8 D, [
/********PWM初始化函数********/
/ S: j$ l( L9 b! U# Lvoid PWM_Init()
( h4 g1 ]* T' L. n3 ]# E{
+ _# j% S$ o' W( ^& O+ u+ r        PR2=249;           //脉宽调制波形的周期为1000us       
* X' h0 Z+ \3 S8 e, z8 b  ?$ W, C        CCP2CON=0x0C;      //CCP2模块工作在PWM模式,占空因数的低两位为00* \% G" |: S5 ]" {# d, u
        T2CON=0x02;        //禁止TMR2,且前后分频值为16,同时开始输出PWM
5 M* {2 u) [; d! ~' [. {6 w8 E0 A        CCPR2L=0xB8;       //脉宽调制波形的占空比初始值5 r' o) D/ O- J, X$ U; U! P5 g
}0 D" |3 W$ P8 F5 g/ w+ ^8 Y
/********键盘扫描函数*******    */
) T9 n; d& K/ |3 z  r9 A1 g+ ivoid keyscan()
  L* Y4 G. S; t+ D{# h# ^9 p( k# R& Q# {; B
        if(RB1==0)                  //如果是RB1键按下0 Z2 B' p; a% N+ h, E8 t' \6 l
        {3 v6 C/ T  Y! O+ @
                delay_ms(5);              //延时去抖
. n+ \4 Q4 a) Z7 I                if(RB1==0)              //确认是否有键按下' \  `% \0 j5 J
                {1 N. x3 A4 I) ]' l! ~+ s& Z2 @3 T5 ~
                        while(!RB1);        //等待按键释放# r" g" @2 k0 f6 ~% j6 S/ `
                        CCP2CON=0x0C;
9 d$ L, E6 {- S9 v0 p$ ^. Y                        CCPR2L=0xB8;                   //80%占空比
, B- d+ ]: _; i9 y                        TMR2ON=1;- c6 R1 N7 b  T
                }6 O" i2 V% H, m, ^
        }
$ X' s$ q& ?4 ?, M  S, `7 b% T        if(RB2==0)                  //如果是RB2键按下
7 [' y. l7 _% j  N) y        {1 N. X' X% w% P4 `; _! A# q% J3 L* p
                delay_ms(5);              //延时去抖% E( W' U- o* R% D4 Y4 f, N/ m) [
                if(RB2==0)              //确认是否有键按下
+ S3 d9 _0 g/ o/ @                {
$ b! _6 r, I2 K, W" D' ^+ f                        while(!RB2);        //等待按键释放
& L( t% J& A$ s+ ^8 f                        CCP2CON=0x0C;
5 P! U2 l/ K- M7 C                        CCPR2L=0x96;                   //60%占空比, J  c: D. R# y$ y" g- ]6 T) T
                        TMR2ON=1;$ a/ W: h+ K2 O/ z% ^$ ~. ~1 ?; @6 T
                }
/ S4 V6 j& i0 D0 {2 w, x8 o        }
8 z% p" j. M' e. T" d/ r8 F# J        if(RB0==0)                  //如果是RB0键按下( t7 v$ h, Z* ^# N3 q
        {
# e  B6 K! g/ U! a. K9 m                delay_ms(5);              //延时去抖
6 W' M0 P4 Y) |( ]2 f$ }                if(RB0==0)              //确认是否有键按下
2 O- {8 J* y8 F7 U; p                {
0 _: I  E7 s$ L- B" ~                        while(!RB0);        //等待按键释放8 \5 w% L7 i9 @" \3 R
                        CCP2CON=0x00;                   //关PWM
9 m- |+ {  j4 k" @                        TMR2ON=0;                        //禁止TMR29 e8 H; l& n9 h1 c7 f  m) A
                        //delay_ms(5);
) |- J4 j- e# l$ x6 v' p; W                        RC1=0;: Z7 m& |' x& @
                }) p" `( P# S/ L+ A8 J* o: ]; `
        }
9 G: s' y2 B6 L7 g! Q. b. {4 y2 C}& G, }. m% P0 r  ^$ B7 _  I' H" J
/********主函数********/' t9 _8 z* ^6 N/ A3 W! ?
void main()3 S1 ?/ I8 J# U. W5 Q5 E
{$ y( W9 R& v1 W1 A( Y' t
        init();                     //系统初始化& a3 S' C/ Q9 U% _
        PWM_Init();                 //脉冲宽度初始化
+ m. S7 b0 q& S        while(1)
0 P7 n+ ?% a5 ?/ p# I        {2 u- I$ q! ]& S! o# F. K/ v& N* H
                keyscan();              //调用按键扫描处理脉宽因数1 I4 ]+ b) ?# P. F& d3 U: U) f
        }
8 d' x4 [# o& Z3 D1 `}
发表于 2018-11-6 07:38:09 | 显示全部楼层
单片机常用问题吗?
 楼主| 发表于 2018-11-6 14:45:37 | 显示全部楼层
远祥 发表于 2018-11-6 07:38& c& t1 i' ]3 A" w
单片机常用问题吗?

% y. x, L. V5 \这个是用PIC单片机产生PWM波,应该比较常见吧
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

GMT+8, 2025-8-23 13:06 , Processed in 0.104680 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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