當前位置:首頁 » 編程語言 » S型加減速演算法c語言
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

S型加減速演算法c語言

發布時間: 2023-02-08 02:26:34

1. 用c語言程序實現步進電機的正反轉加減速的編程

內容:1、本程序用於測試4相步進電機常規驅動
2、需要用跳帽或者杜邦線把信號輸出端和對應的步進電機信號輸入端連接起來
3、速度不可以調節的過快,不然就沒有力矩轉動了
4、按s4(設置成獨立按鍵模式)可以控制正反轉
------------------------------------------------*/

#include <reg52.h>

bit Flag;//定義正反轉標志位

unsigned char code F_Rotation[4]={0xf1,0xf2,0xf4,0xf8}; //正轉表格
unsigned char code B_Rotation[4]={0xf8,0xf4,0xf2,0xf1}; //反轉表格
/******************************************************************/
/* 延時函數 */
/******************************************************************/
void Delay(unsigned int i)//延時
{
while(--i);
}
/******************************************************************/
/* 主函數 */
/******************************************************************/
main()
{

unsigned char i;

EX1=1; //外部中斷0開
IT1=1; //邊沿觸發
EA=1; //全局中斷開

while(!Flag)
{
P0=0x71;//顯示 F 標示正轉
for(i=0;i<4;i++) //4相
{
P1=F_Rotation[i]; //輸出對應的相 可以自行換成反轉表格
Delay(500); //改變這個參數可以調整電機轉速 ,數字越小,轉速越大
}
}
while(Flag)
{
P0=0x7C;//顯示 b 標示反轉
for(i=0;i<4;i++) //4相
{
P1=B_Rotation[i]; //輸出對應的相
Delay(500); //改變這個參數可以調整電機轉速 ,數字越小,轉速越大
}
}
}
/******************************************************************/
/* 中斷入口函數 */
/******************************************************************/
void ISR_Key(void) interrupt 2 using 1
{
Delay(300);

Flag=!Flag; //s3按下觸發一次,標志位取反

}

2. C51 C語言怎麼實現42步進電機加速、減速控制

42步進電機是一個兩相電機,一般控制可以分為全步或半步控制,全步控制,每一切換相序,步進電機走1.8度,半步控制則走0.9度。
全步控制相序分配為:A,/A,B,/B
半步控制相序分配為:A,AB,B,B/A,/A,/A/B,/B,/BA
加速的話,就使相序切換快一點就可以;當然減速就是相序切換慢點就行。舉例如下:
#include<reg51.h>
#define uchar unsigned char
uchar stepd[]={0x01,0x03,0x02,0x06,0x04,0xc0,0x08,0x09};
uchar num=0,fx=0;
sbit keyup=P3^0;
sbit keydn=P3^1;
sbit keyfx=P3^2;
int speed=10000;
void t0isr() interrupt 1
{
TH0=(65536-speed)/256;
TL0=(65536-speed)%256;
P2=stepd[num];
if(fx==0){num++;num%=8;}
if(fx==1)
{
if(num==0)num=7;
else num--;
}
}
main()
{
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TR0=1;
ET0=1;
EA=1;
while(1)
{
if(keyup==0)
{
while(key1==0);
speed-=10;
}
if(keydn==0)
{
while(keydn==0);
speed+=10;
}
if(key3==0)
{
while(key3==0);
fx=~fx;
}
}
}

3. 51單片機步進電機加減速的c語言 。求答案

#include "reg52.h"
void delay(unsigned int t);
//Motor
sbit F1 = P1^0;
sbit F2 = P1^1;
sbit F3 = P1^2;
sbit F4 = P1^3;
unsigned char code FFW[8]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6}; //反轉
unsigned char code FFZ[8]={0xf6,0xf7,0xf3,0xfb,0xf9,0xfd,0xfc,0xfe}; //正轉
unsigned int K;

/**********************************************************************
* *
* 步進電機驅動 *
* *
***********************************************************************/
void motor_ffw()
{
unsigned char i;
unsigned int j;
for (j=0; j<12; j++) //轉1*n圈
{
for (i=0; i<8; i++) //一個周期轉30度
{
if(K==1) P1 = FFW[i]&0x1f; //取數據
if(K==2) P1 = FFZ[i]&0x1f;
delay(15); //調節轉速
}
}
}
/******************************************************
*
* 延時程序
*
********************************************************/
void delay(unsigned int t)
{
unsigned int k;
while(t--)
{
for(k=0; k<100; k++)
{ }
}
}

main()
{
while(1)
{
K=1;
motor_ffw();
K=2;
motor_ffw();
}
}

給你個例子,這是正反轉的可以用這個修改出加減速程序

求採納為滿意回答。

4. C語言 指針問題

使用的指針函數

考慮到題中說的是小朋友學習100以內正整數的簡單運算

所以考慮到了被減數 大於 減速 ,除數不為0,整除的情況

代碼如下:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#include<conio.h>

charexpression[10];
char*p=expression;
intresult;
char*GetRandomExpression();

intmain()
{
char*p1;
inti,count=1;
charch;

printf("請輸入下列算式的結果: ");
while(1)
{

p1=GetRandomExpression();
printf("第%d題:%s",count,p1);
scanf("%d",&i);
if(i==result)
printf("恭喜!您答對了 ");
else
printf("抱歉!您答錯了 ");

printf("是否繼續?(按Y繼續,其他任意鍵結束):");
ch=getch();
if(ch=='Y'||ch=='y')
{
printf("您選擇了繼續 ");
count++;
}
else
{
printf("您選擇了退出 ");
break;
}
}
}

char*GetRandomExpression()
{
intnum1,num2,index;
charop[]="-+*/";

srand(time(NULL));
num1=rand()%100+1;
num2=rand()%100+1;

if(num1<num2)
index=rand()%3+1;//保證被減數大於減速
else
index=rand()%4;
switch(index)
{

case0:
result=num1-num2;
break;

case1:
result=num1+num2;
break;

case2:
result=num1*num2;
break;

case3:
while(num2==0||num1>100||num1%num2!=0)//保證除數不為0,且可以整除
{
result=rand()%100+1;
num2=rand()%100+1;
num1=num2*result;
}
break;
}
sprintf(expression,"%d%c%d=",num1,op[index],num2);

returnp;
}

5. surf演算法C語言編寫,要做嵌入式開發,不要C++和基於OPENCV的

surf借鑒了sift中簡化近似的思想,將DOH中的高斯二階微分模板進行了近似簡化,使得模板對圖像的濾波只需要進行幾個簡單的加減法運算,並且,這種運算與濾波模板的尺寸有關。實驗證明surf演算法較sift演算法在運算速度上要快3倍左右。
1積分圖像
surf演算法中要用到積分圖像的概念。藉助積分圖像,圖像與高斯二階微分模板的濾波轉化為對積分圖像的加減運算。積分圖像(IntegralImage)的概念是由viola和Jones提出來的,而將類似積分圖像用於盒子濾波是由Simard等人提出。
積分圖像中任意一點(i,j)的值為ii(i,j)為原圖像左上角到任意點(i,j)相應的對角線區域灰度值的總和即:
公式中,I(x`,y`)表示原圖像中點(i`,j`)的灰度值,ii(x,y)可以由下面兩公式迭代計算得到:
公式中,S(x,y)表示一列的積分,且S(i,-1)=0,ii(-1,j)=0.求積分圖像,只需對原圖像的所有像素素進行一遍掃描。下面的代碼為c++語言的實現
pOutImage[0][0]=pInImage[0][0];
for(intx=1,x<nWidth;i++)
{
pOutImage[x][0]=pInImage[x-1][0]+pInImage[x][0];
}
for(inty=1;y<nHeight;y++)
{
intnSum=0;
for(intx=0;x<nWidth;x++)
{
nSum=pInImage[x][y];
pOutImage[x][y]=pInImage[x][y-1]+nSum;
}
}
如圖表示,在求取窗口w內的像元灰度和時,不管窗口W的大小如何,均可利用積分圖像的4個對應點(i1,j1)(i2,j2)(i3,j3)(i4,j4)的值計算的到。也就是說,求取窗口W內的像元灰度和與窗口的尺寸是無關的。窗口W內的像元的灰度和為
Sum(W)=ii(i4,j4)-ii(i2,j2)-ii(i3,j3)+ii(i1,j1)
下面看以截圖,相信都可以看懂
關於矩形區域內像素點的求和應該是一種簡單重復性運算,採用這種思路總體上提高了效率。為什麼這么說呢?假設一幅圖片共有n個像素點,則計算n個位置的積分圖總共的加法運算有n-1次(注意:可不是次哦,要充分利用遞推思想),將這些結果保存在一個跟原圖對應的矩陣M中。當需要計算圖像中某個矩形區域內的所有像素之和是直接像查表一樣,調出A,B,C,D四點的積分圖值,簡單的加減法(注意只需要三次哦)即可得到結果。反之,如果採用naive的方式直接在原圖像中的某個矩形區域內求和,你想想,總共可能的矩形組合有多少?!!且對於一幅圖像n那是相當大啊,所以2^n
那可是天文數字,而且這裡面絕大部分的矩形有重疊,重疊意味著什麼?在算求和的時候有重復性的工作,其實我們是可以有效的利用已經計算過的信息的。這就是積分圖法的內在思想:它實際上是先計算n個互不重疊(專業點說是不相交)的矩形區域內的像素點求和,充分利用這些值(已有值)計算未知值,有點類似遞推的味道...這就完全避免了重復求和運算。
這樣就可以進行2種運算:
(1)任意矩形區域內像素積分。由圖像的積分圖可方便快速地計算圖像中任意矩形內所有像素灰度積分。如下圖2.3所示,點1的積分圖像ii1的值為(其中Sum為求和):
ii1=Sum(A)

同理,點2、點3、點4的積分圖像分別為:
ii2=Sum(A)+Sum(B);ii3=Sum(A)+Sum(C);ii4=Sum(A)+Sum(B)+Sum(C)+Sum(D);
矩形區域D內的所有像素灰度積分可由矩形端點的積分圖像值得到:
Sum(D)=ii1+ii4-(ii2+ii3)(1)
(2)特徵值計算
矩形特徵的特徵值是兩個不同的矩形區域像素和之差,由(1)式可以計算任意矩形特徵的特徵值,下面以圖2.1中特徵原型A為例說明特徵值的計算。

如圖2.4所示,該特徵原型的特徵值定義為:

Sum(A)-Sum(B)

根據(1)式則有:Sum(A)=ii4+ii1-(ii2+ii3);Sum(B)=ii6+ii3-(ii4+ii5);

所以此類特徵原型的特徵值為:

(ii4-ii3)-(ii2-ii1)+(ii4-ii3)-(ii6-ii5)

另示:運用積分圖可以快速計算給定的矩形之所有象素值之和Sum(r)。假設r=(x,y,w,h),那麼此矩形內部所有元素之和等價於下面積分圖中下面這個式子:

Sum(r)=ii(x+w,y+h)+ii(x-1,y-1)-ii(x+w,y-1)-ii(x-1,y+h)

由此可見,矩形特徵特徵值計算只與此特徵端點的積分圖有關,而與圖像坐標值無關。對於同一類型的矩形特徵,不管特徵的尺度和位置如何,特徵值的計算所耗費的時間都是常量,而且都只是簡單的加減運算。其它類型的特徵值計算方法類似。

6. 沒有勻速怎麼計算加減速時間

可以,不過要看你求什麼平均速度。先以勻變速直線運動為例,加速度勻速改變a=k*t(k為常數),此時速度-時間曲線為二次曲線v=a*t=k*t^2,曲線和t軸所圍的面積就是位移大小。此時有兩個平均速度,一個為中間時刻的速度,叫做物體速度的算術平均數,另一個為中間位移速度,此時刻左右兩個面積相等。稱為該速度的幾何平均數。第一種速度簡單易求,不多說。
第二種用解微分方程:(高三掌握導數後可以對其驗證)
s=f(v)dt;(註:f(v)dt表示速度v對時間t的積分)
可以得到s=k*t^3/3+C(C為任意常數,如果初始位移為0,C等於0)
比如時間是3秒,那麼總位移為9k,一半位移為9/2(k),求得t=3/2^(1/3),此時速度為v=k*9/2^(2/3)。
註:上面這個方法為通解方法,對於其他更一般的運動也同樣適用。

7. 一個關於單片機控制步進電機的C語言程序 想請高人幫我把每一步都注釋出來

C語言程序源代碼
#include <REGX51.H> // 51寄存器定義
#include "intrins.h"
#define control P1 //P1_0:A相,P1_1:B相,P1_2:C相,P1_3:D相
#define discode P0 //顯示代碼控制埠
#define uchar unsigned char //定義無符號型變數
#define uint unsigned int
sbit en_dm=P3^0; //顯示代碼鎖存控制
sbit en_wk=P3^1; //位控鎖存控制
uchar code corotation[4]= {0x03,0x06,0x0c,0x09};//電機正轉
uchar code rollback[4]={0x0c,0x06,0x03,0x09}; //電機反轉
uchar code tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//顯示欄位
uint code Levspeed[5]={500,400,300,200,100};//電機速度等級
uchar Hscan,speedcount;//Hscan行掃描,speedcount 速度等級計數
uint uu; //頻率計數
uint step,setstep; //step:電機步伐計數,setstep:手動設置電機步伐
uint speed=500; //電機初始速度
uchar count;
uchar flag[5];
uchar butcount; //按鍵次數
//****************************************
//flag[0] 正轉標志
//flag[1] 反轉標志
//flag[2] 加速標志
//flag[3] 減速標志
//flag[4] 設置標志
//****************************************
Delay1mS(unsigned int tt) //延時1ms 「Delay1mS」延時子程序,用循環語句延時。
{
unsigned char i;
while(tt--)
for(i=113;i>0;i--);
}
keyscan() //鍵盤掃描 「keyscan」鍵盤掃描子程序,用於尋找是否有按鍵按下。
{
P2=0xf0; //把oxfe賦值給P2口 //將按鍵控制口置於未按鍵的狀態.單片機輸出//口假設不是按鍵按下狀態.
if(P2!=0xf0) //如果P2口的值不等於0xfe //檢查是否有按鍵按下.如果有,處理{}內的事
{ //有按鍵按下.
Delay1mS(150);//調用延時函數//有按鍵按下,避開無效讀碼值的時間.,或者是脈沖長度
Hscan=0xfe; //將Hscan賦值,初始遙控值是要置高電平的.
P2=Hscan; //
while((Hscan&0x10)!=0) //檢查X10口是否有鍵按下。未按下是1,
//在這顯示出你的按鍵口是P2_4.即檢查P2_4是高電平,無//鍵按下,低電平有鍵按下。
{
P2=Hscan;
if((P2&0xf0)!=0xf0) //檢查按鍵脈沖是否是變化,
return P2;
else Hscan=(Hscan<<1)|0x01; //這里在存碼值,應該是遙控輸入。將碼值存入Hscan
//這里是讀取碼值的關鍵,如果來的脈沖不管是高電平//還是低電平,靠左移一位保存脈沖的狀態值.
}
}
else return 0;
}
key_val() //按鍵處理函數 //這里是讀取將存好的碼值進行處理.看是什麼代碼值
{
uchar key;
key= keyscan(); //這里是讀取碼值並存放在key里
switch(key) //這里是對比讀取的碼值
{
case 0xee: //按鍵『7』 //讀取的碼值=0xEE,則是按鍵「7」的代碼
//while(P2==0xee);
setstep=setstep*10+7; //步伐數 //這里是輸入」setstep +7」 步伐數對比讀取的碼值, //setstep原來可能是有數字的。
step=setstep;
butcount++; //計數,看輸入拉幾個數字
if(butcount>=5) //輸入的數字超過5個就置0,無效
{
butcount=0;
setstep=0;
}
break;
case 0xde: //按鍵『8』 //讀取的碼值=0xdE,則是按鍵「8」的代碼
//其他同」7」
//while(P2==0xde);
setstep=setstep*10+8;
butcount++;
step=setstep;
if(butcount>=5)
{
butcount=0;
setstep=0;
}
break;
case 0xbe: //按鍵『9』 //同上」7」
//while(P2==0xbe);
setstep=setstep*10+9;
butcount++;
step=setstep;
if(butcount>=5)
{
butcount=0;
setstep=0;
}
break;
case 0x7e: //按鍵『正轉 //正轉按鍵識別
while(P2==0x7e); //等待按鍵松開//一值按住電機是不轉的,放開後才轉.有檢查//P2口的狀態值
flag[0]=0xff; //開啟正轉標志,關閉反轉//置正轉標志.
flag[1]=0x00; //清除反轉標志.
butcount=0;
speedcount=0;
speed=500; //置電機的轉速.
if(!flag[4]) step=0;
TR0=1;
break;
case 0xed: //按鍵『4』 //同上」7」
while(P2==0xed);
setstep=setstep*10+4;
butcount++;
step=setstep;
if(butcount>=5)
{
butcount=0;
setstep=0;
}
break;
case 0xdd: //按鍵『5』 //同上」7」
//while(P2==0xdd);
setstep=setstep*10+5;
step=setstep;
butcount++;
if(butcount>=5)
{
butcount=0;
setstep=0;
}
break;

8. 求解釋,一段c語言程序!出現死循環了!

只要指定條件為 true 都執行語句塊。
for (initialization; test; increment)
statements 參數
initialization 必選項。一個表達式。該表達式只在執行循環前被執行一次。
test 必選項。一個 Boolean 表達式。如果 test 是 true,則 statement 被執行。如果 test 是 false,則循環結束。
increment 可選項。一個表達式。在每次經過循環的最後執行該遞增表達式。 statements 可選項。test 是 true 時,要執行的一個或多個語句。可以是復合語句。
說明 循環要執行確定的次數,通常使用 for 循環。注意,for循環要求必須知道循環次數,樓主的程序中for(;;)並不知道循環次數,也沒有給出循環結束的條件,所以,要作出相應的修改才可以哦。

9. plc能通過編程實現S型加減速曲線嗎

可以,用伺服電機沒問題,前提是成本高,而且伺服電機的功率可以滿足要求。普通電機由於慣性太大,要做到完全曲線不太容易。