当前位置: 首页 > news >正文

公司网站首页图片素材台州网站建设公司

公司网站首页图片素材,台州网站建设公司,西安网站建设制作 熊掌号,公司网站建设请示报告1.前言 步进电机在机械结构中的运动部件很常见,常用作机械运动的动力源。在使用时,步进电机一般是要搭配驱动器一块使用。 我们知道步进电机在控制上一般需要使能信号,方向信号和PWM脉冲。而驱动器的作用就是根据前三者的输入,转…

1.前言

步进电机在机械结构中的运动部件很常见,常用作机械运动的动力源。在使用时,步进电机一般是要搭配驱动器一块使用。

我们知道步进电机在控制上一般需要使能信号,方向信号和PWM脉冲。而驱动器的作用就是根据前三者的输入,转化为A相和B相的输出。A相和B相分开来看都是脉冲信号。可以通过A相信号的相位领先B相信号的相位90°或者反之,来决定电机是正传还是反转。进一步了解,可阅读:正交脉冲信号在电机中的作用

2.步进电机控制原理

步进电机是基于电流的磁效应原理来设计的。在步进电机内部有一个定子和转子。定子位置固定,通电可产生磁场。转子是一个永磁体,可以旋转。所以,步进电机的控制就是 当定子通电时,产生磁场,作用于转子,使得转子运动。

前言中,我们讲到,步进电机要搭配驱动器一块使用。一般,我们通过嵌入式程序来控制驱动器。输入驱动器的PWM脉冲数决定了步进电机的行程,PWM脉冲的频率决定了步进电机转动的快慢。频率越高,转动越快。
在这里插入图片描述

前言中,我们介绍了,步进电机中最核心的两个部件是定子和转子。具体,我们看下图。
在这里插入图片描述
前言中,我们介绍了,步进电机是通过A相和B相信号的相位差来决定转动方向的。具体,是如何实现的呢?请看下图。

如图所示,是控制转子按顺时针寻转。

第一步:将A相通电,根据电磁铁原理,产生磁性,并且因异性相吸,所以磁场将转子固定在第一步的位置;

第二步:当A相关闭,B相通电时,转子会旋转90°;

第三步:B相关闭、A相通电,但极性与第1步相反,这促使转子再次旋转90°。

第四步中:A相关闭、B相通电,极性与第2步相反。

重复该顺序促使转子按90°的步距角顺时针旋转。
在这里插入图片描述
把上述四个步骤,A相和B相的操作互换。即实现了逆时针旋转。
在这里插入图片描述

3 程序控制步进电机加减速运动

前面介绍了,步进电机是靠PWM脉冲的快慢来控制电机转动的快慢的。PMW频率越快,电机转动越快。但电机的转速不可能无限快。

我们初始设置pwm脉冲的频率在一个高点时,很有可能遇到电机不转动,发出“咯噔咯噔”的声音的情况,或者电机运行过程中声音特别沉闷,没有走到预期的位置。这下情况下,是因为电机发生了失步。所谓失步,是指电机时机运行的步数不到控制板软件发生的理论步数。

我们理论分析一下:当电机设置的初始速度很高时,电机扭矩就会变小(两者成反比,有点类似汽车在上坡的时候要减速,获得更大的牵引力)。如果扭矩不够,就可能出现电机带动不了负载 ,电机不转动的情况。一般来说,即使是带动相同的负载,从静止到运动和运动过程中,需要克服的阻力(静摩擦力和负载)不同。初始运动时,需要扭矩大一些,运动起来了,可以减少扭矩。

这种情况下,通过调整驱动器的拨码来设置更大的电流,会使情况有所改善。

在这里插入图片描述

但是,如果电流设置过大,长时间运行可能使得电机发热很严重,此时因驱动器保护可能降低为比较小的电流或者因发热过大,使得扭矩不足,上述情况可能会出现电机失步,较正常过程,电机声音会特别沉闷,走动时显得不平缓,最终不能走到预期的位置。

在这里插入图片描述

基于:从静止到运动,未为获得较大的扭矩,使得电机能够运动起来,一般电机初始速度不宜设置较大,等运动起来开后,再调大速度。这个过程我们叫电机的加速过程。

如图所示,很形象的展示了电机的加减速过程(减速过程是为了避免电机因速度过大,突然停止造成过冲)。

在这里插入图片描述

代码实现(以GD32标准库代码为例):

定时器产生pwm脉冲输出:


/*
* 产生PWM,作为刷架电机的输入。频率越高,刷架电机转动越快。PWM产生的脉冲数,即刷架电机运动的脉冲数。
* Timer3属于APB1
* 系统时钟SYSCLK 21Mhz
* APB1是系统时钟128分频,1.3125MHz   
* APB2是系统时钟16分频,10.5MHz
* TIMER5和TIMER6属于APB1,APB1的时钟
*/
void Timer_ShuaJia_PWM_Config(uint16_t prsc, uint32_t period, uint32_t pulse)
{/* GPIO初始化 *//* 配置GPIO *//* 使能GPIO时钟 */rcu_periph_clock_enable(RCU_GPIOD);/* GPIO引脚复用 */gpio_af_set(GPIOD, GPIO_AF_2, GPIO_PIN_15);gpio_mode_set(GPIOD, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_15);/* 配置GPIO输出模式和速度 */gpio_output_options_set(GPIOD, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_15);/* 使能TIMER1时钟 */rcu_periph_clock_enable(RCU_TIMER3);/* TIMER1复位 */timer_deinit(TIMER3);/* =======================配置TIMER1时基单元================== */timer_parameter_struct timer_initpara;/* TIMER1结构体初始化 */timer_struct_para_init(&timer_initpara);timer_initpara.prescaler = prsc - 1;timer_initpara.alignedmode = TIMER_COUNTER_EDGE;timer_initpara.counterdirection = TIMER_COUNTER_UP;timer_initpara.period = (uint64_t)(period - 1);timer_initpara.clockdivision = TIMER_CKDIV_DIV1;timer_initpara.repetitioncounter = 0;timer_init(TIMER3, &timer_initpara);/* =====================配置TIMER1输出比较单元================= */timer_oc_parameter_struct timer_oc_initstruct;/* 通道空闲状态 */timer_oc_initstruct.ocidlestate = TIMER_OC_IDLE_STATE_LOW;/* 互补通道空闲状态 */timer_oc_initstruct.ocnidlestate = TIMER_OCN_IDLE_STATE_HIGH;/* 互补通道输出极性 */timer_oc_initstruct.ocnpolarity = TIMER_OCN_POLARITY_HIGH;/* 通道输出极性 */timer_oc_initstruct.ocpolarity = TIMER_OC_POLARITY_HIGH;/* 互补通道输出失能 */timer_oc_initstruct.outputnstate = TIMER_CCXN_DISABLE;/* 通道输出使能 */timer_oc_initstruct.outputstate = TIMER_CCX_ENABLE;timer_channel_output_config(TIMER3, TIMER_CH_3, &timer_oc_initstruct);/* =====================配置输出模式和比较值================== *//* 配置输出比较模式 */timer_channel_output_mode_config(TIMER3, TIMER_CH_3, TIMER_OC_MODE_PWM0);/* 配置比较值 */timer_channel_output_pulse_value_config(TIMER3, TIMER_CH_3, pulse);/* 使能通道输出比较影子寄存器 */timer_channel_output_shadow_config(TIMER3, TIMER_CH_3, TIMER_OC_SHADOW_ENABLE);/* 使能通道输出 */timer_primary_output_config(TIMER3, DISABLE);/* 使能定时器自动重载影子寄存器 */timer_auto_reload_shadow_enable(TIMER3);/* 清除中断标志位 */timer_interrupt_flag_clear(TIMER3, TIMER_INT_FLAG_UP);/* 使能TIMER1中断 */timer_interrupt_enable(TIMER3, TIMER_INT_UP);/* 使能NVIC */nvic_irq_enable(TIMER3_IRQn, 0, 0);		/* 使能TIMER1 *///timer_enable(TIMER3);
}void stepper_shuajia_start(void)
{/* 使能通道输出 */timer_enable(TIMER3);//timer_channel_output_state_config(TIMER3, TIMER_CH_3, DISABLE);  // 通道3
}/*** @brief 停止电机转动* @retval None*/
void stepper_shuajia_stop(void)
{/* 去使能通道输出 */timer_disable(TIMER3);//timer_channel_output_state_config(TIMER3, TIMER_CH_3, DISABLE);  // 通道3
}
*** @brief 设置电机速度(通过修改PWM频率) 输入TIMER1的时钟为系统时钟168M 4分频,再2倍频为84MHz* @param speed: 目标速度(Hz)* @param psc: 预分频值,需与Timer_PWM_Config的参数保持一致* @retval None*/
void stepper_set_speed(uint32_t speed)
{   
// 计算定时器时钟频率(假设为系统时钟的一半)uint32_t timer_clock = SystemCoreClock / 4 *2;// 输入TIMER1的时钟为系统时钟168M 4分频,再2倍频为84MHz// 计算所需的总计数周期 (PSC+1)*(ARR+1) = timer_clock / speeduint32_t total_ticks = timer_clock / speed;// 处理最小频率限制if (total_ticks == 0) total_ticks = 1;uint32_t psc, arr;// 计算PSC和ARR值if (total_ticks <= 65536) {// 当总周期小于65536时,PSC=0(不分频)psc = 0;arr = total_ticks - 1;} else {// 当总周期较大时,计算PSC分频值psc = total_ticks / 65536;if (psc > 65535) psc = 65535;  // 限制PSC最大值arr = (total_ticks + psc) / (psc + 1) - 1;  // 优化取整if (arr > 65535) arr = 65535;   // 限制ARR最大值}// 计算50%占空比的CCR值(取整数部分)uint32_t pulse = (arr + 1) / 2;/* 更新定时器配置 *///timer_disable(TIMER1);timer_prescaler_config(TIMER3, psc, TIMER_PSC_RELOAD_NOW);timer_autoreload_value_config(TIMER3, arr);//该函数的配置生效时机由timer_prescaler_config的TIMER_PSC_RELOAD_NOW决定。可选:立即生效或下次更新事件生效/* 配置比较值 */timer_channel_output_pulse_value_config(TIMER3, TIMER_CH_3, pulse);//同上timer_channel_output_pulse_value_config(TIMER3, TIMER_CH_2, pulse);//同上		//timer_enable(TIMER1);
}

main函数


/*
* 系统时钟SYSCLK 168Mhz
* APB1是系统时钟4分频,42MHz   
* APB2是系统时钟2分频,84MHz
* Timer3属于APB1
*/
// 测试 刷架电机pwm输出控制
void test_shuajia_pwm(void)
{Timer_capture_Config(100, 1000);/* 方波频率 = 定时器输入时钟频率 / 预分频值psc / 自动重载值period *//* TIMER3的时钟为1.3125MHz  ,设置刷架PWM初始速率为60kHz,占空比为50%,满足脉冲低电平的持续时间不应少于 5μs */	Timer_ShuaJia_PWM_Config(42, 400, 300);//Timer_LaShen_PWM_Config  Timer_ShuaJia_PWM_Config	5, 175, 50   100, 100, 50  43, 100, 50stepper_set_speed(500);SHUAJIA_ENABLE_SET(1);SHUAJIA_DIR_SET(1);//printf("SHUAJIA_DIR=%d\n", SHUAJIA_DIR);delay_1ms(10);pwm_pulse_output_count= 0;stepper_shuajia_start();//stepper_lashen_start	stepper_shuajia_startwhile (1) //测试强度数据{if((BRUSH_ZERO == 0) && (SHUAJIA_DIR == 1)){stepper_shuajia_stop();pwm_pulse_output_count= 0;SHUAJIA_DIR_SET(0);delay_1ms(10000);stepper_shuajia_start();}	if ((BRUSH_ZERO != 0) && (SHUAJIA_DIR != 1)&&(pwm_pulse_output_count >= 6400)){stepper_shuajia_stop();pwm_pulse_output_count= 0;SHUAJIA_DIR_SET(1);delay_1ms(10000);stepper_shuajia_start();}printf("pwm_pulse_output_count=%d\n", pwm_pulse_output_count);//printf("pwm_pulse_output_count=%d\n", pwm_pulse_output_count);//printf("pwm_pulse_capture_count=%d\n", pwm_pulse_capture_count);}
}

中断函数中,实现电机加减速控制:


/* 定时器中断服务函数 pwm脉冲计数 */
void TIMER3_IRQHandler(void)
{// TIMER2 通道0 更新中断if (timer_interrupt_flag_get(TIMER3, TIMER_INT_FLAG_UP) != RESET) { timer_interrupt_flag_clear(TIMER3, TIMER_INT_FLAG_UP);  // 清除中断标志pwm_pulse_output_count++;switch(pwm_pulse_output_count){case 30:stepper_set_speed(800);	break;					case 40:stepper_set_speed(1000);break;case 50:stepper_set_speed(1500);break;					case 60:stepper_set_speed(2000);break;case 70:stepper_set_speed(3000);break;					case 80:stepper_set_speed(3500);break;case 90:stepper_set_speed(4000);break;case 95:stepper_set_speed(5000);break;					case 100:stepper_set_speed(6000);break;	case 6300:stepper_set_speed(5000);break;	case 6305:stepper_set_speed(4000);break;					case 6310:stepper_set_speed(3500);break;						case 6320:stepper_set_speed(3000);break;case 6330:stepper_set_speed(2000);break;	case 6340:stepper_set_speed(1000);break;					case 6350:stepper_set_speed(800);break;default:break;					}//if (pwm_pulse_output_count >= target_pulse_count) {//timer_disable(TIMER3);          // 关闭定时器//timer_channel_output_state_config(TIMER2, TIMER_CH_0, DISABLE); // 关闭PWM输出//}}		
}

############################################################################################################

交流使人进步,碰撞产生火花! 欢迎 大家留言评论!
############################################################################################################
http://www.dtcms.com/a/521468.html

相关文章:

  • 项目——基于C/S架构的预约系统平台 (1)
  • 机器学习预测波动率辅助ETF动态止损边界设定
  • 搭建网站一条龙柳江网站开发
  • 网站建设木马科技做美妆网站的关键词
  • 区块链的专业名字从基础到应用​​,从​​技术到生态
  • php个人网站源码带音乐如何去国外网站看内容
  • 关于我们 About Techub News
  • 大腾智能PDM在华为云生态中的应用实践——旭派锂能研发管理数字化转型
  • 椭圆曲线密码学的效率核心:单标量与多标量乘法详解
  • 期货看盘和下单简要说明
  • c2c网站系统芜湖哪家公司做网站不错
  • 网站做cdn怎么弄如何去掉wordpress作者链接
  • 每日开源项目1——HyperLogLog库
  • Dify、FastGPT、BuildingAI 与 RAGFlow 深度体验记录
  • ESP32S3入门之环境搭建
  • 深圳建网站兴田德润很好本地网站更新不了 vps登陆可以
  • 云存储能用来做网站吗网页制作费用大概多少
  • 2017辽宁建设厅查询网站大连网站建设公司排名
  • 性能测试-jmeter16-性能环境搭建、脚本编写、测试数据构造
  • 网站建设分为哪几种类型平台类网站建设价格表
  • kubernets简介和部署
  • YOLO V4 整体架构的由来及用法 详解
  • 青岛网站开发公司wordpress js加载速度慢
  • 上海松一网站建设wordpress产品展示
  • python-xml
  • 番禺网站建设专家wordpress set option
  • 郑州模板网站设计哪家便宜推广策略及推广方式
  • RTMP推拉流平台EasyDSS视频推拉流技术的应用以及视频推流是怎样的流程?
  • JDBC-MySQL数据库连接与使用
  • 江门cms模板建站寮步镇网站建设