机械必威体育网址

 找回密码
 注册会员

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
1#
发表于 2018-11-5 20:08:17 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 冯喆喆 于 2018-11-5 20:11 编辑
6 o; u: l/ v& x7 T. M% _; {0 U+ N+ U% o; ~6 ?
用PIC16F887单片机产生方波,当我把方波频率设为4KHz时波形是正常的,当我改变TIMER2的分频值,从4改为16 ,此时频率应该变为1KHz,此时频率是对了,可是波形却变得很奇怪。  求有经验的大神指导下
3 F+ S0 r; M& V" @这是产生的4KHZ正常波形,占空比为50%
6 Q5 {' G. s) `. R! e" Z3 V, i. i4 z9 h/ g

" R- [' H. S3 x! g/ \& F3 }2 k3 ]- l5 Y% @2 J( h
这是1KHZ有问题的波形,占空比为60%
7 A5 a5 r" [8 J  _ 9 ]2 d2 k7 \% n2 U; e
) B1 J& U/ G9 c" g& E
回复

使用道具 举报

2#
 楼主| 发表于 2018-11-5 20:14:34 | 只看该作者
主要的程序我也贴上来各位看一下
( ]4 H6 K0 s- h4 ]& V% ]4 d8 i  u3 p: B; R# U
/********端口初始化函数********/
: y) s- S# t( T+ evoid init()
& S2 d: e) Y' K) w  A1 z' T* W{8 w- v- J( P' i
        ANSELH=0x00;                     //设置B口为数字I/O口5 \! f3 b3 t; j) _& }8 Z
        OPTION_REG=0x00;
$ ^# p# ]  C# z5 L! s; I        WPUB=0xFF;         //设置B口弱上拉" x5 z' V/ F9 o4 e: }, ?9 _2 N! J
        INTCON=0x00;       //关总中断4 Q' \3 y& u5 f* b9 j/ g% k' K
        PIE1=0;            //PIE1的中断禁止
' ?( u* d! h  W9 j        PIE2=0;            //PIE2的中断禁止
8 ^& \$ [4 p3 K2 a* |        TRISB0=1;
( M- y! F# n6 D% q        TRISB1=1;          //将RB1设置为输入口,按按键
* y% T7 H9 W; l3 i) \6 S' s        TRISB2=1;          //将RB2设置为输入口,按按键& k! B- r2 H& w2 P
        TRISB3=1;
( g- \" {* k1 }% E        TRISB4=1;4 ^& P4 L/ G) I( X3 b9 Z( D5 a) m
        RC1=0;
1 b* T0 m: @; \- z2 |# m* I        TRISC1=0;          //脉宽调制输出引脚,设置为输出0 F' {' J0 }$ ^  S, U$ t- v! ~
}
2 C$ J3 k8 i* E0 F" D/********PWM初始化函数********/# U- \1 G9 a- \3 S! J3 _
void PWM_Init(), }+ u4 I/ t9 s: k
{
7 y( O: Z: E8 d, \        PR2=249;           //脉宽调制波形的周期为1000us       
* W& S5 J4 D/ \. l        CCP2CON=0x0C;      //CCP2模块工作在PWM模式,占空因数的低两位为00/ q! @* l. ]. d8 w7 M
        T2CON=0x02;        //禁止TMR2,且前后分频值为16,同时开始输出PWM- \! w6 M3 P0 l! f
        CCPR2L=0xB8;       //脉宽调制波形的占空比初始值% ~9 d5 h2 A/ l. O; X5 U3 h2 f7 _
}) t; M, U2 G' J5 `
/********键盘扫描函数*******    */9 }8 g3 h* L' d$ h
void keyscan()3 S4 \* J1 v# G8 X& v
{
# _7 r+ _; X( V3 }) h8 w        if(RB1==0)                  //如果是RB1键按下
2 h6 M; I+ |* `( ~7 a' Y' d        {# \. D% R9 U8 r4 X& ^
                delay_ms(5);              //延时去抖
+ ~: Y0 q. H7 R$ [  K                if(RB1==0)              //确认是否有键按下
, p- y, e3 l0 V+ ]+ F7 e' t& r                {3 F  \2 w4 M& H# z8 R' Y
                        while(!RB1);        //等待按键释放
+ o6 v; m) W8 N. @3 Q                        CCP2CON=0x0C;
; g- q7 ^" B3 }( q                        CCPR2L=0xB8;                   //80%占空比- j+ `0 x2 N% ]- m8 ]7 ?0 h7 C$ @
                        TMR2ON=1;* e( r& \$ O5 J. O% x
                }
: {/ Z! `- I7 a5 A2 A        }7 O! z7 G8 Z/ h, A7 q* o* v0 T) m
        if(RB2==0)                  //如果是RB2键按下
% e- X- q* H% ^8 c        {2 J0 @& q' l' O4 e$ S
                delay_ms(5);              //延时去抖6 c% V, e1 C( g$ O/ I* H7 w
                if(RB2==0)              //确认是否有键按下
% y1 p% Y/ J) C" w                {
; T" ]. k/ w) C# O1 Q3 E                        while(!RB2);        //等待按键释放
/ P. J& b1 E' D; Z" y                        CCP2CON=0x0C;
" `# H7 L6 r1 \2 m; }                        CCPR2L=0x96;                   //60%占空比
, M* m9 c3 F. m  e                        TMR2ON=1;; ]1 S# f9 _4 _8 E# k1 o& E
                }: z* z# \$ x9 Z. O; j8 \. e
        }
3 Y5 i/ M* _( A# n" r0 m8 k, ~) L        if(RB0==0)                  //如果是RB0键按下
+ t* T' F2 P# \+ m, H        {  G  |6 u0 G& q9 I# C$ Z+ o
                delay_ms(5);              //延时去抖0 a% ^7 s2 x; i7 o  D/ [+ Q- ?' a
                if(RB0==0)              //确认是否有键按下! v& l4 t/ _& Y0 o/ \
                {
6 o4 s' }' r4 R6 k  i                        while(!RB0);        //等待按键释放
$ c" I" c' ]8 @: G. L$ J( l4 A                        CCP2CON=0x00;                   //关PWM
& p/ Z" Z! q, ?0 L& J                        TMR2ON=0;                        //禁止TMR2
; s. i: [; K0 X& N/ U1 u3 z* d+ P, l                        //delay_ms(5);5 v6 y& J* ]% M* X) _
                        RC1=0;& g) z) d. X! P* N$ Z  R) O
                }1 F- h; u' Q. A! T* t
        }
2 V' D5 Y- E/ R* u1 \! a}
+ Q2 K0 t! X" r8 }/********主函数********/* z% u' W9 k# m- w2 K- j+ E
void main()
2 f3 f) o+ x' N! j6 Q{
( F( q" l) {  M" N5 G3 f        init();                     //系统初始化  j# C( O4 n+ _% [' c
        PWM_Init();                 //脉冲宽度初始化
/ e2 a& e* K4 f3 w        while(1); ^1 I( B) K" \1 L' L4 b( Z1 ~
        {+ [: O' Y# E5 y7 C4 \1 L4 ]
                keyscan();              //调用按键扫描处理脉宽因数8 S! r+ y( J( E7 @: l* D
        }
+ J. u0 V' u2 i}
回复 支持 反对

使用道具 举报

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

使用道具 举报

4#
 楼主| 发表于 2018-11-6 14:45:37 | 只看该作者
远祥 发表于 2018-11-6 07:382 b) @8 G$ x2 T, {: R
单片机常用问题吗?
- t! b. r5 o  A' ]+ P
这个是用PIC单片机产生PWM波,应该比较常见吧
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-10 12:17 , Processed in 0.056202 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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