久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2997|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

關(guān)于單片機(jī)直流電機(jī)轉(zhuǎn)速測(cè)量與控制的請(qǐng)教

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
各位大佬好,我有幾個(gè)問(wèn)題想請(qǐng)教大家。

為什么我在proteus仿真中直流電機(jī)最大轉(zhuǎn)速只能是166r/m。請(qǐng)問(wèn)這是和占空比有關(guān)系嗎?我的占空比設(shè)置的是0~100,或者是和代碼中哪一部分有關(guān)呢?

當(dāng)我預(yù)設(shè)速度是(setspeed)是155r/m是,通過(guò)INT0輸入脈沖計(jì)算的轉(zhuǎn)速是(nowspeed)是150r/m或者165r/m。請(qǐng)問(wèn)這是和我使用的是頻率法計(jì)算有關(guān)嗎?
轉(zhuǎn)速n=60M/TP.  (在規(guī)定時(shí)間T內(nèi),測(cè)量輸入脈沖個(gè)數(shù)M,P是指對(duì)于每轉(zhuǎn)有P個(gè)脈沖)。Proteus中我選擇的是motor-encoder 每圈輸出P=2個(gè)脈沖,規(guī)定時(shí)間T=2s。所以我個(gè)人的理解是60*M/2.0*2.0。因?yàn)轭l率法導(dǎo)致的起始時(shí)間與轉(zhuǎn)速信號(hào)脈沖的不完全一致造成的±1個(gè)脈沖的丟失。 (比如60*5/4-60*4/4=15)所以導(dǎo)致轉(zhuǎn)速是150r/m和165r/m。 所以頻率法更適合高速運(yùn)轉(zhuǎn)的電機(jī)。但是為啥我的proteus中直流電機(jī)最高只能是166r/m呢?

我表達(dá)的可能不是特清楚,還請(qǐng)大家賜教~,別噴我,謝謝。代碼有借鑒大家的。
#include<reg51.h>
sbit Motor_ENA=P1^4; //L298N驅(qū)動(dòng)引腳
sbit Motor_IN1=P1^0;
sbit Motor_IN2=P1^2;
sbit LCD_RS=P3^6;
sbit LCD_EN=P3^7;
sbit LCD_RW=P3^5;
sbit S1=P2^0;
sbit S2=P2^1;
sbit S3=P2^2;
sbit S4=P2^3;
sbit S5=P2^4;
#define uchar unsigned char
#define uint unsigned int
uint AA,count=0,flag;  //AA:定時(shí)器0中斷次數(shù);count:INT0中斷次數(shù)
void timer();         //定時(shí)器初始化
void InitLCD();       //顯示屏初始化
void KeyDown();       //按鍵程序
unsigned int PID();
void SendCommandToLCD(unsigned char LCDCommand);
void SendDataToLCD(unsigned char LCDData);
void delay1(unsigned int i);
void Display();
void LCD1602DisplayString(unsigned char Disposition,unsigned char *pointer);
void DisplayNumber(unsigned int DisplayData,unsigned char StartPosition,unsigned char Longth_Number);
void DisplayNumber1(unsigned int DisplayData1,unsigned char StartPosition1,unsigned char Longth_Number1);
float kp=0.30,ki=0.05,kd=0.01;  //PI
unsigned int SpeedSet=115;  //初始轉(zhuǎn)速
uint CurrentSpeed;   //當(dāng)前轉(zhuǎn)速
unsigned char pid_val_mid;  //占空比調(diào)整
unsigned int lastError=0;
long int sumError=0; //sumError偏差和
/**************************************************************
延遲函數(shù)
**************************************************************/
void delay1(unsigned int i)
{
   unsigned int j;
      for(;i>0;i--)
     for(j=0;j<20;j++);
}
/**************************************************************
main
**************************************************************/
void main()
{
timer(); //定時(shí)器初始化
InitLCD(); //LCD初始化
while(1)
{
KeyDown();    //按鍵控制程序
Display();    //LCD顯示程序
}
}
/*****************************************************************
void timer() 定時(shí)器,中斷初始化
定時(shí)器0:計(jì)時(shí)    定時(shí)器1:PWM控制
*****************************************************************/
void timer()
{
  TMOD=0x11; //定時(shí)器0 ,定時(shí)器1 工作方式1
  TH0=(65536-50000)/256;  //50ms初值
  TL0=(65536-50000)%256;
  TH1=0xfc;  //1ms PWM控制
  TL1=0x66;
  //TH1=(65536-50)/256;
  //TL1=(65536-50)%256;
  TR1=1;     //????????1
  ET1=1;     //????????1?ж????
  IT0=1;    //???ж?0????????
  EX0=1;    //?????ж?INT0????
  TR0=1;    //????????0
  ET0=1;    //????????0?ж????
  EA=1;     //
}
/*****************************************************************
InitLCD() LCD初始化
*****************************************************************/
void InitLCD()
{
LCD_RW=0;
SendCommandToLCD(0x38);
SendCommandToLCD(0x0c);
SendCommandToLCD(0x06);
SendCommandToLCD(0x01);
LCD1602DisplayString(0x80,"SetSpeed");
LCD1602DisplayString(0xC0,"NowSpeed");
}
/*****************************************************************************
LCD1602DisplayStr
******************************************************************************/
void LCD1602DisplayString(unsigned char Disposition,unsigned char *pointer)
{
SendCommandToLCD(Disposition);
while(*pointer!='\0')
{
  SendDataToLCD(*pointer++);
}
}
/******************************************************************
void Timer0_isr() interrupt 1
定時(shí)器0中斷
*******************************************************************/
void Timer0() interrupt 1
{
AA++;
//TH0=0x4b;
//TL0=0xfe;
TH0=(65536-50000)/256;
TL1=(65536-50000)%256;
if(AA==39)
{
   CurrentSpeed=(count*60.0)/(2.0*2.0);   //一分鐘的轉(zhuǎn)速,2.0:一轉(zhuǎn)有兩個(gè)脈沖,AA==39是2秒
   count=0;
   AA=0;
   PID();
  }
}
/*******************************************************************
void key_int() interrupt0
外部中斷INT0
********************************************************************/
void key_int() interrupt 0
{
   count++;
}
/********************************************************************
void Timer1() interrupt 3
定時(shí)器1中斷
*********************************************************************/
void Timer1() interrupt 3
{
   static int c=0;
   TH1=0xfc;
   TL1=0x66;
   //TH1=(65536-50)/256;
   //TL1=(65536-50)%256;
   c++;  
   if(c<=pid_val_mid) Motor_ENA=1;
   if(c>pid_val_mid) Motor_ENA=0;
   if(c>=100)  c=0;
}
/******************************************************************
void KeyDown
電機(jī)控制程序
******************************************************************/
void KeyDown()
{
   if(S1==0)    //正轉(zhuǎn)
   {
    delay1(2);
if(S1==0)
  {
  Motor_IN1=1;
  Motor_IN2=0;
  }
}
if(S2==0)   //反轉(zhuǎn)
{
  delay1(2);
   if(S2==0)
   {
    Motor_IN1=0;
    Motor_IN2=1;
    }
  }
  if(S3==0)   //停車
  {
    delay1(2);
    if(S3==0)
     {
   Motor_IN1=0;
   Motor_IN2=0;
  }
   }
   if(S4==0)
   {
     delay1(2);
  if(S4==0)
  {
   SpeedSet+=10;  //設(shè)定速度+10
  }
    }
    if(S5==0)
    {
     delay1(2);
    if(S5==0)
  {
   SpeedSet-=10;   //設(shè)定速度-10
  }
     }
     
}
/**************************************************************
PID控制
**************************************************************/
unsigned int PID()
{
  int dError=0,Error=0,B;
  Error=SpeedSet-CurrentSpeed;  //當(dāng)前誤差
  sumError=Error+sumError; //誤差和
  dError=Error-lastError; //誤差偏差
  lastError=Error;
  B=kp*Error+ki*sumError+kd*dError;
  if(B>100) pid_val_mid=100;
  if(B<0) pid_val_mid=0;
  if(B>=0&&B<=100) pid_val_mid=B;
  return(0);
}
/***************************************************************
LCD1602
寫(xiě)命令函數(shù)
*****************************************************************/
void SendCommandToLCD(unsigned char LCDCommand)
{
P0=LCDCommand;
LCD_RS=0;
delay1(2);
LCD_EN=1;
delay1(2);
LCD_EN=0;
delay1(2);
}
/*****************************************************************
LCD1602
寫(xiě)數(shù)據(jù)函數(shù)
******************************************************************/
void SendDataToLCD(unsigned char LCDData)
{
P0=LCDData;
LCD_RS=1;
delay1(2);
LCD_EN=1;
delay1(2);
LCD_EN=0;
delay1(2);
}
/********************************************************************
void display
*********************************************************************/
void Display()
{
  DisplayNumber(SpeedSet*10,8,5);
  DisplayNumber1(CurrentSpeed*10,8,5); //因?yàn)橐_到小數(shù)點(diǎn)后一位,所以我先*10

}

/*********************************************************************
void DisplayNumber() 預(yù)設(shè)轉(zhuǎn)速顯示 Setspeed
**********************************************************************/
void DisplayNumber(unsigned int DisplayData,unsigned char StartPosition,unsigned char Longth_Number)
{
   unsigned char i=0;

SendCommandToLCD(0x80+StartPosition+7);   //小數(shù)位
SendDataToLCD(DisplayData%10+0x30);
DisplayData=DisplayData/10;
SendCommandToLCD(0x80+StartPosition+6);   //0x2E顯示小數(shù)點(diǎn)
SendDataToLCD(0x2e);
   
for(i=Longth_Number;i>0;i--)
{
  SendCommandToLCD(0x80+StartPosition+i);
  SendDataToLCD(DisplayData%10+0x30);
  DisplayData=DisplayData/10;
}
}
/**********************************************************************
void DisplayNumber2() 實(shí)時(shí)轉(zhuǎn)速顯示CurrentSpeed
***********************************************************************/
void DisplayNumber1(unsigned int DisplayData1,unsigned char StartPosition1,unsigned char Longth_Number1)
{
   unsigned char a=0;
   SendCommandToLCD(0xC0+StartPosition1+7);   //小數(shù)位
   SendDataToLCD(DisplayData1%10+0x30);
   DisplayData1=DisplayData1/10;
   SendCommandToLCD(0xC0+StartPosition1+6);   //0x2E
   SendDataToLCD(0x2e);
   
   for(a=Longth_Number1;a>0;a--)
   {
   SendCommandToLCD(0xC0+StartPosition1+a);
   SendDataToLCD(DisplayData1%10+0x30);
   DisplayData1=DisplayData1/10;
   }
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:746195 發(fā)表于 2020-5-7 16:05 | 只看該作者
樓主你好,我現(xiàn)在也在做這方面的的設(shè)計(jì),想需要你的資料參考一下
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 色爱综合网| 亚洲午夜小视频 | 天天操夜夜操免费视频 | 在线亚州 | 97伦理电影网 | 亚洲成av人影片在线观看 | 久久久久国产精品免费免费搜索 | 精品久久久久香蕉网 | 欧美精品一区二区三区在线播放 | 激情欧美日韩一区二区 | 亚洲中午字幕 | 精品亚洲一区二区三区四区五区高 | 成人亚洲视频 | 在线成人av | 一区二区久久电影 | 天天综合网永久 | 国产亚洲精品综合一区 | 超碰人人插 | 99热在线免费 | 日韩毛片在线视频 | 一区二区三区国产好 | 欧美成视频| 久久视频免费看 | 亚洲电影一区二区三区 | 午夜国产羞羞视频免费网站 | 国产成人精品免费视频大全最热 | 中文字幕在线观看第一页 | 男女网站免费观看 | 中文字幕一区二区三区四区五区 | 精品欧美一区二区在线观看 | 亚洲精品二三区 | 91精品国产日韩91久久久久久 | 欧洲视频一区二区 | 欧美日韩高清一区 | 国产成人99 | 欧美一级在线 | 精品国产乱码久久久久久中文 | www.youjizz.com日韩| 黑人巨大精品欧美一区二区免费 | 国产精品av久久久久久久久久 | 亚洲一区二区网站 |