机械社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 2975|回复: 3

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

[复制链接]
发表于 2018-11-5 20:08:17 | 显示全部楼层 |阅读模式
本帖最后由 冯喆喆 于 2018-11-5 20:11 编辑 $ l5 M2 {2 V" C( `

1 U8 d- k5 q8 a7 l' L; D1 a. ]0 G- j用PIC16F887单片机产生方波,当我把方波频率设为4KHz时波形是正常的,当我改变TIMER2的分频值,从4改为16 ,此时频率应该变为1KHz,此时频率是对了,可是波形却变得很奇怪。  求有经验的大神指导下# S) q/ W; S) V# |( S; m, w
这是产生的4KHZ正常波形,占空比为50%
! {8 s( n2 R' ^9 W7 X
0 E6 `% r" S0 g& Z; w2 M 微信图片_20181105201023.jpg
/ J2 t0 n! `5 F- U/ E6 f. ~, X3 _4 j4 N: S$ T& \
这是1KHZ有问题的波形,占空比为60%
$ ~$ W3 D2 b. P+ e 微信图片_20181105201034.jpg " X; g" m0 K& {+ G  v
, T4 Z+ j) a' [) X3 r- l0 U
回复

使用道具 举报

 楼主| 发表于 2018-11-5 20:14:34 | 显示全部楼层
主要的程序我也贴上来各位看一下3 R  K) U- `5 X
, M) j6 f8 _- @; }
/********端口初始化函数********/
1 w1 K- Y. ~1 |/ B4 P$ k. V# O( d- Q1 Nvoid init()% C2 y3 J$ ?4 l' m) M/ E* X# F1 g
{
; ^* x! R# u' h$ ?& k        ANSELH=0x00;                     //设置B口为数字I/O口
, f7 l+ j/ q) d- V9 w        OPTION_REG=0x00;! P+ Z5 R0 I' ?4 C
        WPUB=0xFF;         //设置B口弱上拉
' Y/ G5 @4 P5 s: H6 A' B6 H        INTCON=0x00;       //关总中断
1 i4 w- y6 O( R. N  X& C        PIE1=0;            //PIE1的中断禁止
3 A& r3 R' ]; j* y$ v+ ?9 R6 J        PIE2=0;            //PIE2的中断禁止2 r/ L  ^, O( p
        TRISB0=1;
4 D* z% J  H" M% b  Y) _7 {1 G        TRISB1=1;          //将RB1设置为输入口,按按键) P1 L/ }. N" q3 `  D. Y2 ^
        TRISB2=1;          //将RB2设置为输入口,按按键
7 R  B5 V2 Q" {6 i8 P' o6 H1 O        TRISB3=1;
  [9 S0 b( O' `5 Q        TRISB4=1;: N2 o0 ?; Y, U- T: M: c
        RC1=0;, T! I6 w; c/ j8 K; L0 c
        TRISC1=0;          //脉宽调制输出引脚,设置为输出5 M& y: _% Q' X( a" c, i- \
}* h) _, d+ P8 P8 ~
/********PWM初始化函数********/
0 r3 b3 s( \# @' W* Evoid PWM_Init()9 F9 c( C5 ]8 o9 O0 s
{& D" A9 ~( L, k2 ?
        PR2=249;           //脉宽调制波形的周期为1000us       
9 L: p- L) Z, f4 F8 g$ a* R  X        CCP2CON=0x0C;      //CCP2模块工作在PWM模式,占空因数的低两位为00- _2 \" i  n- d" A
        T2CON=0x02;        //禁止TMR2,且前后分频值为16,同时开始输出PWM$ ]2 x* U/ q7 y/ C2 i& T3 [
        CCPR2L=0xB8;       //脉宽调制波形的占空比初始值% D3 {4 G- ^, r
}
5 L$ T, U  ]0 i; ~( R8 w" ~/********键盘扫描函数*******    */
0 \7 T% y3 |/ ~void keyscan()
- N6 Q( |0 O0 W+ [{# o: N8 S5 d! d0 Y( N! g
        if(RB1==0)                  //如果是RB1键按下
# C; X+ b0 d5 c9 J/ A8 h* V        {0 E+ |5 d- I6 D6 b5 b
                delay_ms(5);              //延时去抖- R8 x( s0 H  a9 r
                if(RB1==0)              //确认是否有键按下% {* [/ r7 d9 H
                {
+ |( S7 B! Y* |" n/ o! f. x) t. [- w                        while(!RB1);        //等待按键释放+ i9 M0 }7 i1 k, _' y9 C
                        CCP2CON=0x0C;8 M" J; s; `! Q; O
                        CCPR2L=0xB8;                   //80%占空比
5 i: @2 H, f& a( M6 Y  w                        TMR2ON=1;
" L# \0 [$ G7 E2 _6 E                }
9 P4 w2 S  N( [5 C/ y( \: ]0 |        }8 `; m* Z( Q: ~0 `9 m  P0 v
        if(RB2==0)                  //如果是RB2键按下
1 P$ U$ W7 g" u% z( y  M3 b        {
6 i! J; q- h# b                delay_ms(5);              //延时去抖
4 M9 j: ?& H. k- n                if(RB2==0)              //确认是否有键按下
# G; r7 p, E5 T1 Q7 s) y. m                {7 O6 P, {) i7 F8 V9 m
                        while(!RB2);        //等待按键释放/ N9 o" s  P7 u+ Z+ |- E
                        CCP2CON=0x0C;0 W: T  U7 r: v' |7 I. m
                        CCPR2L=0x96;                   //60%占空比
' {. I; z- d- I, s                        TMR2ON=1;, d. J; |+ l" D! i6 H
                }: m8 d) K7 C( O: @$ a2 @
        }2 o/ `' H4 ?0 j; q
        if(RB0==0)                  //如果是RB0键按下5 D" [/ h' f) w2 G/ b8 D
        {1 |0 Z2 x  c1 J: V: R& S
                delay_ms(5);              //延时去抖/ i1 t; l* `: Z
                if(RB0==0)              //确认是否有键按下$ L' |1 @8 p# i! u: d
                {
$ a  e2 g3 h* b% Z9 `                        while(!RB0);        //等待按键释放; F. i- Z& \/ K3 V: k
                        CCP2CON=0x00;                   //关PWM& [7 [: v5 D$ a. U: C9 v, L# ^
                        TMR2ON=0;                        //禁止TMR2( ?4 j1 Z& J/ \; e6 `
                        //delay_ms(5);* a' X9 ^/ v- S, F' `. ^  C% \
                        RC1=0;
* v, I0 W) ?) k* o& c/ w                }2 y- ^* |! l7 B3 v# l9 I6 c; |
        }- w  R! J" s4 L) d- b# W& ^
}
7 @4 X% J& j/ B, L: V% k/********主函数********/. o3 o7 }! g7 H: v2 v
void main()
) s% _0 c8 L2 f6 v; I8 Z3 c+ B{
6 j3 K" ?. U1 T" ^! A        init();                     //系统初始化1 z0 c( c8 B6 V( L& H
        PWM_Init();                 //脉冲宽度初始化
7 p, D/ |& F$ B3 c+ P        while(1)' E; S: I6 i& \: d2 U5 j6 l5 v# e
        {
! J/ L# P7 g- j0 o                keyscan();              //调用按键扫描处理脉宽因数
) Q8 d' C2 w; m4 N- }        }/ |8 d7 B  G  ^$ ]7 U2 z
}
回复 支持 反对

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2018-11-6 14:45:37 | 显示全部楼层
远祥 发表于 2018-11-6 07:38  l! J7 [2 t5 y3 G3 \
单片机常用问题吗?

0 X( w+ g/ {( N! L  Y! @! \这个是用PIC单片机产生PWM波,应该比较常见吧
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-10 13:54 , Processed in 0.055064 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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