导航:首页 > 操作系统 > 单片机里的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相关的资料

热点内容
php取文本长度 浏览:408
公交车供电电压转为单片机 浏览:106
电流单片机 浏览:124
算法中ceil代表什么 浏览:491
内核源码超频 浏览:226
怎样把图片文件夹转化为压缩包 浏览:462
程序员概率题 浏览:268
东营银行app限额在哪里设置 浏览:483
word虚拟打印pdf 浏览:737
pdf画面 浏览:888
文件夹常用命令 浏览:205
被调侃的程序员 浏览:495
哪里有无损音乐app下载 浏览:223
单片机如何使用proteus 浏览:995
java常用的服务器 浏览:285
集结APP在哪里下载 浏览:800
欧洲cf玩什么服务器 浏览:535
如何连接另一台电脑上的共享文件夹 浏览:681
如何让桌面文件夹搬家到e盘 浏览:73
java自动格式化 浏览:627