机械必威体育网址

 找回密码
 注册会员

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
1#
发表于 2018-11-5 20:08:17 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 冯喆喆 于 2018-11-5 20:11 编辑 $ Z2 G  L' ^5 ~5 M) l! w
+ v, d1 P9 m  ]) |8 s6 q
用PIC16F887单片机产生方波,当我把方波频率设为4KHz时波形是正常的,当我改变TIMER2的分频值,从4改为16 ,此时频率应该变为1KHz,此时频率是对了,可是波形却变得很奇怪。  求有经验的大神指导下
5 H9 g+ `" b7 V3 @6 }这是产生的4KHZ正常波形,占空比为50%
! K& Q7 c; X3 n  b/ q: E$ v  `: R$ j  m
# ^; G6 `4 S& b
9 y4 ^2 F9 l+ \. E8 m( A
这是1KHZ有问题的波形,占空比为60%" k2 `" s* d0 N+ }+ J
+ E$ \2 K7 O. C" ?8 w% [
) G& S! y4 O9 x
回复

使用道具 举报

2#
 楼主| 发表于 2018-11-5 20:14:34 | 只看该作者
主要的程序我也贴上来各位看一下
/ s! E7 c# x9 Q# l' P* F' x7 E4 @; p* I+ v
/********端口初始化函数********/
3 G2 G5 E: t, ovoid init()
% P0 x5 k& K  n- z5 z7 s- s{9 s# l3 J/ m3 W9 P" k
        ANSELH=0x00;                     //设置B口为数字I/O口! G* g* N7 l4 n  {* H
        OPTION_REG=0x00;
* C5 X' _3 [/ s$ ^3 A        WPUB=0xFF;         //设置B口弱上拉& v. p/ r3 D7 H, B  e& A
        INTCON=0x00;       //关总中断
$ @. _. o/ S9 }3 S        PIE1=0;            //PIE1的中断禁止( i  a" V/ u+ U6 B  a0 E8 j
        PIE2=0;            //PIE2的中断禁止6 V1 s% ~0 f% ?  k
        TRISB0=1;
+ @* D; k) a: _, N) p6 Q        TRISB1=1;          //将RB1设置为输入口,按按键) q2 }0 S8 L. ^* e3 N
        TRISB2=1;          //将RB2设置为输入口,按按键* ^/ O3 s- G  d7 n& K# o
        TRISB3=1;4 }6 Y, [/ O! e, c  H4 }9 ^
        TRISB4=1;
, }2 t4 d5 ~; F5 F% A$ j# o  G        RC1=0;
- K' y, Y; f6 r" n        TRISC1=0;          //脉宽调制输出引脚,设置为输出4 o4 r8 J! B' w& Q, T
}
2 Z" n5 E0 Z& Z2 O$ ~7 }2 k/********PWM初始化函数********/
' G- Z. O7 K" @$ Q. c+ {1 {void PWM_Init()9 y0 G9 E2 N3 s2 x& n0 x* H
{
1 p3 [/ E4 Y) H        PR2=249;           //脉宽调制波形的周期为1000us        1 g2 I0 \/ S/ T. ~2 U5 E! M$ C
        CCP2CON=0x0C;      //CCP2模块工作在PWM模式,占空因数的低两位为00
0 Y7 u0 W5 n, `1 e3 D& p        T2CON=0x02;        //禁止TMR2,且前后分频值为16,同时开始输出PWM
3 H: i  s+ l0 n" \8 s: g- f        CCPR2L=0xB8;       //脉宽调制波形的占空比初始值( w! E* f2 F" a' `3 I! k& F* s
}
* x+ N" `) s' d5 A/********键盘扫描函数*******    */9 k' F% {3 Z- Z1 L; J- E2 Z1 f5 T
void keyscan()% F1 E' p3 ?- Z
{
/ L! ?: ]2 s' X, ]1 N# A: a        if(RB1==0)                  //如果是RB1键按下' }5 b9 I- i8 F+ i7 P0 l# h
        {
' P( @  e% F+ x/ T' V1 o( g% Z& O  h$ E                delay_ms(5);              //延时去抖
) Y- {, @! A" p$ ~( {2 X" a$ `$ {                if(RB1==0)              //确认是否有键按下
/ v8 l- c" ?) v7 \* d$ R                {
4 {: X8 T% x& D* N1 e4 p                        while(!RB1);        //等待按键释放
, z( P7 I7 v  z' x* L                        CCP2CON=0x0C;! j' ]1 T# M" I0 |
                        CCPR2L=0xB8;                   //80%占空比$ \' V8 K: [6 g& P
                        TMR2ON=1;
8 i' H! a) x* o( a* n3 ?. t                }
$ m, H; u% k7 j- w$ G3 c1 T! V! Z        }4 l% @% [0 h2 K2 i
        if(RB2==0)                  //如果是RB2键按下
% O# i0 d7 W$ F' I        {5 N- X  i8 U  ~/ i2 }/ g
                delay_ms(5);              //延时去抖# M8 K1 i- e" U  W5 d( ~! f
                if(RB2==0)              //确认是否有键按下
) d5 G2 [. O+ k" T                {
- v9 o, t/ ]2 b- G# y/ T# S& }0 U                        while(!RB2);        //等待按键释放' E# O6 b# r6 R, O$ T3 c
                        CCP2CON=0x0C;1 i7 E; v% N3 R
                        CCPR2L=0x96;                   //60%占空比) X1 @7 U- L" J& L* h% `5 f# a
                        TMR2ON=1;
0 R% l% q7 i6 v9 g1 [                }4 R  z8 }4 G1 V6 v( L
        }- [+ l. ?8 {6 p) I6 ?
        if(RB0==0)                  //如果是RB0键按下
  d$ w+ h& @( Y+ G8 |, s- f        {
, w2 [$ f# \) i4 [0 v6 m; x4 z                delay_ms(5);              //延时去抖
* T- w6 X" Q2 O  h* S                if(RB0==0)              //确认是否有键按下
& O: Y# _. e$ w                {
. a- m% S6 Y# a! W2 z# o                        while(!RB0);        //等待按键释放
, ^  o, G2 s6 j& Q1 c: i2 W                        CCP2CON=0x00;                   //关PWM: e' T$ u" d" I6 V4 t
                        TMR2ON=0;                        //禁止TMR2
7 ]$ ~0 E/ C: w8 i0 \                        //delay_ms(5);
  Y7 y& v- U0 o# S- t- A% {                        RC1=0;
( ~+ c! {. v6 ]. K3 e7 A                }
/ i8 d  P: P$ g3 H+ ~& ^% c" y        }/ l& G' @0 P  t: P& k6 d! f" Z) K
}& ]0 K6 I  O# n% ~- @
/********主函数********/
9 f, ~) u, v) N1 Dvoid main()
2 ^+ w# {+ c  \! I. c& U{
5 O& K: j9 ~5 g/ u8 ]8 r; f        init();                     //系统初始化
" [7 s+ w# p3 M* x& {5 J  Y+ X4 k% ^4 S        PWM_Init();                 //脉冲宽度初始化
% l2 @  l/ _7 Z* B        while(1)
, o7 D$ ^% `7 I* C* z! ~7 y% n        {0 b  D' v  q& L1 H" j! Z/ X3 {
                keyscan();              //调用按键扫描处理脉宽因数3 A) i5 U* _" E: h+ ~: \; Q
        }, Q7 U" [" _& k  B) C2 y
}
回复 支持 反对

使用道具 举报

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

使用道具 举报

4#
 楼主| 发表于 2018-11-6 14:45:37 | 只看该作者
远祥 发表于 2018-11-6 07:38: q6 A  f* q. z) }+ C4 A/ K  p
单片机常用问题吗?

( ?* Z' K* u& X9 {. x$ j; P这个是用PIC单片机产生PWM波,应该比较常见吧
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-10 08:20 , Processed in 0.051948 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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