Ⅰ 單片機控制直流電機,以下程序MOTOR_CONTROL對應的I/O口輸出電壓為什麼只有3V
你好!
輸出/強上拉電壓只有3?
若是這樣需要關注
1.需要加驅電路?
2,系統是5.單片機本身引腳設置.負載是否太大,單片機不能驅動;上拉/
我的回答你還滿意嗎~~
Ⅱ PROTEUS里的MOTOR-PWMSERVO電機有三根接線口不管怎麼接電機就是不轉,誰能告訴我這是怎麼回事
電機不轉動的原因:
脈沖幅值為1v不足以驅動電機,應該調整為5v,另外注意
servo-motor的脈沖周期范圍是否包括激勵源的周期。
Ⅲ proteus模擬單片機測速中,motor encoder作為脈沖源就顯示轉速一直為0是為什麼!
你接motor encode的左邊或右邊引出線,就沒有問題了。中間那根線一圈發一個脈沖,如果速度很低的話,可能被舍掉了。
Ⅳ 如何用單片機控制直流電機
通過與單片機相連的按鍵控制直流電機停啟的電路如下圖所示,通過P3.6口按鍵觸發啟動直流電機,P3.7口的按鍵觸發停止直流電機的運行。由圖可知,當P1.0輸出高電平「1」時,NPN型三極體導通,直流電機得電轉動;當P1.0輸出低電平「0」時,NPN型三極體截止,直流電機停止轉動。
通過單片機產生PWM波控制直流電機程序
#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
uchar code table[10]={0x3f,0x06,0x5b,
0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共陰數碼管顯示碼(0-9)
sbit xiaoshudian=P0^7;
sbit wei1=P2^4; //數碼管位選定義
sbit wei2=P2^5;
sbit wei3=P2^6;
sbit wei4=P2^7;
sbit beep=P2^3; //蜂鳴器控制端
sbit motor = P1^0; //電機控制
sbit s1_jiasu = P1^4; //加速按鍵
sbit s2_jiansu= P1^5; //減速按鍵
sbit s3_jiting=P1^6; //停止/開始按鍵
uint pulse_count; //INT0接收到的脈沖數
uint num=0; //num相當於占空比調節的精度
uchar speed[3]; //四位速度值存儲
float bianhuasu; //當前速度(理論計算值)
float reallyspeed; //實際測得的速度
float vv_min=0.0;vv_max=250.0;
float vi_Ref=60.0; //給定值
float vi_PreError,vi_PreDerror;
uint pwm=100; //相當於占空比標志變數
int sample_time=0; //采樣標志
float v_kp=1.2,v_ki=0.6,v_kd=0.2; //比例,積分,微分常數
void delay (uint z)
{
uint x,y;
for(x=z;x>0;x--)
for (y=20;y>0;y--);
}
void time_init()
{
ET1=1; //允許定時器T1中斷
ET0=1; //允許定時器T0中斷
TMOD = 0x15; //定時器0計數,模式1;定時器1定時,模式1
TH1 = (65536-100)/256; //定時器1值,負責PID中斷 ,0.1ms定時
TL1 = (65536-100)%6;
TR0 = 1; //開定時器
TR1 = 1;
IP=0X08; //定時器1為高優級
EA=1; //開總中斷
}
void keyscan()
{
float j;
if(s1_jiasu==0) //加速
{
delay(20);
if(s1_jiasu==0)
vi_Ref+=10;
j=vi_Ref;
}
while(s1_jiasu==0);
if(s2_jiansu==0) //減速
{
delay(20);
if(s2_jiansu==0)
vi_Ref-=10;
j=vi_Ref;
}
while(s2_jiansu==0);
if(s3_jiting==0)
{
delay(20);
motor=0;
P1=0X00;
P3=0X00;
P0=0x00;
}
while(s3_jiting==0);
}
float v_PIDCalc(float vi_Ref,float vi_SpeedBack)
{
register float error1,d_error,dd_error;
error1=vi_Ref-vi_SpeedBack; //偏差的計算
d_error=error1-vi_PreError; //誤差的偏差
dd_error=d_error-vi_PreDerror; //誤差變化率
vi_PreError=error1; //存儲當前偏差
vi_PreDerror=d_error;
bianhuasu=(v_kp*d_error+v_ki*vi_PreError+v_kd*dd_error);
return (bianhuasu);
}
void v_Display()
{
uint su;
su=(int)(reallyspeed*10); //乘以10之後強制轉化成整型
speed[3]=su/1000; //百位
speed[2]=(su00)/100; //十位
speed[1]=(su0)/10; //個位
speed[0]=su; //小數點後一位
wei1=0; //第一位打開
P0=table[speed[3]];
delay(5);
wei1=1; //第一位關閉
wei2=0;
P0=table[speed[2]];
delay(5);
wei2=1;
wei3=0;
P0=table[speed[1]];
xiaoshudian=1;
delay(5);
wei3=1;
wei4=0;
P0=table[speed[0]];
delay(5);
wei4=1;
}
void BEEP()
{
if((reallyspeed)>=vi_Ref+5||(reallyspeed
{
beep=~beep;
delay(4);
}
}
void main()
{
time_init();
motor=0;
while(1)
{
v_Display();
BEEP();
}
if(s3_jiting==0) //對按鍵3進行掃描,增強急停效果
{
delay(20);
motor=0;
P1=0X00;
P3=0X00;
P0=0x00;
}
while(s3_jiting==0);
}
void timer0() interrupt 1
{
}
void timer1() interrupt 3
{
TH1 = (65536-100)/256; //1ms定時
TL1 = (65536-100)%6;
sample_time++;
if(sample_time==5000) //采樣時間0.1ms*5000=0.5s
{
TR0=0; //關閉定時器0
sample_time=0;
pulse_count=TH0*255+TL0; //保存當前脈沖數
keyscan(); //掃描按鍵
reallyspeed=pulse_count/(4*0.6); //計算速度
pwm=pwm+v_PIDCalc(vi_Ref,reallyspeed);
if(pwm
if(pwm>100)pwm=100;
TH0=TL0=0;
TR0=1; //開啟定時器0
}
num++;
if(num==pwm) //此處的num值,就是占空比
{
motor=0;
}
if(num==100) //100相當於占空比調節的精度
{
num=0;
motor=1;
}
}
Ⅳ 怎樣用單片機控制步進電機轉速
那我們讓電機正轉一圈,反轉半圈,在正傳1/4圈,反轉一圈,試試。
#include <reg51.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
typedef unsigned long uint32;
#define P_DIR 0
#define N_DIR 1
code uint8 FFW[8]={0xF1,0xF3,0xF2,0xF6,0xF4,0xFc,0xF8,0xF9};
void delay(uint16 i)
{
while (i--);
}
void motor_turn(uint16 angle, uint8 dir)
{
uint32 n=4096;
uint8 i;
n /= 360; //1度所需指令數
n *= angle; //angle度所需指令數
if (dir == P_DIR) //正轉
{
i = 7;
while (n--) //循環n次指令數
{
P1 = FFW[i];
if (i == 0)
i = 7;
else
i--;
delay(200);
}
}
else if (dir == N_DIR) //反轉
{
i = 0;
while (n--)
{
P1 = FFW[i];
if (i == 7)
i = 0;
else
i++;
delay(200);///調節轉速快慢
}
}
}
main()
{
while (1)
{
motor_turn(360, P_DIR);
motor_turn(180, N_DIR);
motor_turn(90, P_DIR);
motor_turn(360, N_DIR);
}
}
這個程序主要講一下motor_turn裡面的數據處理部分,不曉得大家是否看懂了。由於電機的旋轉一周需要的指令個數是8*8*64=4096,所以旋轉一度需要的指令數為4096/360,那麼我要旋轉N度,要發送的指令數為N*4096/360,看看是不是和程序里寫的一樣呢。當然,如果你約分的話,N將會容納更多角度而不溢出。
Ⅵ 單片機中所有元器件的名稱是什麼
AND 與門
ANTENNA 天線
BATTERY 直流電源
BELL 鈴,鍾
BVC 同軸電纜接插件
BRIDEG 1 整流橋(二極體)
BRIDEG 2 整流橋(集成塊)
BUFFER 緩沖器
BUZZER 蜂鳴器
CAP 電容
CAPACITOR 電容
CAPACITOR POL 有極性電容
CAPVAR 可調電容
CIRCUIT BREAKER 熔斷絲
COAX 同軸電纜
CON 插口
CRYSTAL 晶體整盪器
DB 並行插口
DIODE 二極體
DIODE SCHOTTKY 穩壓二極體
DIODE VARACTOR 變容二極體
3SEG 3段LED
7SEG 7段LED
7SEG_DP 7段LED(帶小數點)
ELECTRO 電解電容
FUSE 熔斷器
INDUCTOR 電感
INDUCTOR IRON 帶鐵芯電感
INDUCTOR3 可調電感
JFET N N溝道場效應管
JFET P P溝道場效應管
LAMP 燈泡
LAMP NEDN 起輝器
LED 發光二極體
METER 儀表
MICROPHONE 麥克風
MOSFET MOS管
MOTOR AC 交流電機
MOTOR SERVO 伺服電機
NAND 與非門
NOR 或非門
NOT 非門
NPN NPN三極體
Ⅶ Proteus單片機控制直流電機測速部分 74LS386 編碼電機motor-encoder
可以參考之前我的回答:proteus motor-encoder有五根線,左右兩側兩根線接電源。下面三根線,左右兩側兩根線輸出相位差90度的脈沖,每旋轉一圈輸出多少個脈沖可以在設置對話框中設置,中間那根線,每圈輸出一個脈沖。motor-encoder的電源電壓可以在設置框中設置。轉速顯示的單位是rpm.有單片機開發控制器訂做問題或許我這可以幫助的。
Ⅷ 單片機步進式電機程序分析
這個需要知道幾個數據的值才能計算。
首先要知道步進電機是幾相幾拍,步進角是多少(也就是每一步所走的角度);
然後要知道延時程序的延時時間是多少,這樣就可以計算了。
舉個例子:有一款四相四拍步進角為7.5℃的步進電機,以四相八拍工作,每一步延時時間是10ms。
那麼,每步轉角度為3.75℃,就是說電機每轉一圈需要的步數=360/3.75=96步
1s中走一百步,一分鍾就是6000步,那麼一分鍾轉的圈數=6000/96=62.5
所以轉數為62.5r/min.