机械社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 2889|回复: 3

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

[复制链接]
发表于 2018-11-5 20:08:17 | 显示全部楼层 |阅读模式
本帖最后由 冯喆喆 于 2018-11-5 20:11 编辑
- h+ j, u* e: z- `1 D+ d, ?* k/ G$ q, }& A% N
用PIC16F887单片机产生方波,当我把方波频率设为4KHz时波形是正常的,当我改变TIMER2的分频值,从4改为16 ,此时频率应该变为1KHz,此时频率是对了,可是波形却变得很奇怪。  求有经验的大神指导下
- \# a/ D  r8 l  H& L这是产生的4KHZ正常波形,占空比为50%/ C5 ^$ F9 |( e
( z. I, R: S0 l( l* n; U
微信图片_20181105201023.jpg # p$ Q3 X7 N1 d- f

7 i5 k2 A$ x2 c' A这是1KHZ有问题的波形,占空比为60%
2 ]; u' D( Y$ h' i: g( g 微信图片_20181105201034.jpg 9 u$ k8 S* j, _8 O& Z4 f
4 r1 u. n6 i* ]5 C( t
回复

使用道具 举报

 楼主| 发表于 2018-11-5 20:14:34 | 显示全部楼层
主要的程序我也贴上来各位看一下
* e! n% @$ [% C6 ^
% F* P1 h7 W8 C8 b  Q6 o/********端口初始化函数********/
& N2 l7 X4 Q  g& D/ H; rvoid init()3 D) u2 a5 a2 h: D. q7 V' ~5 O
{& o" ^0 r0 m% a
        ANSELH=0x00;                     //设置B口为数字I/O口& s* }" L4 L! @6 o: j
        OPTION_REG=0x00;
' l# Z0 W$ |: b4 e  Q- L+ D; ^        WPUB=0xFF;         //设置B口弱上拉
, O' T& ?. c  v        INTCON=0x00;       //关总中断
9 j  k9 D% N% |# r9 K# o4 g        PIE1=0;            //PIE1的中断禁止$ W$ h" o. m1 X. Y5 N# e) W/ S
        PIE2=0;            //PIE2的中断禁止
, Q& ~1 O. t2 F3 K        TRISB0=1;
" y* h2 O5 H- _' l3 G        TRISB1=1;          //将RB1设置为输入口,按按键- ^+ M( t- B! S  R5 W- `/ P# A. `
        TRISB2=1;          //将RB2设置为输入口,按按键0 U. A( \! K5 q
        TRISB3=1;! L3 [; j& Z% ]! k+ i
        TRISB4=1;6 W' E5 z% U& s- F
        RC1=0;, s3 I4 Z8 R- G1 I8 B7 W
        TRISC1=0;          //脉宽调制输出引脚,设置为输出0 N& S  z- ?& p, R4 K4 D1 X
}" S8 K3 C1 \5 a& P8 s0 z" j
/********PWM初始化函数********/
  t8 j% Y9 m2 @' E0 Yvoid PWM_Init()
# l* k2 r3 c/ Y% |3 r4 }% R$ H{/ L5 @; h0 v6 W$ w9 v
        PR2=249;           //脉宽调制波形的周期为1000us        " ?6 f  g5 W/ Q: Q5 n7 H
        CCP2CON=0x0C;      //CCP2模块工作在PWM模式,占空因数的低两位为00: G! T& L6 n. t# J
        T2CON=0x02;        //禁止TMR2,且前后分频值为16,同时开始输出PWM# l, P7 w* r; w
        CCPR2L=0xB8;       //脉宽调制波形的占空比初始值
: C' L8 n/ ]" R}, ]+ e) d: _, v2 A& D0 p, |. K6 T
/********键盘扫描函数*******    */9 a3 s# q8 T' Z, V4 h# p7 E1 q7 \
void keyscan()
# J  _9 e: X9 H- C{
# H/ z$ {3 E# E+ i5 \, c        if(RB1==0)                  //如果是RB1键按下# j6 a* h" V. Q: n' q2 M; ~9 w
        {% h6 b9 `8 T" R
                delay_ms(5);              //延时去抖: [7 Z9 a7 ?! q# w; ]9 d
                if(RB1==0)              //确认是否有键按下2 _' b! k7 n7 g7 Q3 s! d& U7 F: N
                {. t, ^; L1 {- F
                        while(!RB1);        //等待按键释放; U  v! P5 X  z/ q7 j' E& U
                        CCP2CON=0x0C;( x8 j" ?  ?0 C5 ?
                        CCPR2L=0xB8;                   //80%占空比
5 G8 |+ F4 R7 V" X( W1 N                        TMR2ON=1;8 V& a: Z0 e" Y) f* p: C. s
                }
8 V; K6 f& a; K  B        }
7 R$ G  |. ?: z& f- e' u- h8 [        if(RB2==0)                  //如果是RB2键按下
& _. q8 z$ K& K/ T* T; _        {% I- M  E2 m8 n# O& v6 K
                delay_ms(5);              //延时去抖
/ A3 B4 |* J  n% B. D                if(RB2==0)              //确认是否有键按下
8 D& I; I% D; @6 [                {  {1 _- c7 s' S- X4 L7 j
                        while(!RB2);        //等待按键释放
) V$ k$ O/ C+ l+ u5 {                        CCP2CON=0x0C;
# P/ u1 S) B! t                        CCPR2L=0x96;                   //60%占空比
; O. y/ ?: ]! w5 ?, z                        TMR2ON=1;/ g- v  C" C) E$ c
                }
  y5 L: |7 F( F& v: c# T2 p        }9 V9 d3 R0 C% s7 ]. D% M
        if(RB0==0)                  //如果是RB0键按下
/ Y+ s/ U! Q! r& B: i6 x        {* x1 d6 y+ ~6 ^3 m
                delay_ms(5);              //延时去抖2 f. S1 ^1 @+ I9 T  ~2 p1 i$ `
                if(RB0==0)              //确认是否有键按下
! e/ H$ l+ J0 b4 F! Q                {$ U/ ~  ]  ]4 _
                        while(!RB0);        //等待按键释放
; x2 K- c9 o) M$ N# Z; H2 ^                        CCP2CON=0x00;                   //关PWM
& D( r2 C  `! n' S7 A                        TMR2ON=0;                        //禁止TMR2, e( u; m! S7 U) _( O+ U/ M
                        //delay_ms(5);
0 d, U$ _' C$ R6 ~6 S" {. ]                        RC1=0;0 r9 H8 G: t/ ?5 c* \% V2 z1 A
                }% x5 _8 v7 R( p; J: o$ o2 A* k, t; s
        }( t, o! A" G, n
}, j$ |$ I! w7 F. j, V0 \* O
/********主函数********/' f& }$ Y+ ~% W  U* R; ], k
void main()
9 v8 {; q8 u6 f{
; V; f1 t2 p6 n) y! r, M+ ^% [        init();                     //系统初始化' S: U* L2 e+ E+ k3 F# F/ ?7 M
        PWM_Init();                 //脉冲宽度初始化& f; X* ?! d. q8 z4 H1 w
        while(1)  h: u! A6 z/ @. p5 _
        {
+ b9 m7 M' \. q) M6 y" F3 n                keyscan();              //调用按键扫描处理脉宽因数0 P  w/ h( B' H( T4 a4 t$ w# R( k
        }' i, N; p, |* O6 w  h" W5 W: l6 A0 K
}
回复 支持 反对

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2018-11-6 14:45:37 | 显示全部楼层
远祥 发表于 2018-11-6 07:38
) ~5 H/ ]7 X+ P  p单片机常用问题吗?

" t9 S4 X& T' S* G+ _% a这个是用PIC单片机产生PWM波,应该比较常见吧
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-28 06:29 , Processed in 0.054027 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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