1 / 11
文档名称:

STM32定位控制.docx

格式:docx   大小:30KB   页数:11页
下载后只包含 1 个 DOCX 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

STM32定位控制.docx

上传人:guoxiachuanyue009 2022/10/8 文件大小:30 KB

下载得到文件列表

STM32定位控制.docx

相关文档

文档介绍

文档介绍:该【STM32定位控制 】是由【guoxiachuanyue009】上传分享,文档一共【11】页,该文档可以免费在线阅读,需要了解更多关于【STM32定位控制 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。/*作者:曹备*/
/*最后修改日期:2015-04-02*/
/*创建日期:2015-04-02*/
/*基于STM32的单轴简易运动控制器/脉冲发生器*//*脉冲+方向控制步进伺服电机*/

优化记录:
中断修改TIMx_PSC—个寄存器的值,而不是修改TIMx_ARR预加载寄存器+TIMx_CCRx比较值寄存器两个值,缩短中断处理时间
定位指令DRVI/DRVA中,目标频率设定过高、而实际输出脉冲数过少时,则不必加速到目标频率即进入减速区
*/

DRVI(A);相对定位,输出A(A取绝对值)个脉冲
A不能为0
若A为正数,则方向为正、
若A为负数,则方向为负、
DRVA(A)绝对定位,输出脉冲,运行至A个脉冲的位置
若目标位置A等于当前位置D,则不执行脉冲输出




占空比为50%
阶梯曲线形式加减速
加减速时间以10毫秒为基本单位
加减速以每10毫秒为一级
例如
加减速时间为50毫秒,则加减速级数为50/10=5
加减速时间为100毫秒,则加减速级数为100/10=10
加减速时间为150毫秒,则加减速级数为150/10=15
*/
#include""
#include""
#defineMasterFrequency0x100000〃最高频率限制
longCurrent;//当前位置脉冲数
longTarget;//目标位置脉冲数
longStartSave;//定位指令刚开始启动时的当前值
longDownStartSave;//开始进入减速时的当前值
STATUS_TypeRunFlag;//定位指令脉冲输出执行标志
STATUS_TypeStopCommand;//定位指令脉冲输出停止命令标志
STATUS_TypePlusMinus;//正负方向标志
u32StartFreq;//启动频率
u32TargetFreq;//目标频率
u32UDTimer;//加减速时间
u32LadderFreq[102];
u16LadderPSC[202];〃加减速0至9级速度/频率预分频值
u16LadderNum;//加减速速度级数
u16LadderOrderNum;//加减速速度编号
longLadderTarget[202];
voidMyTimer3_Init()〃定时器3初始化
{
RCC_APB2ENR|=(1<<3)|(1<<0);
GPIOB_CRL&=0xffffff00;
GPIOB_CRL|=0x000000a2;
,输出最大频率2MHz
GPIOB_BRR=1<<0;
//使能AFIO、GPIOB时钟
//、配置
RCC_APB1ENR|=1<<1;
TIM3_CR1|=1<<2;
TIM3_DIER|=1<<0;
//使能定时器TIMER3时钟
//设置只有计数溢出作为T3更新中断
//允许定时器3计数溢出中断
Interrupt_Priority(29,2,2);
中断分组2
//使能第29号中断(即定时器3全局中断),抢占2响应2
TIM3_CCMR2&=~(3<<8);
TIM3_CCMR2|=7<<12;
TIM3_CCER|=1<<12;
//T3_CH4通道配置为输出模式
//T3_CH4为PWM模式2
//T3_CH4通道输出使能
TIM3_ARR=11;//
TIM3_CCR4=6;//匹配值1等于重装值一半,是以占空比为50%
}
voidPluse_start()
{
RunFlag=ON;//脉冲输出定位指令执行标志置ON
StartSave=Current;//脉冲输出启动时的初始脉冲值保存于
StartSave
LadderOrderNum=0;〃加减速级数序号为0
MyDelay(2,ms);//脉冲信号比方向信号滞后,以提高可靠性
TIM3_PSC=LadderPSC[0];
TIM3_CR1|=1<<0;//启动定时器TIMER2计数
}
***
函数名称:DRVI
函数功能:相对定位
入口参数:longoffset相对偏移脉冲,u32frequency最高频率
返回值:无
^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx
**/
voidDRVI(longoffset,u32frequency)
{
u16h;
u16i;
u32j;
if((offset!=0)&&(RunFlag==OFF))//相对偏移值为0则不接受命令,脉冲输出已执行,不
}
接受命令
{
Target=Current+offset;//目标值等于当前值加上相对偏移值
if(frequency<StartFreq)//如果设定目标频率小于启动频率
{frequency=StartFreq;
}
elseif(frequency>MasterFrequency)〃否则如果设定目标频率高于最高限制频率
{frequency=MasterFrequency;
}
LadderNum=UDTimer/10;//加减速级数
j=(frequency-StartFreq)/LadderNum;//等差for(i=0;i<LadderNum;i++)
{
LadderFreq[i]=i*j+StartFreq;//加减速各阶梯频率LadderPSC[i]=(6000000/LadderFreq[i])-1;〃加减速各阶梯频率对应定时器预分频值
}
LadderFreq[LadderNum]=frequency;〃目标频率,最高频率
LadderPSC[LadderNum]=6000000/frequency-1;〃目标频率(最高频率)对应定时器预分频值
if(offset>0)//相对偏移值为正数
{
GPIOB_BSRR=1vvO;〃相对偏移值为正数,方向为正,方向信号高电平PlusMinus=ON;〃正负方向标志置ON
LadderTarget[0]=Current+StartFreq/100;/加速第一段目标脉冲值for(i=1;i<LadderNum;i++)
{
LadderTarget[i]=LadderTarget[i-1]+LadderFreq[i]/100;/加速各段目标脉冲值
}
while(offsetv=((LadderTarget[LadderNum-1]-Current)vv1))//如果偏移量小于二
倍加速增量
{
LadderNum--;//加速等级数减一频率设定过高、实际输出脉冲数过少的
情况下不必加速至设定频率,避免过冲
for(i=0,h=LadderNum<<1;i<LadderNum;i++,h--)
{
LadderPSC[h]=LadderPSC[i];〃减速各段定时器重装值
}
LadderTarget[LadderNumvvl]=Target;/减速最后一段目标脉冲值for(i=(LadderNum<<1)-1,h=0;i>LadderNum;i--,h++)
{
LadderTarget[i]=LadderTarget[i+1]-LadderFreq[h]/100;/减速各段目标脉冲值
}
}
else//否则相对偏移值为负数
{
GPIOB_BRR=1vvO;〃相对偏移值为负数,方向为负,方向信号低电平
PlusMinus=OFF;〃正负方向标志OFF
LadderTarget[0]=Current-StartFreq/100;/加速第一段目标脉冲值for(i=1;i<LadderNum;i++)
{
LadderTarget[i]=LadderTarget[i-1]-LadderFreq[i]/100;/加速各段目标脉冲值
}
while(offset>=((LadderTarget[LadderNum-1]-Current)vv1))/如果偏移量小于二
倍加速增量
{
LadderNum--;//加速等级数减一频率设定过高、实际输出脉冲数过少的
情况下不必加速至设定频率,避免过冲
}
for(i=0,h=LadderNum<<1;i<LadderNum;i++,h--)
{
LadderPSC[h]=LadderPSC[i];
}
LadderTarget[LadderNumvv1]=Target;/减速最后一段目标脉冲值for(i=(LadderNum<<1)-1,h=0;i>LadderNum;i--,h++)
{
LadderTarget[i]=LadderTarget[i+1]+LadderFreq[h]/100;/减速各段目标脉冲值
}
}
LadderTarget[LadderNum]=Target+Current-LadderTarget[LadderNum-1];
Pluse_start();〃脉冲输出正式启动
***
函数名称:DRVA
函数功能:绝对定位
入口参数:longtarget目标位置脉冲,u32frequency最高频率
返回值:无
^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx
**/
voidDRVA(longtarget,u32frequency)
{
u16h;
u16i;
u32j;
longoffset=target-Current;
if((offset!=0)&&(RunFlag==OFF))〃目标位置等于当前位置,则不接受命令
{
Target=target;//目标位置设定(等于参数)
if(frequencyvStartFreq)〃如果设定目标频率小于启动频率
{
frequency=StartFreq;
}
elseif(frequency>MasterFrequency)〃否则如果设定目标频率高于最高限制频率
{
frequency=MasterFrequency;
}
LadderNum=UDTimer/10;//加减速级数
j=(frequency-StartFreq)/LadderNum;//等差for(i=0;i<LadderNum;i++)
{
LadderFreq[i]=i*j+StartFreq;//加减速各阶梯频率LadderPSC[i]=(6000000/LadderFreq[i])-1;//加减速各阶梯频率对应定时器初值}
LadderFreq[LadderNum]=frequency;LadderPSC[LadderNum]=6000000/frequency-1;
if(offset>0)//目标位置值大于当前位置值
{
GPIOB_BSRR=1vvO;〃则方向为正,方向信号高电平
PlusMinus=ON;〃正负方向标志置ON
LadderTarget[0]=Current+StartFreq/100;for(i=1;i<LadderNum;i++){
LadderTarget[i]=LadderTarget[i-1]+LadderFreq[i]/100;
}
while(offsetv=((LadderTarget[LadderNum-l]-Current)vvl))/如果偏移量小于二
倍加速增量
{
LadderNum--;//加速等级数减一频率设定过高、实际输出脉冲数过少的情况下不必加速至设定频率,避免过冲
}
for(i=0,h=LadderNum<<l;i<LadderNum;i++,h--)
{
LadderPSC[h]=LadderPSC[i];
}
LadderTarget[LadderNumvv1]=Target;/减速最后一段目标脉冲值
for(i=(LadderNum<<l)-l,h=0;i>LadderNum;i--,h++){
LadderTarget[i]=LadderTarget[i+1]-LadderFreq[h]/100;/减速各段目标脉冲值
}
}
else//否则目标位置值小于当前位置值,
{
GPIOB_BRR=1vvO;〃则方向为负,方向信号低电平PlusMinus=OFF;〃正负方向标志OFF
LadderTarget[0]=Current-StartFreq/100;
for(i=1;i<LadderNum;i++)
{LadderTarget[i]=LadderTarget[i-1]-LadderFreq[i]/100;
}
while(offset>=((LadderTarget[LadderNum-1]-Current)vv1))/如果偏移量小于二
倍加速增量
{
LadderNum--;//加速等级数减一频率设定过高、实际输出脉冲数过少的情况下不必加速至设定频率,避免过冲
}
for(i=0,h=LadderNum<<1;i<LadderNum;i++,h--)
{
LadderPSC[h]=LadderPSC[i];
}
LadderTarget[LadderNumvvl]=Target;/减速最后一段目标脉冲值for(i=(LadderNum<<1)-1,h=0;i>LadderNum;i--,h++)
{
LadderTarget[i]=LadderTarget[i+1]+LadderFreq[h]/100;/减速各段目标脉冲

}
}
LadderTarget[LadderNum]=Target+Current-LadderTarget[LadderNum-1];/匀速段目
标位置/进入减速时位置
Pluse_start();〃脉冲输出正式启动
}
}
***
函数名称:SLOPE
函数功能:斜坡设置(坡度斜率设置)
入口参数:u32frequency启动频率,u32timer加减速时间
返回值:无
^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx^Tx
**/
voidSLOPE(u32frequency,u32timer)
{
if(frequency<100){StartFreq=100;}
elseif(frequency>1000){StartFreq=1000;}
else{StartFreq=frequency;}〃启动频率设置大于等于100小于等于
1000
if(timer<50)elseif(timer>1000)else
于1000,且为整十数
}
{UDTimer=50;}
{UDTimer=1000;}
{UDTimer=(timer/10)*10;}//加减速时间设置大于等于50小于等
{
voidTIM3_IRQHandler()
{

//定时器3全局中断函数
{
longtemp;if(TIM3_SR&0x0001){if(PlusMinus==ON){//Current++;temp=Current;temp++;//如果方向为正,当前值加一
Current=temp;
}
else
{
//Current++;
temp=Current;
temp--;//否则方向为负,当前值减一
Current=temp;
}
if(Current==LadderTarget[LadderOrderNum])
{if(LadderOrderNum<(LadderNum<<1)){
LadderOrderNum++;
TIM3_PSC=LadderPSC[LadderOrderNum];}else
{
TIM3_CR1&=~(1<<0);
TIM3_CNT=0x0000;
RunFlag=OFF;
}
}
TIM3_SR=0x0000;
}
}
voidGPIO_Init()
{
RCC_APB2ENRI=(lvv3)l(lvv6);〃使能GPIOB、GPIOE时钟
GPIOE_CRL&=0x00000000;
GPIOE_CRLI=Ox88888888;//,作为按键
GPIOE_BRR=0x00ff;//
}
voidVariable_Init()
{
Target=O;〃目标位置脉冲值
Current=O;〃当前位置脉冲值
RunFlag=OFF;〃脉冲定位指令执行标志
StopCommand=OFF;//定位指令脉冲输出停止命令标志
}
voidDELAY(ul6a){
MyDelay(a,ms);
}
voidPAUSE()
{
while(RunFlag==ON);
}
intmain(void)
{
//u8temp;
System_Init();〃系统初始化(包括复位、配置中断向量表、配置时钟)
GPIO_Init();〃端口初始化
Interrupt_Group();//中断分组配置
MyTimer3_Init();〃定时器2初始化
Variable_Init();//变量初始化
SLOPE(200,150);〃启动频率200Hz,加减速时间300毫秒斜率设置