机械必威体育网址

 找回密码
 注册会员

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
1#
发表于 2018-11-5 20:08:17 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 冯喆喆 于 2018-11-5 20:11 编辑
  f8 E$ V8 g" m  R  [; S8 Q0 `$ m8 H: n; m. C  B
用PIC16F887单片机产生方波,当我把方波频率设为4KHz时波形是正常的,当我改变TIMER2的分频值,从4改为16 ,此时频率应该变为1KHz,此时频率是对了,可是波形却变得很奇怪。  求有经验的大神指导下# S9 Y7 d) d6 \1 g( p/ z
这是产生的4KHZ正常波形,占空比为50%
' _+ C3 l) L$ @, e
* ^- f& `& }* c6 ?& i7 n; z : @- T1 r6 v$ s7 \# S" R; P5 Q% J
6 E: _0 k6 Q3 C: W$ W
这是1KHZ有问题的波形,占空比为60%! _+ ]% U0 U' J+ [' _6 S2 X
3 s8 I' Z8 v! ?9 r8 X( B

4 [7 W5 Y% H  {( Z" p
回复

使用道具 举报

2#
 楼主| 发表于 2018-11-5 20:14:34 | 只看该作者
主要的程序我也贴上来各位看一下
; v  F. `* ]4 d7 ~4 ^4 N4 w8 ~. u5 d9 b$ p) D; w7 Y3 \
/********端口初始化函数********/. R& c% @7 T, i2 ?9 }
void init()/ ?* A- {" \, O$ _
{7 y& c# Q5 a7 m% }
        ANSELH=0x00;                     //设置B口为数字I/O口& _8 ]$ r  j' Q& Q2 m4 A* |, s
        OPTION_REG=0x00;
( d* r+ }$ N0 V! M; v        WPUB=0xFF;         //设置B口弱上拉# W0 n" c3 L2 P! c8 a
        INTCON=0x00;       //关总中断
, I6 D, B' h' o! b' f+ m6 V        PIE1=0;            //PIE1的中断禁止
9 X* `  J2 K7 j) @        PIE2=0;            //PIE2的中断禁止. [' \6 w! ]0 ~* J
        TRISB0=1;
$ A6 b( u- a7 t; T        TRISB1=1;          //将RB1设置为输入口,按按键
3 O7 O  \% k! a$ |7 n: R+ |        TRISB2=1;          //将RB2设置为输入口,按按键! r! x: B1 n  S8 {- G4 j: L  K
        TRISB3=1;: D0 l5 J- G) ~" p6 M
        TRISB4=1;; F. N+ Z/ G# i1 J+ S, R
        RC1=0;' o2 e& n' q! V/ l, D- \; s
        TRISC1=0;          //脉宽调制输出引脚,设置为输出
' r$ G# k& m" i, W9 R}
! ~" }# G5 h$ _8 ]/********PWM初始化函数********/
, G9 m/ y+ h2 F" Q' }void PWM_Init()% {/ W1 L' g7 v1 F  k
{) c- \, g$ o6 t* {( X: g: ^
        PR2=249;           //脉宽调制波形的周期为1000us       
8 t4 ~1 t& i3 i2 y) R  k6 S        CCP2CON=0x0C;      //CCP2模块工作在PWM模式,占空因数的低两位为00
( ?/ {* B" f: K8 ]        T2CON=0x02;        //禁止TMR2,且前后分频值为16,同时开始输出PWM
9 e) U6 ?# n3 x8 \0 x        CCPR2L=0xB8;       //脉宽调制波形的占空比初始值
8 i: C6 r% B9 m/ I1 w9 [}6 t1 i' S4 o0 F' a5 y
/********键盘扫描函数*******    */
7 k6 T8 f0 j; E+ H  R. `void keyscan()* J; @! f2 Z3 s8 ]: m  v% `
{7 F7 V1 T; i8 p7 R: J  {. U3 ]
        if(RB1==0)                  //如果是RB1键按下' P1 T, B; v4 X' q* }; r0 o
        {
! e1 A8 }2 C& G; t                delay_ms(5);              //延时去抖' N: y/ i# ?8 }; D' _- j
                if(RB1==0)              //确认是否有键按下" E! _, o2 P8 ^# T6 h
                {$ H  d: R( k- q
                        while(!RB1);        //等待按键释放
  @) a5 J5 p* P# G                        CCP2CON=0x0C;! V- m! F8 c% z( E/ w
                        CCPR2L=0xB8;                   //80%占空比
9 h: g: j8 d! k# _% a# m/ L2 {                        TMR2ON=1;" N5 {7 j$ C2 I
                }7 U5 Y$ I4 E7 f
        }, u2 {' T# Z+ c9 h  C5 j! k6 A; L
        if(RB2==0)                  //如果是RB2键按下
/ I# q& a5 m& Q        {1 k; Q4 o% v; e* t
                delay_ms(5);              //延时去抖# ?! P. P( B1 k
                if(RB2==0)              //确认是否有键按下
6 {, o) \" [& M- E/ e                {+ `) }+ Y: m8 I8 D/ [
                        while(!RB2);        //等待按键释放; B2 }! A& l) J2 C% _6 ^: O
                        CCP2CON=0x0C;
9 X) @) }3 @0 w) s2 K( d9 U' x                        CCPR2L=0x96;                   //60%占空比
  l3 k6 p% {; |) [& n8 T6 `" g                        TMR2ON=1;
9 Z. o( m7 E  P2 J8 h                }
( ?! N/ m# D' A) ?        }
% z$ G" A0 T( k! M/ h+ X        if(RB0==0)                  //如果是RB0键按下! H( o, z) A" h$ k5 D
        {. s& t+ h. Y1 Y! r2 g- g9 f
                delay_ms(5);              //延时去抖
( u& Z) L& Z/ X                if(RB0==0)              //确认是否有键按下0 [, ]+ P' V. Y  N2 X5 o; n5 f" V- K
                {
# r( }! K& H! d2 F" o2 i# @; F3 }                        while(!RB0);        //等待按键释放
1 o/ p1 a, S: K, B                        CCP2CON=0x00;                   //关PWM! h. t# H1 v0 P' h: L
                        TMR2ON=0;                        //禁止TMR2& C: H6 `' a' n) R  t7 A
                        //delay_ms(5);$ E+ i* S. p$ p
                        RC1=0;' d( M/ [/ t( [2 p/ B3 M  u( s
                }" q9 x* v) f' Y, S9 {
        }
) k8 ^: c$ ?% ^+ L' n}: ?/ _  ]& X2 g; `* [4 @9 S! |2 C
/********主函数********/
) t% J# M5 N% j, k8 x+ _: Wvoid main(); P0 s" B6 I* D! E0 m' d
{
" v4 ^9 Z4 Y; v' d# I        init();                     //系统初始化
! d% b; O; X% f0 x7 J        PWM_Init();                 //脉冲宽度初始化
( e3 D/ |+ a* t9 l9 D0 Y9 ^        while(1)
1 H% e# v0 z/ y& `        {
) r- \2 p% a8 s+ ?7 Z                keyscan();              //调用按键扫描处理脉宽因数5 f" \- \2 D" i2 }( c4 F
        }
0 D. D( S* y' j1 u( @  q}
回复 支持 反对

使用道具 举报

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

使用道具 举报

4#
 楼主| 发表于 2018-11-6 14:45:37 | 只看该作者
远祥 发表于 2018-11-6 07:38
0 \! B. z! h' m9 K  b0 g* M, y单片机常用问题吗?
8 w- r( h% h4 {7 r
这个是用PIC单片机产生PWM波,应该比较常见吧
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-11 19:55 , Processed in 0.061411 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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