单片机PWM直流电机调速显示转速

发布者:平稳心绪最新更新时间:2020-03-02 来源: 51hei关键字:单片机  PWM  直流电机调速  显示转速 手机看文章 扫描二维码
随时随地手机看文章

PWM直流电机调速仿真原理图如下
 

Altium Designer画的PWM直流电机调速原理图和PCB图如下:

PWM直流电机调速单片机程序如下

#include

#include

#include "LCD1602.h"


#define uchar unsigned char

#define uint  unsigned int

/**********端口分配*******************************/

sbit add_key=P1^0;  //占空比加

sbit dec_key=P1^1;  //占空比减

sbit z_key=P1^2;  //正转键

sbit f_key=P1^3;  //反转键

sbit run_key=P1^4; //启动/停止键

                  

sbit beep=P3^2;

//电机驱动相关

sbit ENA=P3^5;

sbit IN1=P3^7;

sbit IN2=P3^4;

/**********变量定义*******************************/

//电机相关定义

bit Rotation_f=0;  //步进电机旋转状态标志  为0正转  1反转


bit power_flag=0;  //总开关标志


#define  PWM_cnt_LEN 100  //计数全长

#define PWM_ON  1        //开  

#define PWM_OFF 0        //关

uint PWM_cnt;  //PWM计数

uchar PWM_duty;  //PWM占空比


uint speed_cnt=0;  //转速

uint speed_value;

bit dis_speed_flag=0;

uint delay_cnt;

uchar dis_buf[6];

uchar dis_cnt;

uchar dis_buf1[4];

uchar dis_cnt1;

/*********定义延时1ms子程序************************/

void delay1ms(uint t)//1ms延时子程序

{

    uint k,j;

        for(k=0;k                for(j=0;j<120;j++);

}

/**************************************************/

/**********蜂鸣器报警**********************/

void beep_alarm()

{

        beep=0;

        delay1ms(100);

        beep=1;

}

/*******************************************/

/**********电机停止********************/

void motor_stop()

{

        IN1=1;

        IN2=1;

}

/***************************************/

/*******电机正转********************/

void motor_foreward()

{

        IN1=1;

        IN2=0;

}

/************************************/

/********电机反转**********************/

void motor_reversal()

{

        IN1=0;

        IN2=1;

}

/*****************************************/

/************显示转速*********************/

void dis_speed()

{

        dis_cnt=0;

        if(speed_value/10000!=0)

        {

                dis_buf[dis_cnt]=speed_value/10000+0x30;

                dis_cnt++;

                dis_buf[dis_cnt]=speed_value%10000/1000+0x30;

                dis_cnt++;

                dis_buf[dis_cnt]=speed_value%1000/100+0x30;

                dis_cnt++;

                dis_buf[dis_cnt]=speed_value%100/10+0x30;

                dis_cnt++;

                dis_buf[dis_cnt]=speed_value%10+0x30;

                dis_cnt++;

        }

        else if(speed_value%10000/1000!=0)

        {

                dis_buf[dis_cnt]=' ';

                dis_cnt++;

                dis_buf[dis_cnt]=speed_value%10000/1000+0x30;

                dis_cnt++;

                dis_buf[dis_cnt]=speed_value%1000/100+0x30;

                dis_cnt++;

                dis_buf[dis_cnt]=speed_value%100/10+0x30;

                dis_cnt++;

                dis_buf[dis_cnt]=speed_value%10+0x30;

                dis_cnt++;

        }

        else if(speed_value%1000/100!=0)

        {

                dis_buf[dis_cnt]=' ';

                dis_cnt++;

                dis_buf[dis_cnt]=' ';

                dis_cnt++;

                dis_buf[dis_cnt]=speed_value%1000/100+0x30;

                dis_cnt++;

                dis_buf[dis_cnt]=speed_value%100/10+0x30;

                dis_cnt++;

                dis_buf[dis_cnt]=speed_value%10+0x30;

                dis_cnt++;

        }

        else if(speed_value%100/10!=0)

        {

                dis_buf[dis_cnt]=' ';

                dis_cnt++;

                dis_buf[dis_cnt]=' ';

                dis_cnt++;

                dis_buf[dis_cnt]=' ';

                dis_cnt++;

                dis_buf[dis_cnt]=speed_value%100/10+0x30;

                dis_cnt++;

                dis_buf[dis_cnt]=speed_value%10+0x30;

                dis_cnt++;

        }

        else

        {

                dis_buf[dis_cnt]=' ';

                dis_cnt++;

                dis_buf[dis_cnt]=' ';

                dis_cnt++;

                dis_buf[dis_cnt]=' ';

                dis_cnt++;

                dis_buf[dis_cnt]=' ';

                dis_cnt++;

                dis_buf[dis_cnt]=speed_value%10+0x30;

                dis_cnt++;

        }

        dis_buf[dis_cnt]='';

        LCD1602_Print(2,0,dis_buf);        //显示转速

}

/*****************************************/

/**********显示占空比*********************/

void dis_duty()

{

    dis_cnt1=0;

        if(PWM_duty/100!=0)

        {

                dis_buf1[dis_cnt1]=PWM_duty/100+0x30;

                dis_cnt1++;

                dis_buf1[dis_cnt1]=PWM_duty%100/10+0x30;

                dis_cnt1++;

                dis_buf1[dis_cnt1]=PWM_duty%10+0x30;

                dis_cnt1++;

        }

        else if(PWM_duty%100/10!=0)

        {

                dis_buf1[dis_cnt1]=' ';

                dis_cnt1++;

                dis_buf1[dis_cnt1]=PWM_duty%100/10+0x30;

                dis_cnt1++;

                dis_buf1[dis_cnt1]=PWM_duty%10+0x30;

                dis_cnt1++;

        }

        else

        {

                dis_buf1[dis_cnt1]=' ';

                dis_cnt1++;

                dis_buf1[dis_cnt1]=' ';

                dis_cnt1++;

                dis_buf1[dis_cnt1]=PWM_duty%10+0x30;

                dis_cnt1++;

        }

        dis_buf1[dis_cnt1]='';

        LCD1602_Print(9,1,dis_buf1);        //显示占空比

}

/*****************************************/

/*************定时器初始化程序*******************/

void timer_init(void)  

{

        TMOD=0x11; //设置定时器0,1为16位模式

        TH0=0xD8;  //10ms定时初值         10ms  D8F0           

        TL0=0xF0;

        ET0=1;     //定时器0中断开

        TR0=1;     //开定时器0


        TH1=0xFF;  //100us定时初值

        TL1=0x9C;

        ET1=1;     //定时器1中断开

        TR1=1;     //开定时器1

        EA=1;      //总中断开

}

/*************************************************/

/***********定时器0中断服务程序*******************/

void timer0(void) interrupt 1  

{

        TH0=0xD8;  //10ms定时初值 10ms  D8F0

        TL0=0xF0;

        delay_cnt++;

        if(delay_cnt>=200)  //2S计时

        {

                delay_cnt=0;

                speed_value=speed_cnt*30;  //30  将两秒内的计数乘以30得到转每分          (还要除2  因为有两片磁铁)  30/2=15

[1] [2]
关键字:单片机  PWM  直流电机调速  显示转速 引用地址:单片机PWM直流电机调速显示转速

上一篇:4*4矩阵按键《行列反转法》扫描依次显示0-f
下一篇:基于STC15单片机的循迹避障遥控车

推荐阅读最新更新时间:2024-11-17 11:13

STC Monitor-51的单片机在线仿真调试
引言 当今很多院校中,单片机的教学仍以经典的51内核单片机为主。其实验与应用开发中最重要的环节是软、硬件综合调试,通常采用的方法主要有两种:一种是使用仿真器,优点是功能齐全,但是价格较高,一般厂家研发采用;另一种是使用软件仿真和芯片直接烧写验证的方法,其成本虽然低,但在程序或硬件出现疑难问题时,很难找到原因。 实际上,还有一种成本低且具有在线仿真调试功能的技术是在线仿真调试,它特别适合初学者。 在线仿真调试 是指:通过Keil C51编译器,结合单片机中的监控程序,对系统的应用程序和硬件进行仿真调试,可以让单片机以单步、断点、全速等运行模式来执行程序。在线仿真调试是单片机应用开发过程中的高效方法,国内STC公司的51内核单片机IA
[单片机]
STC Monitor-51的<font color='red'>单片机</font>在线仿真调试
单片机远程语音报警系统
1 硬件电路设计 screen.width-500){this.style.width=screen.width-500};" border=0> 系统工作过程: 单片机AT89C51采集设备的各种信息,根据不同设备和传感器,可以是压力、流量、温湿度、电压、电流等,然后与预先存储在单片机内的阈值比较,若超出正常范围,则通过电话机拨号电路拨打维护人员的固定或移动电话,等待拨通后再控制ISD4004构成的数码语音电路播放相对应的故障信息。维护人员听到信息后根据故障优先级作相应处理。 1.1 语音电路 ISD4004 语音芯片是由美国ISD公司推出的新产品,单片录放语音时间8-16min,操作简单,音质好。芯片内含振荡
[单片机]
<font color='red'>单片机</font>远程语音报警系统
51单片机之键盘扫描方式程序讲解
按键扫描程序 上电时, 点亮P00口LED 按下K1时, LED向右移一位 按下K2时, LED向左移一位 #include reg51.h #include intrins.h unsigned char scan_key(); void proc_key(unsigned char key_v); void delayms(un
[单片机]
51单片机串口通信
这节我们主要讲单片机上串口的工作原理和如何通过程序来对串口进行设置,以及根据所给出的实例实现与PC 机通信。 一、原理简介 51 单片机内部有一个全双工串行接口。什么叫全双工串口呢?一般来说,只能接受或只能发送的称为单工串行;既可接收又可发送,但不能同时进行的称为半双工;能同时接收和发送的串行口称为全双工串行口。串行通信是指数据一位一位地按顺序传送的通信方式,其突出优点是只需一根传输线,可大大降低硬件成本,适合远距离通信。其缺点是传输速度较低。 与之前一样,首先我们来了解单片机串口相关的寄存器。 SBUF 寄存器:它是两个在物理上独立的接收、发送缓冲器,可同时发送、接收数据,可通过指令对SBUF 的读写来区别是对接收缓冲器
[单片机]
51<font color='red'>单片机</font>串口通信
基于MSP430F435单片机的血糖仪系统设计
目前市场上的血糖仪种类繁多,结构外形各异,价格和精度也大相径庭;且价格和精度难以兼得。原因在于没有找到一款合适的微处理器。另外,出于屏幕尺寸的限制,界面普遍采用英文字符显示,这给中国病人带来一定的困惑。 随着电子技术的发展,微处理器功能日益增强,价格日趋降低。有必要选出一款功能强大而价格便宜的微处理器来重新设计血糖仪。本系统选用的MSP430系列微处理器使上述设想成为可能。 原理 血糖仪是根据电生物化学原理——施加一定电压于经酶反应后的血液产生的电流会随着血液中的血糖浓度的增加而增加——设计的。通过精确测量出这些微弱电流,并根据电流值和血糖浓度的关系,反算出相应的浓度。所以,确定这个关系是问题的核心。但其关系复杂,受多方面
[单片机]
基于MSP430F435<font color='red'>单片机</font>的血糖仪系统设计
单片机开关机的实现
很多时候我们需要实现设备的开关机,而比较常用的方法有硬件开关的开关机和纯粹的软件开关机。硬件开关机一般都是用拨码式的硬件开关实现,缺点是占用空间比较大,外观不美观。而单纯的软件开关无法实现真正的关机,只是单片机进入睡眠或者休眠状态,存在耗电等问题。 为了解决这些问题,有时候我们不得不进行软硬件结合,实现一键开关机。一键开关机其原理简单,具体原理图如下: 具体的工作原理如下: 按下按键开关K1时,Q3导通,产生低电平,导致Q1也导通,通过电源接口或者电池为DC2DC供电,单片机及其负载可以正常工作,同时单片机读取按键断开电平,知道按键按下,为PWR_IO产生一个高电平,为按键释放后Q3的基极提
[单片机]
<font color='red'>单片机</font>开关机的实现
基于51单片机的无线供电模块的无线传输系统效率检测
1引言 无线供电是一种方便、安全的供电装置,之间不需要任何物理连接,当发送端产生的振荡磁场 频率 和接收端的固有频率相同时,接收端就产生共振,从而实现了能量的传输。现在已经用于一些小的家电中,也许在不久的将来将用于室内供电和城市的供电,彻底代替电线,应用前景广泛。本文主要阐述近距离无线供电,具有低功耗、安全等特点,通过单片机检测 更好的增加了它的可靠性。 2系统方案设计 无线供电演示装置的设计制作。该电路由电源发射电路、接收电路、检测显示电路三部分组成 。 2.1方案论证与选择 方案1:震荡电路 发射电路用NE555产生可以调节频率的对称方波,接L298放大和恒流源模块产生 电压 12v、频率20M
[单片机]
基于51<font color='red'>单片机</font>的无线供电模块的无线传输系统效率检测
基于单片机和串行总线技术的热量表设计
  我国居民取暖计量收费已是大势所趋,但也是一个热点、难点问题。计量准确与否直接关系到热量的合理收费和用户的切身利益,也关系到供热事业的生存和发展。热量表是用于测量热交换系统中载热流体释放热量多少的计量器具,用法定计量单位显示热量。   热量表   热量计量框图如图1。 图1 热量计量框图   将经过严格配对的温度传感器,分别安装于热交换回路的入口和出口的管道上;流量传感器安装于出口或入口管道上。配对温度传感器检测热交换系统进口和出口流体的温度,流量传感器检测流经热交换系统的流量。微控制器将采集到的温度、流量数据进行处理,计算出热交换系统所释放的热量,并进行存储或显示。热量表主要由温度检测、流量检测和微控制器组成。
[单片机]
基于<font color='red'>单片机</font>和串行总线技术的热量表设计
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved