stm32S型加减速算法

电机加减速的时候需要用到平滑算法,常用的平滑算法有S型跟梯形,因为S型的平滑效果比较好,所以选择S型。

看了几篇论文,有的是使用多项函数、有的是使用分段,但这两个的函数曲线看起来并不是那么好,后面选择了sigmoid这类S型非线性变换。

sigmoid函数 y = 1/(1+exp(-in))是一个良好的阈值函数,函数连续、光滑,严格单调并关于(0,0.5)中心对称,函数值∈[-1.1],

其导数f‘(x)=f(x)*[1-f(x)],可以节约计算时间

sigmoid函数曲线的的方程y = 1/(1+exp(-in)),在[-6,6]的图形如上所示:

做sigmoid变换的目的是把(-inf,+inf)取值范围的信号(用x表示)映射到(0,1)范围内(用y表示):y=h(x)。

matlab代码:

>> X = -6 : 0.1 : 6;
Y = sigmoid(X);
h = figure;
plot(zeros(size(X)), Y, ‘Color‘, ‘r‘, ‘LineWidth‘, 2);
hold on;
plot(X, Y, ‘Color‘, ‘b‘, ‘LineWidth‘, 2);
set(gca, ‘XTick‘, -10 : 0.5 : 10);
set(gca, ‘YTick‘, 0 : 0.05 : 1);
set(gca, ‘FontSize‘, 7);
grid on;
fontSize = 10;
title(‘Sigmoid Funtion: Y = 1 / (1 + exp(-X))‘, ‘FontSize‘, fontSize);
ylabel(‘Y‘, ‘FontSize‘, fontSize);
xlabel(‘X‘, ‘FontSize‘, fontSize);
set(gcf, ‘PaperType‘, ‘A4‘);
print(h, ‘-dpng‘, ‘sigmoid.png‘);

>> X = [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20];
 X = [-4 -3.5 -3 -2.5 -2 -1.5 -1 -0.5 0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 5 5.5 6];
 Y1=[0.018  0.029  0.047  0.076  0.119  0.182  0.269  0.377     0.500  0.622 0.731  0.817  0.881, 0.924  0.952  0.970  0.982  0.989  0.993  0.996  0.997    ];
Y2=[0.0179862    0.0293122    0.0474259    0.0758582    0.119203    0.182426    0.268941    0.377541    0.5        0.622459    0.731059    0.817574    0.880797    0.924142    0.952574    0.970688    0.982014    0.989013    0.993307    0.99593        0.997527];
 figure(1),scatter(X,Y1),hold on;

把函数Y的值保存到b.txt中,地址在D:\Documents\MATLAB
X = [-6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 ];
Y = sigmoid(X);fid=fopen(‘b.txt‘,‘wt‘);
fprintf(fid,‘%g\t‘,Y);
fclose(fid);

Y = sigmoid1(X);
address=‘F:\MATLABdata\‘;
fid=fopen([address,‘c.txt‘],‘wt‘);
fprintf(fid,‘%g\t‘,Y);
fclose(fid);

y = 1/(1+exp(-in))在[-5,6]上面的是个解弄出来,后函数用查表法

float   Sigmoid_Curve_val[] ={
                0.018, 0.029, 0.047, 0.076,0.119,    0.182,

0.269, 0.377,    0.500, 0.622,    0.731, 0.8178,

0.881, 0.924,    0.952, 0.970,    0.982, 0.989,

0.993, 0.996,    0.997    };
int s_pluse = 0;
int i = 0 , j = 0;
float fpTargetR_Speed_old = 0 , fpCurrentR_Speed_old = 0;
float fpTargetL_Speed_old = 0 , fpCurrentL_Speed_old = 0;
float getR_s_data[20],getL_s_data[20];
                
    
/*******************************************************************
函数名称:Motor_speed_plan
函数功能:从当前的速度变化到目标速度时缓慢的变化
输入:PID结构体指针
输出:无
备注:
********************************************************************/
void Motor_speed_plan(ST_ROBOT_MOTOR_SPEED_PLAN* pstSpeedPlan , ST_ROBOT_MOTOR* pstMotor)
{            
  
         if(fpTargetR_Speed_old !=
pstMotor->stMotorR.fpTarget_Speed)//上位机来一次数据就更新 就是记录这时候电机的速度  
//fpTarget_Speed_old在哪里赋值
            {
                    fpTargetR_Speed_old = pstMotor->stMotorR.fpTarget_Speed;
                    fpCurrentR_Speed_old = pstMotor->stMotorR.fpCurrent_Speed;        //记录新目标速度来时电机的速度
                    i= 0;
            }
            //if(pstMotor->stMotorR.fpCurrent_Speed != pstMotor->stMotorR.fpTarget_Speed)//当前速度 ≠ 目标速度
            if(i < 20)//当前速度 ≠ 目标速度
            {                                
  
                 pstMotor->stMotorR.fpCurrent_Speed =
fpCurrentR_Speed_old + (pstMotor->stMotorR.fpTarget_Speed -
fpCurrentR_Speed_old) * Sigmoid_Curve_val[i++];
                    getR_s_data[--i] = pstMotor->stMotorR.fpCurrent_Speed;
                    i++;
            }

if(fpTargetL_Speed_old !=
pstMotor->stMotorL.fpTarget_Speed)//上位机来一次数据就更新 就是记录这时候电机的速度  
//fpTarget_Speed_old在哪里赋值
            {
                    fpTargetL_Speed_old = pstMotor->stMotorL.fpTarget_Speed;
                    fpCurrentL_Speed_old = pstMotor->stMotorL.fpCurrent_Speed;        //记录新目标速度来时电机的速度
                    j= 0;
            }
            //if(pstMotor->stMotorR.fpCurrent_Speed != pstMotor->stMotorR.fpTarget_Speed)//当前速度 ≠ 目标速度
            if(j < 20)//当前速度 ≠ 目标速度
            {                                
  
                 pstMotor->stMotorL.fpCurrent_Speed =
fpCurrentL_Speed_old + (pstMotor->stMotorL.fpTarget_Speed -
fpCurrentL_Speed_old) * Sigmoid_Curve_val[j++];
                    getL_s_data[--j] = pstMotor->stMotorL.fpCurrent_Speed;
                    j++;
            }
}

为什么我们喜欢用sigmoid这类S型非线性变换?

http://www.52cs.org/?p=363

http://blog.csdn.net/itplus/article/details/11496595

http://computing.dcu.ie/~humphrys/Notes/Neural/sigmoid.html

http://blog.csdn.net/kyu_saku/article/details/44422519

matlab中fopen函数与fprintf用法

http://blog.sina.com.cn/s/blog_4b986f1a0101349k.html

时间: 2024-08-01 22:42:11

stm32S型加减速算法的相关文章

[掌眼]iOS / Android / java / node.js 通用的 AES256 加解密算法

example.m NSString *text = @"text"; NSString *key32 = @"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; NSData *data = [text dataUsingEncoding:NSUTF8StringEncoding]; NSString *encryptedData = [[data AES256EncryptWithKey:key32] base64EncodedStringWi

数字加网(二)— —调幅加网算法及实现

在上一篇中提到调幅加网的方法有有理正切.无理正切和超细胞方法.无理正切方法,与有理正切本质相同,但是因为正切值为无理数,不能保证网格的角点与输出设备记录栅格的角点重合,需要进行一个强制重合的过程,一般数字加网方法里对其讨论较少.而超细胞的方法相当于外面一个大的阈值矩阵是有理正切,里面若干小的阈值矩阵是无理正切的.下图分别是有理正切和超细胞方法. 上段提到阈值矩阵,如下图,其实也可以叫做蒙板或者窗口,即在待加网的图像上"走"一圈下来(扫描整幅图像),当前像素值比阈值矩阵中相对应的值大,则

加解密算法

加解密算法概述 工作中经常用到加解密算法大概有以下三种: 单项散列算法 对称散列算法 非对称散列算法 单项散列算法 由不定长的数据转化为固定长的字符串,代表有: sha1 sha1($str[,raw_out=false]);//算法不够复杂 raw_out默认为false,生成一个32位的加密串 如果为true,则生成一个16位的二进制流 md5 md5($str[,strict=false]) strict默认为false,生成一个32位的加密串 如果为true,则生成一个16位的二进制流

数字型谜题或算法小节(7)

一.下图是一张 10 * 10 的数字表格,表格的对角线上是一系列的重复的数字,尝试心算出表中所有的数字总和. 答案:数字总和是 1000. 像是这样的问题,我想很多人在直觉上就会想到--找规律,的确,只要找到规律.之后的事情就变得再简单不过了. 第一种方法:根据正方形的对称性来计算. 左上角和右下角数字之和为 20,平均数为10(如: 1 + 19, 2 + 18 , 3 + 17,4 + 16 等等),也就是说表格中的数字 都换成 10 ,其总和也不不变.即数字总和为 10 * 10 * 

数字加网(三)— —调频加网算法及实现

数字加网(一)- -概念及分色合成 数字加网(二)- -调幅加网算法及实现 数字加网(三)- -调频加网算法及实现 调频加网算法主要是抖动法与误差扩散法,前者又可以分为有序抖动和无序抖动,是点过程:后者是相邻过程. 有序抖动算法 Bayer抖动算法 算法公式 最具代表性的有序抖动算法,是1973年Bayer提出的Bayer算法,其递推公式如下: 令D1=0,n=2可以求出抖动矩阵 然后就可以继续推导出D4的抖动矩阵,推导过程如下 同理,我们可以推出D8的抖动矩阵 [注]一般处理采用D8的抖动矩阵

DES加解密算法Qt实现

算法解密qt加密table64bit [声明] (1) 本文源码 大部分源码来自:DES算法代码.在此基础上,利用Qt编程进行了改写,实现了DES加解密算法,并添加了文件加解密功能.在此对署名为bengold1979的网友表示感谢!本文是对DES算法代码一文代码的具体描述.该源码仅供学习交流,请勿用于商业目的. (2) 图片及描述 图片及部分解析来自 http://zh.wikipedia.org/wiki/%E8%B3%87%E6%96%99%E5%8A%A0%E5%AF%86%E6%A8%9

【转】各种加解密算法比较

转自: http://blog.csdn.net/pengzp/article/details/6556674 二.          加密算法介绍 对称加密算法 对称加密算法用来对敏感数据等信息进行加密,常用的算法包括: DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合. 3DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高. AES(Advanced Encryption Standard

电机加减速转动

控制电机的加减速,那就要用到pwm的初始化.也就是控制L298N的使能引脚. 1 GPIO_PinRemapConfig(GPIO_Remap_TIM4, ENABLE); //Timer完全映射 TIM4_CH3->PD14 2 3 4 TIM_TimeBaseStructure.TIM_Period = arr; //重装载 5 TIM_TimeBaseStructure.TIM_Prescaler =psc; //预分频 6 TIM_TimeBaseStructure.TIM_ClockD

AES加解密算法Qt实现

[声明] (1) 本文源码 在一位未署名网友源码基础上,利用Qt编程,实现了AES加解密算法,并添加了文件加解密功能.在此表示感谢!该源码仅供学习交流,请勿用于商业目的. (2) 图片及描述 除图1外,图片及部分解析来自http://zh.wikipedia.org/wiki/%E9%AB%98%E7%BA%A7%E5%8A%A0%E5%AF%86%E6%A0%87%E5%87%86.图1为个人劳动成果,请勿盗用此图. [简介] AES(Advanced Encryption Standard,