找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 3261|回复: 3

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

[复制链接]
发表于 2018-11-5 20:08:17 | 显示全部楼层 |阅读模式
本帖最后由 冯喆喆 于 2018-11-5 20:11 编辑 9 J* A7 @! r! l( ]& L# V% i  t

+ Q- h( U5 H% @1 B用PIC16F887单片机产生方波,当我把方波频率设为4KHz时波形是正常的,当我改变TIMER2的分频值,从4改为16 ,此时频率应该变为1KHz,此时频率是对了,可是波形却变得很奇怪。  求有经验的大神指导下7 o% m$ U5 U% S0 m: k! V* N4 ~
这是产生的4KHZ正常波形,占空比为50%1 \  C* a+ m$ o
$ E3 Z* F: Q& f
微信图片_20181105201023.jpg
7 r  ~2 ~6 w; U1 Q: s% t5 p; @* c# Y6 c2 l, _0 p7 {
这是1KHZ有问题的波形,占空比为60%
2 m4 O/ K/ a! k) s, p" h3 d 微信图片_20181105201034.jpg 2 G  O+ O8 t& P, u2 R3 w) d

8 q  k' Y  W7 k, e; M$ h" q) p
回复

使用道具 举报

 楼主| 发表于 2018-11-5 20:14:34 | 显示全部楼层
主要的程序我也贴上来各位看一下
) P5 p2 l9 X- N8 Z# b( x
1 y* V0 I% E. U5 k0 _0 L/********端口初始化函数********/$ v5 y* M2 L2 K. L
void init()
0 }8 B- C5 h6 _# A' k{* A  z4 E+ @  j
        ANSELH=0x00;                     //设置B口为数字I/O口
$ }4 m: D5 g# A2 I  S) H. [8 a        OPTION_REG=0x00;
5 \4 P" e# b. f) r0 l        WPUB=0xFF;         //设置B口弱上拉
4 Q$ l% |. n/ y        INTCON=0x00;       //关总中断  s$ {* M, M4 c  d2 }2 g
        PIE1=0;            //PIE1的中断禁止' {8 u6 d9 k4 M0 r' t
        PIE2=0;            //PIE2的中断禁止
: C, l/ z$ C% J$ r' ]* {        TRISB0=1;6 q; a" h" J1 m( M
        TRISB1=1;          //将RB1设置为输入口,按按键
( `8 y1 z5 G7 z- c7 q, C: I; t        TRISB2=1;          //将RB2设置为输入口,按按键
/ n7 ^4 j4 V" c8 ?& `$ N6 j, ?        TRISB3=1;0 T5 l2 x5 K5 N2 v# d7 g
        TRISB4=1;
% \1 q# |3 ]& Q' e; i+ u        RC1=0;& }# J* M& q" e+ W1 F
        TRISC1=0;          //脉宽调制输出引脚,设置为输出+ }1 W% E, N7 X
}, z% c+ O: e/ s, {& d- t& H/ O
/********PWM初始化函数********/! p  O  T" d* h3 \; v* h2 \- z8 V
void PWM_Init()3 i' l5 p0 Y; Z. b+ ]
{
/ F) f: J5 y' ^. w        PR2=249;           //脉宽调制波形的周期为1000us       
5 w5 A, I! ]2 j  A3 W0 f: L: J        CCP2CON=0x0C;      //CCP2模块工作在PWM模式,占空因数的低两位为00
/ w" e: T, E% o% q  V# y3 K: H        T2CON=0x02;        //禁止TMR2,且前后分频值为16,同时开始输出PWM
& R8 G- V1 Y/ d' x, |! }: b: @  e        CCPR2L=0xB8;       //脉宽调制波形的占空比初始值
/ \( y% t) |, n}
0 m* M8 o$ H1 F5 ^( m$ X/********键盘扫描函数*******    */
0 [8 P1 q  W- r* c; r' i- xvoid keyscan()
/ O, Z1 T% y# P1 w$ W3 F{! {5 w1 g. E0 m4 Q  C/ s
        if(RB1==0)                  //如果是RB1键按下  D3 j8 E0 O: u
        {
- Q  O1 e5 g6 w                delay_ms(5);              //延时去抖
0 Y* i8 x' V7 L: e( Z                if(RB1==0)              //确认是否有键按下# `9 I+ P9 {  k4 Q  U0 q9 Y! j
                {
7 n; A7 j- ]0 j) ]                        while(!RB1);        //等待按键释放
5 H) f6 ~) S  {& q, w( o1 [$ M                        CCP2CON=0x0C;
1 A1 o3 a0 v' ~2 z+ S  y4 p2 n. q% w8 T                        CCPR2L=0xB8;                   //80%占空比
" N  f: X+ \/ e( Y) \# i5 Y6 B) W2 {                        TMR2ON=1;
) i% J/ R1 ^7 s: C: s                }
/ F2 ~* L" ^0 k% q        }
% l& x" g- A& K7 h6 A; q        if(RB2==0)                  //如果是RB2键按下  T. m7 B6 S7 D' W1 m
        {+ r+ M4 x: F, w
                delay_ms(5);              //延时去抖
3 V( N# @1 Y7 q0 m                if(RB2==0)              //确认是否有键按下
! C& p/ [4 n( M+ h; u0 k+ \+ c                {
- _6 m1 w8 t7 Q- ~0 U+ ]" q& p1 y                        while(!RB2);        //等待按键释放+ [' n4 r8 p/ ~$ ^# O% h9 c
                        CCP2CON=0x0C;
9 A! ^* y  A. @* Z/ y7 W$ {9 {5 _                        CCPR2L=0x96;                   //60%占空比  e! |. ?8 X* {
                        TMR2ON=1;
' G* C7 @2 s8 i/ {, U                }
: w. L2 K2 q' A; T        }# g; @8 h. o0 P* P
        if(RB0==0)                  //如果是RB0键按下
6 o  o8 S' c5 z% v- ~7 S+ o7 x  A        {
4 `9 ]* Y+ C, B/ _# L7 }# E                delay_ms(5);              //延时去抖+ Y- g7 q" X. k' J# B, [7 N3 Y( r
                if(RB0==0)              //确认是否有键按下- n! {8 L6 L4 p( f( I+ _
                {! w) E. B' J5 \
                        while(!RB0);        //等待按键释放0 Y1 E% o( l  x6 N
                        CCP2CON=0x00;                   //关PWM8 e( N$ u( G$ m9 V9 `
                        TMR2ON=0;                        //禁止TMR2
2 p( k% I1 R( `" K1 Z6 F                        //delay_ms(5);
  |# F+ \$ Y/ R, U/ D  S& Y/ A. F7 p                        RC1=0;
2 L) I, F7 R! @! S) Z$ |3 |" B. k                }1 c2 h. r0 V* j
        }
2 u' R4 b6 S: W( b}
/ U/ @0 u/ y5 [* t/********主函数********/
- g1 u1 _5 D& |0 b3 Ovoid main()
  `& U  r; d9 A1 T: i{
' `5 K- W- p/ Q5 m8 [        init();                     //系统初始化
: G# N0 \: Q8 V( E  O        PWM_Init();                 //脉冲宽度初始化+ c4 H& ~, g, b+ F
        while(1)
1 v) G/ B, Q, ^" D% i3 A2 `1 r        {
  o! B! |2 q" k+ e( b                keyscan();              //调用按键扫描处理脉宽因数5 ~, _, n8 b6 q) ?9 |
        }
9 m5 N9 W4 `7 b, w. O" T/ C}
发表于 2018-11-6 07:38:09 | 显示全部楼层
单片机常用问题吗?
 楼主| 发表于 2018-11-6 14:45:37 | 显示全部楼层
远祥 发表于 2018-11-6 07:38
8 U# X) q6 \. t2 ?6 v2 J( m单片机常用问题吗?
3 U' R. K  r/ W( j8 m+ N3 _- K
这个是用PIC单片机产生PWM波,应该比较常见吧
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

GMT+8, 2025-6-21 04:18 , Processed in 0.074085 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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