導航:首頁 > 操作系統 > 單片機里的motor

單片機里的motor

發布時間:2022-07-03 15:17:53

單片機控制直流電機,以下程序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型三極體截止,直流電機停止轉動。

(4)單片機里的motor擴展閱讀:

通過單片機產生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將會容納更多角度而不溢出。

Ⅵ 單片機中所有元器件的名稱是什麼

Ⅶ 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.

閱讀全文

與單片機里的motor相關的資料

熱點內容
海龜編輯器積木編程怎麼安裝 瀏覽:183
程序員理發店生意怎麼樣 瀏覽:601
程序員羅技 瀏覽:180
軟考初級程序員課程2021下載 瀏覽:487
杭州程序員奶奶 瀏覽:878
不聽命令造成錯誤 瀏覽:979
kool系統源碼 瀏覽:608
流氓app在哪裡看 瀏覽:98
域名購買了怎麼指向伺服器 瀏覽:121
安卓手機如何讓照片顏色反轉 瀏覽:859
怎麼下載卓睿安手機版 瀏覽:514
h3crange命令 瀏覽:468
php前景和python 瀏覽:338
php壓縮圖片內存大小 瀏覽:495
在哪裡可以查看雲伺服器的信息 瀏覽:70
python讀取非txt文件 瀏覽:799
艾莫迅用什麼編程軟體好 瀏覽:227
android文件存儲讀取 瀏覽:214
php基礎教程第5版 瀏覽:543
伺服器裡面怎麼刷東西 瀏覽:194