历史上的今天
返回首页

历史上的今天

今天是:2024年09月12日(星期四)

正在发生

2018年09月12日 | STM32步进电机加减速

2018-09-12 来源:eefocus

电机的加减速为了,电机启动停止更加稳定,提高匀速速度。S曲线算法优化电机的运行。

整个过程就是,模仿S曲线设置电机的频率


程序采用,通过s_curve()函数映射一张小于1500个点的表, 输出一次pwm方波,中断一次,计数器step计数一次 ,TIM_SetAutoreload()重新设置arr频率。




S曲线函数,加速和减速同理,返回值是表的个数


uint16_t _stepmotor_calc(uint16_t min, uint16_t max, float rate, float val[1500])

{

 uint16_t  i;

 float     Ainf_v;

 uint16_t  AInf_t;

 float     end_v;

 float     start_v;

 end_v=100000/min;

 start_v=100000/max;

Ainf_v=(end_v-start_v)/2+start_v;

        AInf_t=sqrt(2*(Ainf_v-start_v)/rate);

for(i=0;i


代码实现:

电机的配置 :


 

 

void RCC_Cfg(void)

{      

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);  

       RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);

}

void GPIO_Cfg_gpio_b(void)

{  

    GPIO_InitTypeDef GPIO_InitStructure;           

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;

    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_1;

    GPIO_Init(GPIOB,&GPIO_InitStructure); 

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_10|GPIO_Pin_11;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_RESET);  //OE使能

GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_RESET);  //细分1

GPIO_WriteBit(GPIOA, GPIO_Pin_6, Bit_SET);    //细分2

GPIO_WriteBit(GPIOB, GPIO_Pin_10, Bit_RESET); //ATT1衰减

GPIO_WriteBit(GPIOB, GPIO_Pin_11, Bit_SET);   //ATT2衰减

GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_RESET);  //CW方向

}

void PWM_Cfg(void)

{

    TIM_OCInitTypeDef TIM_OCInitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

    TIM_OCStructInit(&TIM_OCInitStructure);

TIM_DeInit(TIM3);      

TIM_InternalClockConfig(TIM3);    

TIM_TimeBaseStructure.TIM_Period = 65535;      //arr  

TIM_TimeBaseStructure.TIM_Prescaler = 200;    // psc  //Tclk/((arr+1)*(psc+1))Tclk;                        

TIM_TimeBaseStructure.TIM_ClockDivision =0;// TIM_CKD_DIV1

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);

TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);

    NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStructure);

    TIM_OCInitStructure.TIM_OCMode       = TIM_OCMode_PWM1; 

    TIM_OCInitStructure.TIM_OutputState  = TIM_OutputState_Enable; 

    TIM_OCInitStructure.TIM_OCPolarity   = TIM_OCPolarity_High;    

    TIM_OCInitStructure.TIM_Pulse = 0;

    TIM_OC4Init(TIM3, &TIM_OCInitStructure);

    TIM_CtrlPWMOutputs(TIM3,ENABLE);

}

 



主函数部分,整个运行的图像是个梯形,先加速在匀速在减速停止

#include "stm32f10x.h"

#include "math.h"

#include "pwm.h"

 

#define _ACC_DEC_MAX_COUNT 1500

#define _STEP_INT 8000

 

#define mortor_cw(x) x ? GPIO_SetBits(GPIOB,GPIO_Pin_0):GPIO_ResetBits(GPIOB,GPIO_Pin_0)

void stm32_init(void);

void delay_ms(u32 i);

void once_pwm(void);

 

int acc_i = 0;

int dec_i = 0;

int cw_buf=0;

uint16_t acc_count;

uint16_t dec_count;

 

typedef struct

{

int StepCount;

float acc_val[_ACC_DEC_MAX_COUNT];

float dec_val[_ACC_DEC_MAX_COUNT];

}str_mot;

 

str_mot motor_1;

 

void Delay(u32 nCount)

{

  do{

    }

  while(nCount--);

}

 

int main()

{

 int i = 0;

 float temp = 0;

 stm32_init();

 

      RCC_Cfg();   

      GPIO_Cfg_gpio_b();

 motor_1.StepCount=0;

 acc_count=0;

 dec_count=0;  

 PWM_Cfg();

 TIM_SetCompare4(TIM3,(20/2));

 acc_count = _stepmotor_calc(60,250,0.09,motor_1.acc_val);

 dec_count = _stepmotor_calc(60,150,0.005,motor_1.dec_val);

 for(i = 0;i= (_STEP_INT-dec_count))

TIM_SetAutoreload(TIM3,motor_1.dec_val[(dec_i)]);

TIM_SetCompare4(TIM3,(motor_1.dec_val[(dec_i)]/2));

dec_i++;

}

}

}


推荐阅读

史海拾趣

ACCRETECH公司的发展小趣事

ACCRETECH是一家日本的半导体设备制造公司,以下是该公司发展的五个相关故事:

  1. 公司成立和早期发展: ACCRETECH(前身为TOKYO SEIMITSU)成立于1949年,总部位于日本东京。最初,公司主要从事机械零件的生产,随着时代的发展,逐渐转型为半导体设备制造商。起初,ACCRETECH主要生产晶圆表面检测设备和测量设备。

  2. 技术创新和产品拓展: 随着半导体行业的快速发展,ACCRETECH不断进行技术创新,并逐步拓展产品线。公司推出了包括晶圆尺寸测量仪、晶圆表面检测仪、晶圆平整度检测仪等在内的多种半导体生产设备,满足了客户对高精度、高效率设备的需求。

  3. 市场扩张和国际合作: ACCRETECH积极拓展国内外市场,并与全球各地的客户建立了合作关系。公司的产品被广泛应用于半导体制造、集成电路测试、电子元件生产等领域,赢得了客户的信赖。ACCRETECH还与国际知名半导体企业展开合作,共同推动技术进步和产业发展。

  4. 持续投入研发和创新: ACCRETECH不断加大研发投入,致力于技术创新和产品升级。公司设立了专门的研究机构和实验室,拥有一支技术精湛的团队,致力于开发新产品和解决方案,满足客户不断提高的需求。

  5. 未来发展展望: ACCRETECH将继续致力于半导体设备制造领域的研发和应用,不断推出更先进、更可靠的产品和解决方案,满足客户在半导体生产过程中的需求。公司将加强国际市场拓展,提升自身在全球市场的竞争力,为行业的发展做出更大的贡献。

Embedded Planet公司的发展小趣事

作为一家负责任的企业,Embedded Planet公司一直将绿色环保理念融入产品设计和生产过程中。公司积极采用环保材料和技术,努力降低产品对环境的负面影响。同时,公司还倡导员工参与环保活动,共同为地球的可持续发展贡献力量。这些环保实践不仅提升了公司的社会形象,也为公司赢得了更多客户的信任和支持。

DIOO公司的发展小趣事

为了进一步拓展市场,DIOO公司决定实施国际化战略。在21世纪初,DIOO公司成功打入欧洲和北美市场,与当地知名电子产品制造商建立了合作关系。通过引进国际先进的生产技术和设计理念,DIOO公司的产品逐渐赢得了全球消费者的认可和喜爱。同时,DIOO公司还积极参加国际电子展会和论坛,与全球业界同仁交流学习,不断提升自身的竞争力和影响力。

南京中科微公司的发展小趣事

CSM自成立以来,便积极承担国家和地方具有战略性意义的重大攻关研发项目。其中,公司前身南京市物联网研究与产业化有限公司RFID事业部申报的“超高频与微波RFID读写器射频芯片研发”项目获得了国家工信部物联网专项资金项目资助,并在江苏省名列第一。这些项目的成功完成不仅展示了CSM在技术研发方面的实力,也为国家科技进步和产业发展做出了积极贡献。

DBS Microwave Inc公司的发展小趣事

在DBS Microwave的发展过程中,技术创新一直是其核心竞争力。公司不断投入研发资源,突破技术瓶颈,推出了一系列具有创新性的产品。例如,在XXXX年,公司成功研发出了一款高性能的微波滤波器,其性能指标在当时的市场上处于领先地位。这一创新不仅为公司赢得了大量订单,也进一步巩固了其在行业内的技术领先地位。

Calex Mfg Co Inc公司的发展小趣事

在国内市场取得一定成绩后,Calex Mfg. Co., Inc.开始积极拓展海外市场。公司制定了全球化战略,通过参加国际展会、建立海外销售网络等方式,不断开拓国际市场。同时,公司还根据不同地区的市场需求,推出定制化的产品和服务,进一步提升了其在国际市场中的竞争力。

问答坊 | AI 解惑

用MAX712芯片自制的充电器

一、线路图:   1、rsense电阻取1欧姆时。充电电流为250MA,0.5欧姆时,电流为520MA,2N6109用TIP42代替,SHUNT电阻为限流电阻,大约1K,其他参数如图。   转绢流后充电机充电电流是原来的1/8还是1/16取决于PGM3脚的接法:   Rsense电阻两 ...…

查看全部问答>

vb程序调试正常运行错误

本人刚学VB,在写一个串口数据采集大的小软件,刚开始就遇到了问题,以下代码,我在调试时都正常运行,能正确获得返回数据,可是生成exe文件后,程序却没反应,也没有错误信息出现!就是没有数据,求高手帮忙! Public gSend As Boolean  &nb ...…

查看全部问答>

ARM9的ADC怎么和外部电路连接

请问ARM9的ADC怎么和外部的放大电路连接?…

查看全部问答>

quartus功能仿真出现致命错误。 Fatal error: Module: quartus_sim.exe Exception: Access Violat

*** Fatal error: Module: quartus_sim.exe Exception: Access Violation Stack Trace: 01a314e6: SDB_DFF_INFO::set_last_clock_value() + 0x34 (tsm_sdb) 01a03144: EDS_ENGINE::propagate() + 0xb0 (TSM_EDS) 01a03321: EDS_ENGINE::propaga ...…

查看全部问答>

请问

刚涉足这个领域,要配硬件环境,不知道哪个开发语言好呢.…

查看全部问答>

FTF印象_4

名字很有吸引力的一个报告(Designint the \"impossible\" Tablet),但不知道什么原因而取消未能进行, 可以通过资料看看是介绍什么的。…

查看全部问答>

关于LED驱动电源的谐波测试必备

杭州远方PF9811,才两千多块钱; 2-50次谐波都能测出来; 按IEC61000-3-2,谐波要测到39次…

查看全部问答>

LM4871/CSC8002低电压3W功率放大器IC应用电路原理图说明

LM4871/CSC8002 是一个BTL 桥连接的音频功率放大器.它能够在5V 电源电压下给一个3Ω 负载提供THD 小于10%、平均值为3W 输出功率。在关闭模式下电流的典型值为0.6uA. LM4871/CSC8002 是为提供大功率,高保真音频输出而专门设计的.它仅仅需要少量 ...…

查看全部问答>

TPM驱动可以在ucosii下吗?

最近在研究将TPM(安全模块)应用到ARM7上,要在ucosii里添加TPM的驱动,但是现在都是linux下的驱动。有没有大侠可以指点下,可以在ucosii中加TPM的驱动吗?…

查看全部问答>