机械必威体育网址

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 2794|回复: 3
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
1#
发表于 2018-11-5 20:08:17 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 冯喆喆 于 2018-11-5 20:11 编辑 " J/ T4 w+ @! D) J" ?* V7 @  F1 N

7 s& s- d& S* _4 e用PIC16F887单片机产生方波,当我把方波频率设为4KHz时波形是正常的,当我改变TIMER2的分频值,从4改为16 ,此时频率应该变为1KHz,此时频率是对了,可是波形却变得很奇怪。  求有经验的大神指导下0 k2 |, |4 |+ a" A( J' F1 r
这是产生的4KHZ正常波形,占空比为50%
% h# J7 A" h1 H: j: W8 ]0 _& S2 b3 c$ x
5 R2 f: ?0 R7 W# T8 d  A# d
3 I9 l# Y% o9 _" T* W4 K
这是1KHZ有问题的波形,占空比为60%( M% w6 n: j, L* C* J

$ g+ K4 l+ J( x
& B' [2 b3 d! o: ]' n
回复

使用道具 举报

2#
 楼主| 发表于 2018-11-5 20:14:34 | 只看该作者
主要的程序我也贴上来各位看一下6 F3 A0 z! ^% J& g) F3 `$ i! v

4 Z6 {) m4 e, p' o/********端口初始化函数********/) ~4 z9 J) i. U
void init()# _3 f3 @. r0 M  i1 h3 L
{5 q& p/ [% ~9 _. X& f
        ANSELH=0x00;                     //设置B口为数字I/O口( h7 n- z* K' D6 i7 f
        OPTION_REG=0x00;6 y: X3 e7 C/ B1 O9 o
        WPUB=0xFF;         //设置B口弱上拉
0 d# p, H/ ^5 b/ [; B        INTCON=0x00;       //关总中断: {0 y5 K3 G; F, G3 n" x, u
        PIE1=0;            //PIE1的中断禁止; k& }! z5 P3 J# v) s' y% |
        PIE2=0;            //PIE2的中断禁止: ]" v9 Q! F  G" }
        TRISB0=1;' C6 a$ H0 |1 d5 o
        TRISB1=1;          //将RB1设置为输入口,按按键
% b+ z7 R, P( V) x) b        TRISB2=1;          //将RB2设置为输入口,按按键' g1 z  d7 s# P7 ^0 b3 N- S
        TRISB3=1;- c0 I9 A* Z$ z- K' x+ j$ k
        TRISB4=1;
* \- c, z1 ]5 G) h2 J        RC1=0;
8 b' k2 J( \( L        TRISC1=0;          //脉宽调制输出引脚,设置为输出1 F, Q3 o& l! G% `0 V+ T
}
7 p8 ^  c! O. @" ^. {. n/********PWM初始化函数********/. I" ~6 O8 ^5 \/ I
void PWM_Init()
4 S7 G* \/ T0 Z0 [$ c{5 [! i# g1 K& T9 o3 w
        PR2=249;           //脉宽调制波形的周期为1000us        4 \8 I+ m. c2 l. L7 A" U
        CCP2CON=0x0C;      //CCP2模块工作在PWM模式,占空因数的低两位为00
' P" ?9 d% Q, }; ]9 q& L9 l! a0 [        T2CON=0x02;        //禁止TMR2,且前后分频值为16,同时开始输出PWM
2 O! x# I/ M+ [9 x        CCPR2L=0xB8;       //脉宽调制波形的占空比初始值
2 i+ T7 R" {% D1 {3 `}+ N# z# v  l- r, E: A
/********键盘扫描函数*******    */
+ k+ i% P: r% w3 X! G' _2 evoid keyscan()7 m# [  w: V- O" e& v
{8 I& h8 l0 A, L8 ?, K+ Z4 Y
        if(RB1==0)                  //如果是RB1键按下( r' w6 R+ {' Z* M* ^
        {
0 W5 h: ?; B. J0 t0 e5 v0 t                delay_ms(5);              //延时去抖
. f: z# t+ x! Q. o$ q& @) X( q                if(RB1==0)              //确认是否有键按下
2 P/ ]7 V- w$ F0 _                {) R2 J% I" }# ?* K1 {
                        while(!RB1);        //等待按键释放
/ \# s- g1 r4 T& k6 s6 d                        CCP2CON=0x0C;
. C9 N9 u" E0 x  o% [$ z                        CCPR2L=0xB8;                   //80%占空比7 \7 I) k& H$ p8 r- }
                        TMR2ON=1;! f- o. D4 u7 H# v# G4 h
                }
% \6 I: {5 {4 F, q3 X' y        }
! M( {' |6 l7 I" P. u        if(RB2==0)                  //如果是RB2键按下* h+ z# X* E9 L" r4 V3 p# T
        {- q8 r2 g+ @9 F5 G
                delay_ms(5);              //延时去抖  q4 m; Z, z) Y
                if(RB2==0)              //确认是否有键按下0 [; l# r0 A+ P: l" }/ n; t0 }
                {3 W1 \' @: H. ^9 z: G7 h& O6 a
                        while(!RB2);        //等待按键释放% D4 e+ o$ ~. @- r6 Z
                        CCP2CON=0x0C;
+ K/ y& X3 [+ e7 n& @                        CCPR2L=0x96;                   //60%占空比& X; W" b: k+ i" J/ M
                        TMR2ON=1;
# f4 U: Y- |* e! h7 I                }
' L# p4 T" w! b5 r4 b# `        }9 F0 x) q& r) C- R0 p; d
        if(RB0==0)                  //如果是RB0键按下" O  R, t- u7 w
        {3 K4 J6 F  A6 N% e
                delay_ms(5);              //延时去抖. \6 q8 ~: v% K2 N& k) X" a, w5 z
                if(RB0==0)              //确认是否有键按下
) _) m6 R( Y& v( A1 \9 E                {
5 P9 _" W, `3 Q                        while(!RB0);        //等待按键释放% r2 |( J2 F0 n
                        CCP2CON=0x00;                   //关PWM6 l6 x8 i/ I& k: Y" a0 [4 ?
                        TMR2ON=0;                        //禁止TMR2; e/ L3 L2 ~" b0 V$ Z/ I2 A* v, d/ [' b
                        //delay_ms(5);( o- K: [! ?' b0 R( P0 M7 k" x" N, y
                        RC1=0;
7 Z2 M) Y1 |. U: D0 y/ ]                }9 ]2 }/ k9 i0 v4 l1 E( a2 Z3 b
        }4 l' Q+ U% l$ x; d. V
}, t, y6 i5 i; i1 S  `2 r
/********主函数********/5 d6 A, q( p( X# D
void main()
/ V3 @7 ?( D7 `; }4 p- E* Y; H5 w{
* E: P' \) _6 d+ D3 N  q) Y. F        init();                     //系统初始化
1 `$ T) Q8 O  g1 C        PWM_Init();                 //脉冲宽度初始化+ t+ t2 Q0 `/ c
        while(1)
. C/ y6 `* _5 V$ s& [0 \" H- Y        {1 T1 y/ L; s" a+ [  j4 m1 D
                keyscan();              //调用按键扫描处理脉宽因数5 t7 ~( C9 j  [3 e4 B) ~6 T
        }6 P( b' `6 y0 S8 F" U% M
}
回复 支持 反对

使用道具 举报

3#
发表于 2018-11-6 07:38:09 | 只看该作者
单片机常用问题吗?
回复 支持 反对

使用道具 举报

4#
 楼主| 发表于 2018-11-6 14:45:37 | 只看该作者
远祥 发表于 2018-11-6 07:38) m, b5 Z; n6 e3 j- T! F
单片机常用问题吗?

1 y4 w% b6 \9 D, E2 ^这个是用PIC单片机产生PWM波,应该比较常见吧
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|机械必威体育网址 ( 京ICP备10217105号-1,京ICP证050210号,浙公网安备33038202004372号 )

GMT+8, 2024-10-10 10:24 , Processed in 0.056325 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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