Ⅰ 怎麼用單片機控制直流電機調速
用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的高速單片機。