欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
單片機步進電機程序問題
[打印本頁]
作者:
馬濤
時間:
2021-3-2 12:34
標題:
單片機步進電機程序問題
請問這里unsigned int MotorDelay,Speed=1,TIM,CT;中的TIM和CT分別代表什么意思?還有A = 0; //0xf1
b = 1;
C = 1;
D = 1;
A=0,B=1表示什么意思?0XF1是怎么來的求求大神
單片機源程序如下:
/*************************************************************************************
* 標題: 步進電機試驗一 *
* *
* 通過本例程了解步進馬達使用及驅動程序編寫 *
*; 單雙八拍工作方式: *
*; A-AB-B-BC-C-CD-D-DA (即一個脈沖,轉 3.75 度) *
* J14短路冒需斷開 *
* 請學員一定要消化掉本例程 *
*
**************************************************************************************/
#include "reg52.h"
//Motor
sbit A = P1^0; //定義管腳
sbit b = P1^1;
sbit C = P1^2;
sbit D = P1^3;
///////////////////////////////////////
//步進電機驅動
unsigned char MotorStep=0;
unsigned int MotorTimer = 0;
unsigned int MotorDelay,Speed=1,TIM,CT;
#define speed 8 // 調整速度 數值不要設的太低 低了會引起震動。
/*****************************************************
* 初始化馬達 *
******************************************************/
void InitMotor()
{
A = 1;
b = 1;
C = 1;
D = 1;
}
void SetMotor()
{
// if(Speed == 0) return;
MotorDelay=Speed; //調整速度
switch(MotorStep)
{
case 0:
if(TIM) // A
{
A = 0; //0xf1
b = 1;
C = 1;
D = 1;
MotorStep = 1;
TIM=0;
}
break;
case 1: // AB
if(TIM)
{
A = 0; //0xf3
b = 0;
C = 1;
D = 1;
MotorStep = 2;
TIM=0;
}
break;
case 2: //B
if(TIM)
{
A = 1;
b = 0; //0xf2
C = 1;
D = 1;
MotorStep = 3;
TIM=0;
}
break;
case 3: //BC
if(TIM)
{
A = 1;
b = 0; //0xf6
C = 0;
D = 1;
MotorStep = 4;
TIM=0;
}
break;
case 4: //C
if(TIM)
{
A = 1;
b = 1; //0xf4
C = 0;
D = 1;
MotorStep = 5;
TIM=0;
}
break;
case 5: //CD
if(TIM)
{
A = 1;
b = 1; //0xfc
C = 0;
D = 0;
MotorStep = 6;
TIM=0;
}
break;
case 6: //D
if(TIM)
{
A = 1;
b = 1; //0xf8
C = 1;
D = 0;
MotorStep = 7;
TIM=0;
}
break;
case 7: //DA
if(TIM)
{
A = 0;
b = 1; //0xf9
C = 1;
D = 0;
MotorStep = 0;
TIM=0;
}
break;
}
}
void system_Ini()
{
TMOD|= 0x11;
TH0=0xDC; //11.0592M
TL0=0x00;
IE = 0x8A;
TR0 = 1;
}
main()
{ system_Ini();
InitMotor();
while(1)
{
SetMotor();
}
}
/************************************************
* *
* 定時中斷延時 *
************************************************/
void Tzd(void) interrupt 1
{
TH0 = 0xfe; //11.0592
TL0 = 0x33;
if( CT++==speed)
{TIM=1;
CT=0;
}
}
復制代碼
作者:
Penpen123
時間:
2021-3-3 09:04
首先你要理解四線兩相步進電機控制原理哈。ABCD代表四線,一般AB為1相,CD為2相。分別按順序置位A-AB-B-BC-C-CD-D-DA,一共八步驟位。這是背景。
然后看回代碼第13行,ABCD分別對應P1端口的0~3bit,而4~7bit并沒用。
再看代碼39行整個SetMotor函數
步驟1置位A: 則是P1口:11110001,轉為16進制就是0xF1
步驟2置位AB:則是P1口:11110011,轉為16進制就是0xF3
步驟3置位B: 則是P1口:11110010,轉為16進制就是0xF2
后面如此類推。
而TIM只是一個標志位,=1:可以控制電機執行下一個步驟位 =0:不允許執行
CT則是記錄時間用的,>speed:可以置位TIM1,<speed:未可以置位TIM
也就是說,CT和speed控制了電機步驟位轉移的頻率,TIM決定電機在while循環里是否可以轉到下一步驟位。
作者:
ZXWPL
時間:
2021-3-3 09:46
TIM是你自己定義的變量,就是用來計時的,每speed個中斷TIM=1;電機就走一步 MotorStep步數+1,8步走完。 A-AB-B-BC-C-CD-D-DA 。一共ABCD,4根線,按照這個順序,你程序寫的第一步A就是只有A=0(低電平),BCD沒寫出來的就是1(高電平),此時P1=11111110=0xfe才對。 至于后面備注了0xf1則是因為,步進電機初始化為P1=0xF0,這個時候第一步就是A寫1,即P1=11110001=0xf1。實際上后面的備注與你的程序并不符合
作者:
design003
時間:
2021-3-3 09:50
樓上解答的非常好,做單片機系統需要對被控對象很熟悉的,我一直認為單片機系統開發的重點在硬件 程序是處理事情的C語言具現 所以 還是 回過頭來再補學 一些基礎的好,重來一次手邊有實物容易太多了
作者:
wulin
時間:
2021-3-3 11:20
A、B、C、D已被定義為P1口的低4位,只要按A-AB-B-BC-C-CD-D-DA順序輸出驅動信號即可。由于IO口與電機之間有驅動管反相放大,當P1口的低4位輸出1110,經反相就成0001,原作者只是用16進制的方式注釋表示電機端的電平狀態。其高4位的實際狀態是0或f不必過于糾結。其余7個注釋同理不贅述。
作者:
robinsonlin
時間:
2021-3-3 12:03
步進電機驅動的問題。關于步進電機的驅動可以簡單分為兩類。
1,通過控制芯片驅動,這時,只用對驅動芯片發送脈沖信號(脈沖的快慢決定電機的運行速度,當然還要看你的細分),發送方向信號dir,發送使能信號en,控制芯片就會給步進電機功率驅動信號。 這個功率驅動信號的原型,就是你程序中的a,b,c,d對應的電平邏輯值。
2,通過單片機io口和放大電路驅動。 步進電機的驅動是需要節拍的, 你程序中switch(MotoStep)語句,就是在產生節拍, 然后通過定時器控制CT自加來控制產生節拍的速度。這種驅動方式是很早期的,現在基本上不用了。
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1