机械必威体育网址

 找回密码
 注册会员

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
1#
发表于 2018-11-5 20:08:17 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 冯喆喆 于 2018-11-5 20:11 编辑 5 K: a6 `$ L% V- o' W- M+ Y

3 u0 m4 K' j/ P5 W) ~( d9 k9 C0 i用PIC16F887单片机产生方波,当我把方波频率设为4KHz时波形是正常的,当我改变TIMER2的分频值,从4改为16 ,此时频率应该变为1KHz,此时频率是对了,可是波形却变得很奇怪。  求有经验的大神指导下" E. G9 ?7 ]* d* ^4 S
这是产生的4KHZ正常波形,占空比为50%
' g. J, N9 {2 d) q
- L# s$ L  d0 G - c) h5 f/ r+ K( i4 X2 `/ I+ x

5 w) g" y) S! D' l1 v3 J# u8 ~' C这是1KHZ有问题的波形,占空比为60%( a4 }  s3 q8 v* ~* H* L

1 d4 T2 b" [$ k4 Q7 d* j
& P5 i  J# K7 L; O$ G
回复

使用道具 举报

2#
 楼主| 发表于 2018-11-5 20:14:34 | 只看该作者
主要的程序我也贴上来各位看一下6 P3 u# a. b, A1 e, j  E  Q
1 X0 e0 T2 p8 a8 s: H
/********端口初始化函数********/
; `$ p* e% c: g( N" T+ m% Vvoid init()7 }5 D4 g6 J, ^# n
{
, i1 |- e6 `6 V' k8 \3 i2 |        ANSELH=0x00;                     //设置B口为数字I/O口
) L7 I' l& `' O+ ^( f        OPTION_REG=0x00;
, ~$ {, h# p4 V+ m        WPUB=0xFF;         //设置B口弱上拉
- f" E9 V# H) Z, n1 Q. K5 u# P( h        INTCON=0x00;       //关总中断
0 g0 ]* n4 j5 L3 y$ I3 f( Y. f" S        PIE1=0;            //PIE1的中断禁止+ R4 X/ X: q" v& t; L+ Q- e
        PIE2=0;            //PIE2的中断禁止
( |+ r, x. M, {8 O! C( p        TRISB0=1;
' p7 q/ f' k9 }- c0 R) ]. A        TRISB1=1;          //将RB1设置为输入口,按按键4 q7 o: d+ d" `, N# f
        TRISB2=1;          //将RB2设置为输入口,按按键& s  `8 l! D% t; ~' F
        TRISB3=1;
/ q0 E- q( q: c3 b  D0 c. x        TRISB4=1;5 q9 [) e$ p/ u+ N! h
        RC1=0;" h$ S( i9 D- i, x
        TRISC1=0;          //脉宽调制输出引脚,设置为输出
/ n1 m; j5 R( d" z( H: w}
+ ]6 ^" E0 Y3 E3 w9 L# ^" o/ |8 u/********PWM初始化函数********/
& p! g$ B; r: {/ yvoid PWM_Init()
5 e  G, p: v$ W2 ?! g% ]" X{, {$ O: |; f" A: w9 i: `7 V7 R1 x
        PR2=249;           //脉宽调制波形的周期为1000us        % F6 g/ b  s" I, f
        CCP2CON=0x0C;      //CCP2模块工作在PWM模式,占空因数的低两位为00! @% _0 i$ T5 g' E; z
        T2CON=0x02;        //禁止TMR2,且前后分频值为16,同时开始输出PWM8 S. S9 ~& h; v+ F
        CCPR2L=0xB8;       //脉宽调制波形的占空比初始值8 f! x2 T- ^: E/ h
}0 v4 P* {$ Z+ P6 t8 g9 Z4 h
/********键盘扫描函数*******    */
3 L: F6 x& C. q- A0 T9 yvoid keyscan()
5 n' H: D$ A7 O1 b5 r4 q" w{
) E$ r5 \% ~$ Z        if(RB1==0)                  //如果是RB1键按下
! n: R7 z7 d9 E) m) X        {' L. i* F4 _& G/ O" k) Y  z5 x
                delay_ms(5);              //延时去抖
7 V* A1 u, C1 {2 O                if(RB1==0)              //确认是否有键按下; j7 {2 y5 m3 L- d* N4 i' c
                {) B) j4 Z. l7 \, _; Y
                        while(!RB1);        //等待按键释放9 \' x8 P% ], O7 _; O. ]/ i
                        CCP2CON=0x0C;
& T1 ~1 s1 k) P* b0 E( ]! M! Y2 N                        CCPR2L=0xB8;                   //80%占空比/ A( B/ _5 W6 d" A2 O- |+ u# M
                        TMR2ON=1;2 ?  X4 S3 E% I+ X; o$ Z
                }' V- p3 S; X5 \4 J
        }
! Q8 [+ @: e! I2 m8 N3 c        if(RB2==0)                  //如果是RB2键按下: B% O6 F6 L$ Z
        {: y' a" L' M% ^1 J
                delay_ms(5);              //延时去抖
; j$ L; g7 X, Z9 c0 z, s                if(RB2==0)              //确认是否有键按下
- H+ B* T1 I# o) \: `                {. w  b! n" w7 r2 v  o
                        while(!RB2);        //等待按键释放
9 t. u$ U0 M5 j* U$ N8 L( D                        CCP2CON=0x0C;- Z, b3 P& X/ P4 @8 K" ]3 l
                        CCPR2L=0x96;                   //60%占空比  u& H7 ^" c6 O8 t* A2 r
                        TMR2ON=1;
8 `1 S. I$ v) Q* g; [8 i- k                }' D& z" _; B! w: k
        }
' i9 r$ I+ b. x; Z& ]$ N        if(RB0==0)                  //如果是RB0键按下+ u* @- w9 e  b; C0 z$ z7 B: H
        {1 c! g/ J) {/ p: P7 t
                delay_ms(5);              //延时去抖
8 B6 n! \; \; `                if(RB0==0)              //确认是否有键按下, \/ X' G1 F- O* j! z3 m! s6 r
                {; y' z- `4 s( T" r9 j7 `
                        while(!RB0);        //等待按键释放4 |1 q+ q- t, F" J
                        CCP2CON=0x00;                   //关PWM, w$ e, H5 H* |
                        TMR2ON=0;                        //禁止TMR2
" X0 X. T2 @8 z* X                        //delay_ms(5);
  H  N1 S# g1 F' j: i                        RC1=0;& w, y, H2 w% j5 |9 m* x) t
                }0 y! N: T3 N6 ?. j! W$ B8 |9 V1 l
        }: S: \* q6 p: G9 b3 ]# E5 z6 x7 l
}  _+ B, ~+ h9 e7 m$ }& z% x
/********主函数********/3 U' l& o/ o! e3 w) C! \' Q' n
void main()% w: q5 Z: P! H& X9 D  w
{
$ }* h9 P: f! p# G+ _. `        init();                     //系统初始化
% c( n6 w* [5 Q1 ~        PWM_Init();                 //脉冲宽度初始化
" J3 U' U  r; `. R% e% M8 P5 U        while(1)
6 Q; J4 _4 N9 e  l        {% X' Q; l3 M5 K) g2 v$ i
                keyscan();              //调用按键扫描处理脉宽因数# M- h( s. Y9 R5 ^) v4 B+ x" R( |
        }
' q' u) U5 V6 D+ J7 ?$ `}
回复 支持 反对

使用道具 举报

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

使用道具 举报

4#
 楼主| 发表于 2018-11-6 14:45:37 | 只看该作者
远祥 发表于 2018-11-6 07:38
% s5 M* W  _- h单片机常用问题吗?
+ d* ?& X7 t. D0 u1 p- s9 X
这个是用PIC单片机产生PWM波,应该比较常见吧
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 01:23 , Processed in 0.053379 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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