Ⅰ 怎么用单片机控制直流电机调速
用PWM或DAC都可以,工业现场这两种都有用到,根据你的具体情况进行选择,PWM的要仔细选择频率,并且做好滤波和抗干扰;用DAC的话成本相对来说会稍高,但干扰较小.
如果是做试验,用玩具小马达的话,直接用三极管以PWM来控制就可以了.
Ⅱ 基于单片机的直流电机PWM调速控制(要单片机的代码)快啊
; PWM 控制 LED 灯渐亮渐灭程序 *
; 利用定时器控制产生占空比可变的 PWM 波 *
; 按K1,PWM值增加,则占空比减小,LED 灯渐暗。 *
; 按K2,PWM值减小,则占空比增加,LED 灯渐亮。 *
;当PWM值增加到最大值或减小到最小值时,蜂鸣器将报警 *
;资源:p0口,8路指示灯。p1.4,p1.5亮度控制按键(端口按键)p3.7小喇叭报警 *
;----
PWM EQU 7FH ;PWM赋初始值
OUT EQU P0 ;8个LED灯的接口
INCKEY EQU P1.4 ;K1,PWM值增加键。
DECKEY EQU P1.5 ;K2,PWM值减小键。
BEEP EQU P3.7
;----
ORG 0000H
SJMP START
ORG 000BH
SJMP INTT0
ORG 001BH
SJMP INTT1
ORG 0030H
;----
;主程序
;定时器0工作在模式1,定时器1工作在模式2。
;----
START:
MOV SP,#30H
MOV TMOD,#21H
MOV TH1,PWM ;脉宽调节
MOV TL1,#00H
MOV TH0,#0FCH ;1ms延时常数
MOV TL0,#066H ;频率调节
SETB EA
SETB ET0
SETB ET1
SETB TR0
LOOP: MOV A,PWM ;
JB INCKEY,LOOP1 ;增加键是否按下?
CALL DELAY ;延时去抖动
JB INCKEY,LOOP1
CJNE A,#0FFH,PWMINC ;是否到最大值?
CALL BEEP_BL ;是,蜂鸣器报警。
SJMP LOOP
PWMINC:
INC PWM ;调节脉宽(脉宽减小)
SJMP LOOP
LOOP1: JB DECKEY,LOOP2 ;减小键是否按下?
CALL DELAY ;延时去抖动
JB DECKEY,LOOP2
CJNE A,#02H,PWMDEC ;是否到最小值?
CALL BEEP_BL ;是,蜂鸣器报警。
SJMP LOOP
PWMDEC:
DEC PWM ;调节脉宽(脉宽增加)
LOOP2: SJMP LOOP
;----
;T0中断服务子程序 (频率)
;控制定时器1中断
;----
INTT0:
CLR TR1
MOV TH0,#0FCH ;1ms延时常数
MOV TL0,#066H ;频率调节
MOV TH1,PWM
SETB TR1
MOV OUT,#00H ;启动输出
RETI
;----
;T1中断服务子程序 (脉宽)
;控制PWM脉冲宽度
;----
INTT1:
CLR TR1 ;脉宽调节结束
MOV OUT,#0FFH ;结束输出
RETI
;----
;10ms延时子程序
;----
DELAY:
MOV R6,#50
DELAY1:
MOV R7,#100
DJNZ R7,$
DJNZ R6,DELAY1
RET
;----
;蜂鸣器响一声子程序
;---
BEEP_BL:
MOV R6,#100
BL1: CALL BL2
CPL BEEP
DJNZ R6,BL1
MOV R5,#25
CALL DELAY2
RET
BL2: MOV R7,#180
BL3: NOP
DJNZ R7,BL3
RET
DELAY2: ;延时R5×10MS
MOV R6,#50
BL4: MOV R7,#100
BL5: DJNZ R7,BL5
DJNZ R6,BL4
DJNZ R5,DELAY2
RET
;---
END
Ⅲ 单片机控制直流电机怎么调速,怎么编程
用pwm来调速,不过不同型号的单片机代码不同,我这个是mega128的8位!
#include <mega128.h>
void delly(unsigned char A);
void drlly(unsigned char B);
void main(void)
{ DDRB=0xff;
//PORTB=0xff;
delly(1);
drlly(1);
}
void delly(unsigned char A)
{TCCR0=0x00;
ASSR=0x01;
TCNT0=A;
OCR0=255-A;
// TIFR=0X03;
TCCR0=0X7a;
// while(!(TIFR&0x02));
}
void drlly(unsigned char B)
{TCCR2=0x00;
ASSR=0x01;
TCNT2=B;
OCR2=255-B;
// TIFR=0X03;
TCCR2=0X7a;
// while(!(TIFR&0x02));
}
Ⅳ 用单片机对直流电机调速的程序
#include<reg52.h> unsigned char pwm_val_right =0;//
变量定义
unsigned char push_val_right=0;//
右电机占空比
N/10
bit Right_moto_stop=1;
unsigned
int
time=0;
sbit k1=P3^5;
sbit k2=P3^4;
sbit Right_moto_pwm=P1^2;
sbit IN1=P1^0;
sbit IN2=P1^1;
/************************************************************************/
void delay(unsigned int k)
//
延时函数
{
unsigned int x,y;
for(x=0;x<k;x++)
for(y=0;y<2000;y++);
}
/************************************************************************/
void
run() //前进函数
{
push_val_right =10;
//PWM
调节参数
1-10
1为最慢,
10是最快
改这个值可
以改变其速度
IN1=0;
IN2=1;
}
/************************************************************************/
void
run_1() //前进函数
{
push_val_right =3;
//PWM
调节参数1-10
1为最慢,10是最快
改这个值可以改变其速度
IN1=0;
IN2=1;
}
/************************************************************************/
/*
PWM调制电机转速
*/
/************************************************************************/
/******************************************************************/
/*
右电机调速
*/
void pwm_out_right_moto(void)
{
if(Right_moto_stop)
{
if(pwm_val_right<=push_val_right)
Right_moto_pwm=1;
else
Right_moto_pwm=0;
if(pwm_val_right>=10)
pwm_val_right=0;
}
else
Right_moto_pwm=0;
}
void main(void)
{
TMOD=0X01;
TH0= 0XF8;
//1ms
定时
TL0= 0X30;
TR0= 1;
ET0= 1;
EA = 1;
while(1)
{
//
此处函数自己写
}
}
/***************************************************/
/*TIMER0
中断服务子函数产生
PWM
信号
*/
/***************************************************/
void timer0() interrupt 1
using 2
{
TH0=0XF8;
//1Ms定时
TL0=0X30;
time++;
pwm_val_right++;
pwm_out_right_moto();
}
Ⅳ 51单片机实现直流电机PWM调速,为什么要用定时器
直流电机的PWM调速,就是改变在一个周期里的通电时间,和断电时间的比,即占空比,而通电时间+断电时间=一个周期,这都是用时间来决定的,当然要用定时器。
Ⅵ 51单片机直流电机调速
第一:你这个不是电机调速的,用外部中断是测速的呀。
下面是我写的.PID部分的代码就不给了,想加的话,自己找可以了
#include <AT89X52.H>
#include "common.h"
#define _WHEEL_C_
#define Left_moto_pwm P1_5
#define Right_moto_pwm P1_4
#define Left_moto_go {IN1=0,IN2=1;}
#define Left_moto_back {IN1=1,IN2=0;}
#define Right_moto_go {IN3=1,IN4=0;}
#define Right_moto_back {IN3=0,IN4=1;}
sbit IN1=P1^0;
sbit IN2=P1^1;
sbit IN3=P1^2;
sbit IN4=P1^3;
unsigned char pwm_val_left=0;
unsigned char push_val_left=0;
unsigned char pwm_val_right=0;
unsigned char push_val_right=0;
float L_Count=0,R_Count=0;
unsigned int TimerNum=0,SYS_TimeNum=0;
float Save_L_Distance=0,Save_R_Distance=0,Left_Speed=0,Right_Speed=0;
unsigned char Left_point=0,Right_point=0;
unsigned char sys_1ms=0,sys_1s=0,TurnFlag=0;
//初始化PWM调速函数
void Init_Wheel()
{
TMOD = 0x01;
TH0 = 0x0FF;
TL0 = 0x0A4;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void Init_WheelSpeedInter()
{
IT0=1; //INT0下降沿中断
EX0=1; //允许INT1中断
IT1=1; //INT1下降沿中断
EX1=1; //允许INT1中断
EA=1;
}
//得到上一次0.5秒的行驶距离
float GetLeftWheelMileage()
{
return Save_L_Distance;
}
//得到上一次0.25秒的行驶距离
float GetRightWheelMileage()
{
return Save_R_Distance;
}
void Inter_Left(void) interrupt 0
{
L_Count++;
}
void Inter_Right(void) interrupt 2
{
R_Count++;
}
//小车向前函数
void Wheel_Run(char left_val,char right_val)
{
push_val_left=left_val;
push_val_right=right_val;
Left_moto_go ;
Right_moto_go ;
}
//小车后退函数
void Wheel_Back(char left_val,char right_val)
{
push_val_left=left_val;
push_val_right=right_val;
Left_moto_back;
Right_moto_back;
}
//小车停止函数
void Wheel_Stop(void)
{
Wheel_Run(0,0);
}
//左轮PWM调速函数
void pwm_out_left_moto(void)
{
if(pwm_val_left>200)
{
pwm_val_left=0;
}else
{
if(pwm_val_left<=push_val_left)
{
Left_moto_pwm=1;
}
else
{
Left_moto_pwm=0;
}
}
}
//右轮调速函数
void pwm_out_right_moto(void)
{
if(pwm_val_right>200)
{
pwm_val_right=0;
}else
{
if(pwm_val_right<=push_val_right)
{
Right_moto_pwm=1;
}
else
Right_moto_pwm=0;
}
}
//PWM调速中断(TIMER0--工作方式1)
void Wheel_Interrupt(void) interrupt 1
{
TH0 = 0x0FF;
TL0 = 0x0A4;
TimerNum++;
if(TimerNum>=2500)
{
//左右轮速度cm/s
Left_Speed=4*L_Count;
Right_Speed=4*R_Count;
//左右轮0.25秒行驶距离
Save_L_Distance+=L_Count;
Save_R_Distance+=R_Count;
//数据发送到串口图示
DataScope_Get_Channel_Data(L_Count, 1 ); //将数据 1.0 写入通道 1
DataScope_Get_Channel_Data(R_Count, 2 ); //将数据 2.0 写入通道 2
Send_Count = DataScope_Data_Generate(2); //生成10个通道的 格式化帧数据,返回帧数据长度
for( DateNum = 0 ; DateNum < Send_Count; DateNum++) //循环发送,直到发送完毕
{
SendByte(DataScope_OutPut_Buffer[DateNum]);
}
TimerNum=0;
L_Count=0;
R_Count=0;
}
pwm_val_left++;
pwm_val_right++;
pwm_out_left_moto();
pwm_out_right_moto();
}
Ⅶ 用单片机控制直流电机调速的原理,思路,设计图等等
你为什么要补充说不报什么希望呢?心巴凉巴凉~
不知道你为什么会问这个问题,直流电机调速基本原理是比较简单的(相对于交流电机),只要改变电机的电压就可以改变转速了。
改变电压的方法很多,最常见的一定是PWM脉宽调制,调节电机的输入占空比就可以控制电机的平均电压,控制转速。
电机调速一般分为三个级,控制级,驱动级和反馈级。
单片机属于前端的控制级,只需要能够产生可调的PWM波形就可以(很多单片机都有专用PWM输出功能,有定时器就能做到)。
驱动级,在控制级后。因为单片机弱电不能直接驱动电机这样的强电,所以需要用功率开关器件(如MOSFET等)来驱动电机。基本思路就是通过弱点控制强电。
通常,驱动级和控制级还需要电气隔离(光耦器件)保证安全。
反馈级是为了实现精确调速的。一般是电流反馈,也有用转速反馈的,也有电流转速双闭环反馈控制的。
PWM输出的占空比具体是多少由单片机通过反馈的信息综合运算得到(是负反馈控制)。
基本思路如上,具体的原理图要看你具体的电机(类型不同,输入电压不同,功率不同原理图各异)。
希望没让你失望,心还是心巴凉巴凉的~呵呵
Ⅷ 51单片机直流电机调速问题
if(K1=0) 使用错误,应该是if(K1==0)
满意请采纳
Ⅸ 52单片机实现控制直流电机调速(C语言)
pwm波,控制占空比硬件需要电机驱动芯片比如298PWM输出脚P1.1脚:#define
out
P1^1占空比全局变量
unsigned
char
ZKB;
//ZKB=1~100即1%~100%void
moto_control(){unsigned
char
i;for(i=0;i<100;i++){if(i==0)out=1;if(i==ZKB)out=0;}}
Ⅹ 单片机PWM直流电机调速
扩展一个定时芯片8253.可以有3路定时器,2s实现方法:定时器设置定时长度为50ms,在定时器中断里面计数,就是让一个变量,在这个中断里面+1,当这个变量=20的时候,就是1秒了,程序里面判断这个数是否=20,如果是,则跳转到反转程序,否则正转。
单片机: 单片机,全称单片微型计算机(英语:Single-Chip Microcomputer),又称微控制器(Microcontroller),是把中央处理器、存储器、定时/计数器(Timer/Counter)、各种输入输出接口等都集成在一块集成电路芯片上的微型计算机。与应用在个人电脑中的通用型微处理器相比,它更强调自供应(不用外接硬件)和节约成本。它的最大优点是体积小,可放在仪表内部,但存储量小,输入输出接口简单,功能较低。由于其发展非常迅速,旧的单片机的定义已不能满足,所以在很多应用场合被称为范围更广的微控制器;从上世纪80年代,由当时的4位、8位单片机,发展到现在的32位300M的高速单片机。