步进电机-插补算法stm32_第1页
步进电机-插补算法stm32_第2页
步进电机-插补算法stm32_第3页
步进电机-插补算法stm32_第4页
步进电机-插补算法stm32_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、#include "stm32f10x.h"#include "delay.h"#include "misc.h"#include <stdio.h>#include "stm32f10x_tim.h"#include "stm32f10x_rcc.h"#include "stm32f10x_usart.h"#include <math.h>void RCC_Configuration(void);void GPIO_Configuration(voi

2、d);void NVIC_Configuration(void);void TIM_Configuration(void);void USART_Configuration(void);int fputc(int ch,FILE *f);int fgetc(FILE *f);float Mx=1.44f,My=2.88f;/起点float Nx=10.0f,Ny=7.61f;/终点float X1,Y1;float X2,Y2;float X3,Y3;/三种方法走后的坐标float k;/斜率float b;/y=kx+bfloat X,Y;/实际运行的坐标float Delta1,Delta

3、2,Delta3,Delta4;/三种方法的误差,4为不走最后一步的误差float Delta;/实际误差/ float DeltaMax;/最大误差char way;/选择的走法int a;/TIM6 中断次数int num=0;/总步数int tx=1,ty=1;/用来判断中断是否发生int numx,numy;/计的步数int counter=0;/计数值float time;/时间 float nxd,nyd;/开始减速坐标 float nx,ny;/nx=Nx-0.0144f; float fenmu;/公式中分母 / int frex20=2,10,30,60,100,150,22

4、0,300,390,500;/ int frey20=2,10,30,60,100,150,220,300,390,500;int frex20=1098,2931,7585,18242,37754,62245,81757,92414,97068,98901;int frey20=1098,2931,7585,18242,37754,62245,81757,92414,97068,98901;int prex20=0;int prey20=0;int main(void)int i,j; int npwm=10; /加减速每段脉冲数/算出预分频值for(i=0;i<10;i+)prexi

5、=72000000/(frexi*200);preyi=72000000/(freyi*200); /配置,初始化 RCC_Configuration(); GPIO_Configuration();USART_Configuration();TIM_Configuration();NVIC_Configuration(); Delay_Init();TIM_Cmd(TIM2, ENABLE);/catch X YTIM_Cmd(TIM6, ENABLE);/计时/ TIM_SetCounter(TIM6,0);/开始运行/计算相关量 X=Mx; Y=My;k=(Ny-My)/(Nx-Mx);

6、b=My-k*Mx;/y=kx+bnxd=Nx-90*0.0144f;nyd=Ny-90*0.0144f;nx=Nx-0.0144f;ny=Ny-0.0144f;fenmu=sqrt(k*k+1);for(i=1;i<10;i+)/加速阶段,分10段while(j<npwm) X1=X+0.0144f; Y1=Y; X2=X; Y2=Y+0.0144f; X3=X+0.0144f; Y3=Y+0.0144f;Delta1=fabs(k*X1-Y1+b)/fenmu;Delta2=fabs(k*X2-Y2+b)/fenmu;Delta3=fabs(k*X3-Y3+b)/fenmu;/

7、三种走法的误差 /选择最小误差走法 if(Delta1<Delta2) way=1;Delta=Delta1; else way=2;Delta=Delta2; if(Delta3<Delta) way=3;Delta=Delta3; switch (way)/实际走法,while()为等待中断发生(中断失能),以确保一步一脉冲 case 1: X=X+0.0144f;TIM_Cmd(TIM3,ENABLE); while(tx); tx=1; break; case 2: Y=Y+0.0144f;TIM_Cmd(TIM4,ENABLE); while(ty); ty=1; bre

8、ak; case 3: X=X+0.0144f; Y=Y+0.0144f; TIM_Cmd(TIM3,ENABLE);TIM_Cmd(TIM4,ENABLE);while(tx|ty);tx=1;ty=1;break; num+; j+; TIM_PrescalerConfig(TIM3, prexi-1,TIM_PSCReloadMode_Immediate);/改预分频,频率TIM_PrescalerConfig(TIM4, preyi-1,TIM_PSCReloadMode_Immediate);j=0; while(X<nxd|Y<nyd) /最高频率阶段 X1=X+0.0

9、144f; Y1=Y; X2=X; Y2=Y+0.0144f; X3=X+0.0144f; Y3=Y+0.0144f;Delta1=fabs(k*X1-Y1+b)/fenmu;Delta2=fabs(k*X2-Y2+b)/fenmu;Delta3=fabs(k*X3-Y3+b)/fenmu; if(Delta1<Delta2) way=1;Delta=Delta1; else way=2;Delta=Delta2; if(Delta3<Delta) way=3;Delta=Delta3; switch (way) case 1: X=X+0.0144f;TIM_Cmd(TIM3,E

10、NABLE); while(tx); tx=1; break; case 2: Y=Y+0.0144f;TIM_Cmd(TIM4,ENABLE); while(ty); ty=1; break; case 3: X=X+0.0144f; Y=Y+0.0144f; TIM_Cmd(TIM3,ENABLE);TIM_Cmd(TIM4,ENABLE);while(tx|ty);tx=1;ty=1;break; num+;/ if(Delta>DeltaMax)/ DeltaMax=Delta;for(i=8;i>=0;i-)/减速阶段,分10段TIM_PrescalerConfig(TI

11、M3, prexi-1,TIM_PSCReloadMode_Immediate);/改预分频,频率TIM_PrescalerConfig(TIM4, preyi-1,TIM_PSCReloadMode_Immediate);while(j<npwm) X1=X+0.0144f; Y1=Y; X2=X; Y2=Y+0.0144f; X3=X+0.0144f; Y3=Y+0.0144f;Delta1=fabs(k*X1-Y1+b)/fenmu;Delta2=fabs(k*X2-Y2+b)/fenmu;Delta3=fabs(k*X3-Y3+b)/fenmu;/三种走法的误差 /选择最小误差走

12、法 if(Delta1<Delta2) way=1;Delta=Delta1; else way=2;Delta=Delta2; if(Delta3<Delta) way=3;Delta=Delta3; switch (way)/实际走法,while()为等待中断发生(中断失能),以确保一步一脉冲 case 1: X=X+0.0144f;TIM_Cmd(TIM3,ENABLE); while(tx); tx=1; break; case 2: Y=Y+0.0144f;TIM_Cmd(TIM4,ENABLE); while(ty); ty=1; break; case 3: X=X+

13、0.0144f; Y=Y+0.0144f; TIM_Cmd(TIM3,ENABLE);TIM_Cmd(TIM4,ENABLE);while(tx|ty);tx=1;ty=1;break; num+; j+; j=0; while(X<nx|Y<ny) /最低频率阶段 X1=X+0.0144f; Y1=Y; X2=X; Y2=Y+0.0144f; X3=X+0.0144f; Y3=Y+0.0144f;Delta1=fabs(k*X1-Y1+b)/fenmu;Delta2=fabs(k*X2-Y2+b)/fenmu;Delta3=fabs(k*X3-Y3+b)/fenmu; if(De

14、lta1<Delta2) way=1;Delta=Delta1; else way=2;Delta=Delta2; if(Delta3<Delta) way=3;Delta=Delta3; switch (way) case 1: X=X+0.0144f;TIM_Cmd(TIM3,ENABLE); while(tx); tx=1; break; case 2: Y=Y+0.0144f;TIM_Cmd(TIM4,ENABLE); while(ty); ty=1; break; case 3: X=X+0.0144f; Y=Y+0.0144f; TIM_Cmd(TIM3,ENABLE)

15、;TIM_Cmd(TIM4,ENABLE);while(tx|ty);tx=1;ty=1;break; num+;/ if(Delta>DeltaMax)/ DeltaMax=Delta;/判断是否要走超出终点 X1=X+0.0144f; Y1=Y; X2=X; Y2=Y+0.0144f; X3=X+0.0144f; Y3=Y+0.0144f;Delta1=sqrt(Nx-X1)*(Nx-X1)+(Ny-Y1)*(Ny-Y1);Delta2=sqrt(Nx-X2)*(Nx-X2)+(Ny-Y2)*(Ny-Y2);Delta3=sqrt(Nx-X3)*(Nx-X3)+(Ny-Y3)*(Ny

16、-Y3); if(Delta1<Delta2) way=1;Delta=Delta1; else way=2;Delta=Delta2; if(Delta3<Delta) way=3;Delta=Delta3; Delta4=sqrt(Nx-X)*(Nx-X)+(Ny-Y)*(Ny-Y); if(Delta<Delta4) switch (way) case 1:X=X+0.0144f;TIM_Cmd(TIM3, ENABLE); while(tx=1); break; case 2:Y=Y+0.0144f;TIM_Cmd(TIM4, ENABLE);while(ty=1);

17、 break; case 3:X=X+0.0144f; Y=Y+0.0144f; TIM_Cmd(TIM3, ENABLE);TIM_Cmd(TIM4, ENABLE);while(tx=1&&ty=1); break; num+; counter=TIM_GetCounter(TIM6);TIM_Cmd(TIM6, DISABLE);time=a*65536/72.0f+counter/72.0f;/us/ delay_ms(500);printf(" 总长度 : %f mmn",sqrt(Nx-Mx)*(Nx-Mx)+(Ny-My)*(Ny-My);pr

18、intf(" 总时间 : %f usn",time);printf("总步数=%dn",num);/ printf("numx=%dn",numx);/ printf("numy=%dnn",numy);while(1)void RCC_Configuration(void) SystemInit();RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2|RCC_APB1Periph_TIM3|RCC_APB1Periph_TIM4 |RCC_APB1Periph_TIM6,ENAB

19、LE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB , ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);void GPIO_Configuration(void)GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;GPIO_InitStr

20、ucture.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7|GPIO_Pin_9;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_10;GPIO_InitStructure.GPIO_Mo

21、de=GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA,&GPIO_InitStructure);void TIM_Configuration()TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;TIM_ICInitTypeDef TIM_ICInitStructure;TIM_TimeBaseStructure.TIM_Prescaler=0;TIM_TimeBaseStructure.TIM_ClockDivision=0;TIM_Time

22、BaseStructure.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseStructure.TIM_Period=65536-1;TIM_TimeBaseInit(TIM6,&TIM_TimeBaseStructure);TIM_TimeBaseStructure.TIM_Prescaler=prex0-1;/XTIM_TimeBaseStructure.TIM_Period=200-1;TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);TIM_OCInitStructure.TIM_O

23、CMode=TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulse=100-1;TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;TIM_OC2Init(TIM4,&TIM_OCInitStructure);TIM_CtrlPWMOutputs(TIM4,ENABLE);TIM_TimeBaseStructure.TIM_Prescaler=prey0-1;/YTIM_Time

24、BaseStructure.TIM_Period=200-1;TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);TIM_OCInitStructure.TIM_Pulse=100-1;TIM_OC2Init(TIM3,&TIM_OCInitStructure);TIM_CtrlPWMOutputs(TIM3,ENABLE);TIM_DeInit(TIM2);TIM_ICStructInit(&TIM_ICInitStructure); TIM_ICInitStructure.TIM_Channel = TIM_Channel_3

25、;/X TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM_ICInitStructure.TIM_ICFilter = 0x0; TIM_ICInit(TIM2, &TIM_ICInitStructure); TIM_ICInitStructure.TIM_Channel =

26、TIM_Channel_4;/Y TIM_ICInit(TIM2, &TIM_ICInitStructure);void NVIC_Configuration(void)NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC

27、_IRQChannelSubPriority = 2; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; NVIC_InitStructure.NVIC_IRQChanne

28、lCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); TIM_ITConfig(TIM2,TIM_IT_CC3,ENABLE); TIM_ITConfig(TIM2,TIM_IT_CC4,ENABLE); TIM_ITConfig(TIM6,TIM_FLAG_Update,ENABLE);void USART_Configuration(void) USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate =115200; USART_InitStructu

29、re.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx|USART_Mode_Rx; USART_In

30、it(USART1, &USART_InitStructure); USART_Cmd(USART1,ENABLE);int fputc(int ch,FILE *f) if(ch='n') while(USART_GetFlagStatus(USART1,USART_FLAG_TC)=RESET); USART_SendData(USART1,'r'); while(USART_GetFlagStatus(USART1,USART_FLAG_TC)=RESET); USART_SendData(USART1,ch); return ch;中断函数程序:

31、/* * * file Project/Template/stm32f10x_it.c * author MCD Application Team * version V3.0.0 * date 04/06/2009 * brief Main Interrupt Service Routines. * This file provides template for all exceptions handler and * peripherals interrupt service routine. * * copy * * THE PRESENT FIRMWARE WHICH IS FOR G

32、UIDANCE ONLY AIMS AT PROVIDING CUSTOMERS * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING * FROM THE CONTENT OF SUCH FIR

33、MWARE AND/OR THE USE MADE BY CUSTOMERS OF THE * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. * * <h2><center>&copy; COPYRIGHT 2009 STMicroelectronics</center></h2> */ /* Includes -*/#include "stm32f10x_it.h"#include "stm32f10x_exti

34、.h"#include "stm32f10x_rcc.h"#include "misc.h"#include "stm32f10x_dma.h"#include "stm32f10x_usart.h"#include <stdio.h>/* addtogroup Template_Project * */* Private typedef -*/* Private define -*/* Private macro -*/* Private variables -*/* Private fun

35、ction prototypes -*/* Private functions -*/*/* Cortex-M3 Processor Exceptions Handlers */*/* * brief This function handles NMI exception. * param None * retval : None */void NMI_Handler(void)/* * brief This function handles Hard Fault exception. * param None * retval : None */void HardFault_Handler(

36、void) /* Go to infinite loop when Hard Fault exception occurs */ while (1) /* * brief This function handles Memory Manage exception. * param None * retval : None */void MemManage_Handler(void) /* Go to infinite loop when Memory Manage exception occurs */ while (1) /* * brief This function handles Bu

37、s Fault exception. * param None * retval : None */void BusFault_Handler(void) /* Go to infinite loop when Bus Fault exception occurs */ while (1) /* * brief This function handles Usage Fault exception. * param None * retval : None */void UsageFault_Handler(void) /* Go to infinite loop when Usage Fau

38、lt exception occurs */ while (1) /* * brief This function handles SVCall exception. * param None * retval : None */void SVC_Handler(void)/* * brief This function handles Debug Monitor exception. * param None * retval : None */void DebugMon_Handler(void)/* * brief This function handles PendSVC exception. * param None * retval : None */void PendSV_Handler(void)/

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论