欢迎来到泰骏兴电子,大家有问题可以直接联系管理员QQ:233619809单片机 QQ群:59194556 各位游客也可以注册玩玩,享受更多权益。温馨提示:本网站仅提供平台学习以及渠道,一切后果自行承担,还望广大用户提高自我意识,请不要轻易相信他人,请不要轻易相信他人,请不要轻易相信他人。为了更好的管理论坛工作,所以现在使用邮箱注册,如果以前的邮箱不能修改的,请联系管理员代为修改

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 388|回复: 0

基于STC单片机的定时器模拟PWM转速调节系统

[复制链接]
发表于 2023-1-9 19:51:05 | 显示全部楼层 |阅读模式
系统上电后进入系统初始化程序,系统的初始化由初始化液晶1602显示屏幕,温度的初始化,电机的初始化。初始化液晶显示正在初始化并且显示温度,完成后进入电机转动一下,系统则正式运行。当系统运行时候,可以通过K2和K3来调节两个电机的运动方向和停止。系统运行时候,通过K1键设置运行的速度,频率两个参数。占空比越大,这速度也就越快,占空比最大不超过98%,最小不低于0%,当然,占空比等于0%时,电机就会停止
(1)DS18B20读时序:
① 读时序包括读0和读1的时序。
② 读时序是在拉低单总线之后,在15us之内释放单总线,让DS18B20把数据传送到单总线上。读时序的过程至少需要60us。
(2)DS18B20写时序:
① 写时序包括写0和写1的时序。
② 写0和写1时序略有不同。当写0时序时,单总线至少要被拉低60us。保证DS18B20能够采到数据线上的“0”电平,在15us到45us之间;当写1时序时,拉低单总线,并在15us之内释放单总线。

此电路使用PWM算法实现电机的调速原理,293D模块的EN1与EN2则是模块的使能端,使用PWM方波控制两个引脚个的开关所占高电平时间与低电平时间控制电机的运转速度。而293D的IN1,IN2与IN3,IN4这两组引脚则控制电机的反向。IN1是高电平,IN2是低电平,那么电机则顺时针运行,如果两个电平相反,则电机的反向也随之相反。同理IN3,IN4也是一样的


在主界面模式下,在按下按键k1的时候,是设置模式。第一次按下是设置占空比,第二次按下是设置频率,频率设置范围在10HZ到9998HZ之间。调节2个参数都是通过K2与K3调节的,k2是加,K3是减。在没有按下按键k1的时候,第一次按下按键k2的时候,第一路电机正转;第二次按下按键k2的时候,第一路电机反转;第三次按下按键k2的时候,第一路电机停止,这样一直循环下去;第一次按下按键k3的时候,第二路电机正转;第二次按下按键k3的时候,第二路电机反转;第三次按下按键k3的时候,第二路电机停止,这样一直循环下去。
(3)注意事项
电源不得超过5V,温度不得超过99度不低于0度,直流电机的占空比不能超过98,电机驱动频率最大是9998Hz。

仿真:



PCB:


部分代码:
[mw_shl_code=c,true]/*
主频:12Mhz
*/
#define uint unsigned int
#define uchar unsigned char
#include <reg52.h>
#include <delay.h>
#include <wd18b20.h>
#include <yj1602.h>
sbit pm=P1^5;
sbit pl=P3^4;//PWM输出接口

sbit in1=P1^6;
sbit en1=P1^5;
sbit in2=P1^4;//第一路293D控制接口

sbit in3=P3^3;
sbit en2=P3^4;
sbit in4=P3^2;//第二路293D控制接口

sbit k1=P2^7;
sbit k2=P2^6;
sbit k3=P2^5;//独立按键接口

#define ssz1 {in1=1;in2=0;}
#define nsz1 {in1=0;in2=1;}
#define tz1  {in1=0;in2=0;}//第一路电机动作模式

#define ssz2 {in3=1;in4=0;}
#define nsz2 {in3=0;in4=1;}
#define tz2  {in3=0;in4=0;}//第二路电机动作模式

#define djqg {in1=0;in2=0;in3=0;in4=0;}//二路电机停止
void xswd()//显示温度程序
{
                uint q;
                q=wdzh();
                xszf(0,7,"Wendu");
                zl(1,szf[q/1000]);
                zl(1,szf[q%1000/100]);
                zl(1,'.');
                zl(1,szf[q%100/10]);
                zl(1,szf[q%10]);
}
void xszt(uchar q,w)//显示电机状态程序
{
                switch(q)
                {
                case 0:xszf(1,0,"ssz1");break;
                case 1:xszf(1,0,"nsz1");break;
                case 2:xszf(1,0,"tzz1");break;
                }
                switch(w)
                {
                case 0:xszf(1,12,"ssz2");break;
                case 1:xszf(1,12,"nsz2");break;
                case 2:xszf(1,12,"tzz2");break;
                }
}
void plzkbtj(float duty,float f)//电机驱动PWM程序
{
        int Xt1,Xt0;       
//                uint q;               
        float t1,t0;
                uchar w=2,e=2;
        uchar h1,l1,h0,l0;
        duty=duty/100;
                t1=duty/f;                             //高电平时长
        t0=(1/f)-t1;                        //低电平时长
        Xt1=65536-1000000*t1;        //高电平的时长转换成的定时器16位数
        Xt0=65536-1000000*t0;  //低电平的时长转换成的定时器16位数
        TMOD=0X01;
        TR0=1;
        h1=(uchar)(Xt1>>8);     //高电平高八位保存
        l1=(uchar)Xt1;                //高电平低八位保存
        h0=(uchar)(Xt0>>8);     //低电平高八位保存
        l0=(uchar)Xt0;                //低电平低八位保存
                ssz1;
                xszt(w,e);
        while(1)
        {
        TH0=h1;
        TL0=l1;
        while(!TF0);        
        pm=!pm;
                pl=!pl;
        TF0=0;
        TH0=h0;
        TL0=l0;
        while(!TF0);
        pm=1;
                pl=1;
        TF0=0;  
//                q++;
//                if(q>100){djqg;q=0;xswd();}
                if(k1==0)
                {
                djqg;
                while(k1==0){xswd();};
                break;
                }
                if(k2==0)
        {
                while(k2==0){djqg;xswd();};w++;if(w==3){w=0;}
                xszt(w,e);
        }
                if(w==0){ssz1;}else if(w==1){nsz1;}else{tz1;}
               
                if(k3==0)
        {
                while(k3==0){djqg;xswd();};e++;if(e==3){e=0;}
                xszt(w,e);
        }
                if(e==0){ssz2;}else if(e==1){nsz2;}else{tz2;}
        }               
}
uchar ggzkb(uchar w)//更改占空比程序
{
                        uchar q,e;
                        q=w;
                        zl(0,0x01);
                        while(1)
        {
                        if(k1==0){while(k1==0);break;}
                        if((q>0)&&(k2==0)){q--;}
                        if((q<98)&&(k3==0)){q++;}
                        xszf(0,0,"zkb");
                        zl(1,szf[q/10]);
                        zl(1,szf[q%10]);
                        zl(1,'%');
                        e++;
                        if(e>10)
                {
                        e=0;
                        xswd();
                }
        }
                        djqg;
                        return q;
}
uint ggpl(uint w)//更改频率程序
{
                        uint q,e;
                        q=w;
                        zl(0,0x01);
                        while(1)
        {
                        if(k1==0){while(k1==0);break;}
                        if((q>0)&&(k2==0)){q--;}
                        if((q<9998)&&(k3==0)){q++;}
                        zl(0,0xc0+5);
                        zl(1,szf[q/1000]);
                        zl(1,szf[q%1000/100]);
                        zl(1,szf[q%100/10]);
                        zl(1,szf[q%10]);
                        zl(1,'H');
                        zl(1,'z');
                        e++;
                        if(e>10)
                {
                        e=0;
                        xswd();
                }
        }
                        djqg;
                        return q;
}
void main()//主程序
{
        uchar q,w=50;  
                uint e=100;
                csh1602();
                djqg;
                xszf(0,0,"System");
                xszf(1,1,"initialization");
                for(q=0;q<10;q++){xswd();}//显示初始温度
                zl(0,0x01);
                xswd();
                djqg;
                while(1)
        {
                xszf(0,0,"zkb");
                zl(1,szf[w/10]);
                zl(1,szf[w%10]);
                zl(1,'%');
                zl(0,0xc0+5);
                zl(1,szf[e/1000]);
                zl(1,szf[e%1000/100]);
                zl(1,szf[e%100/10]);
                zl(1,szf[e%10]);
                zl(1,'H');
                zl(1,'z');
                plzkbtj(w,e);
                w=ggzkb(w);
                e=ggpl(e);
        }
}[/mw_shl_code]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
高级模式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|泰骏兴电子科技有限公司 ( 粤ICP备2023060260号-1 ) 单片机爱好者

GMT+8, 2026-10-11 06:04

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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