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 } /**************************************************/ /**********蜂鸣器报警**********************/ 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]='