×
单片机 > 单片机程序设计 > 详情

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

发布时间:2020-08-25 发布时间:
|

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;      //总中断开

}

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


关键字:单片机  PWM  直流电机调速  显示转速 


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈AVR中定时器几种工作模式