没有合适的资源?快使用搜索试试~ 我知道了~
首页三相直流无刷电机驱动程序.pdf
三相直流无刷电机驱动程序.pdf
需积分: 50 83 下载量 84 浏览量
更新于2023-03-16
评论 5
收藏 19KB PDF 举报
三相直流无刷电机驱动程序,采用的是将霍尔传感器输出的三根线相边的IO 口配置成外部中断,并且为边沿触发,在中断函数中加入传感器检测与上下桥臂切换程序,如此电机就能持续运转了。
资源详情
资源评论
资源推荐
1.检测霍尔传感器的值可以判断出转子的位置, 再使能相应的上下桥臂, 则能驱动电机运动;
若要让电机持续转动, 则必须再次检测传感器值及使能相应的上下桥臂。 这里采用的是将霍
尔传感器输出的三根线相边的 IO 口配置成外部中断,并且为边沿触发,在中断函数中加入
传感器检测与上下桥臂切换程序,如此电机就能持续运转了。
2.上桥臂的控制采用 IO 口置高低电平来控制上桥臂的通断,下桥臂则使用单片机内部集成
的三路 PWM 波来控制, 通过控制 PWM 波的占空比, 可以实现对电机的调速了。 实际测得,
占空比与电机的速度成正比例关系,在 PWM 波频率为 20KHz 时,占空比增加 1% ,速度增
加 60rpm ,并在占空比为 53% 时达到额定转速 3000rpm (空载)。
3.速度测量则采用如下公式:
电机每转一圈, 霍尔值改变 6 次 x5 个周期 =30 次,记录边沿触发的中断次数 N/30= 电机转
过的圈数 ,设运转时间为 t(s) 则电机转速 v=N/30/t*60 rpm 。即动转时间为 2s 时,霍尔值改
变次数即为速度值,单位 rpm 。
4.调速:给定速度,由电机驱动板自动由当前速度平滑过渡到给定速度。实际测试发现,速
度变化量很大时,电机会有突然加速或减速时的冲击;因此, 调速应有一个缓冲的过程。即
加速或减速应以小步进缓慢增加或减少占空比来让速度渐渐达到最终值。
#include "stm32f10x.h"
#include "driver_motor.h"
#define PWM_PERIOD_T 400
#define U_Up_On GPIOB->BSRR = GPIO_Pin_13
#define U_Up_Off GPIOB->BRR = GPIO_Pin_13
#define U_Dn_On GPIOA->BSRR = GPIO_Pin_8
#define U_Dn_Off GPIOA->BRR = GPIO_Pin_8
#define V_Up_On GPIOB->BSRR = GPIO_Pin_14
#define V_Up_Off GPIOB->BRR = GPIO_Pin_14
#define V_Dn_On GPIOA->BSRR = GPIO_Pin_9
#define V_Dn_Off GPIOA->BRR = GPIO_Pin_9
#define W_Up_On GPIOB->BSRR = GPIO_Pin_15
#define W_Up_Off GPIOB->BRR = GPIO_Pin_15
#define W_Dn_On GPIOA->BSRR = GPIO_Pin_10
#define W_Dn_Off GPIOA->BRR = GPIO_Pin_10
#define SU_HOR GPIOA->IDR & GPIO_Pin_15
#define SV_HOR GPIOA->IDR & GPIO_Pin_12
#define SW_HOR GPIOA->IDR & GPIO_Pin_11
//u8 Motor_Dir=0;
//u8 Motor_EN=0;
//u8 Hor_Value=7;
//u16 TIM2_Conter=0;
u16 Hall_Conter=0;
MotorStruct Motor={CLOCK,40,STOP};
/******************************************************************************
*
* 函数: void IO_Init(void)
* 描述: IO
* 参数:
* 返回:
* 其它:
*******************************************************************************
/
void IO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
EXTI_InitTypeDef EXTI_InitStructure;
//GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); /* 使能 SWD 禁
用 JTAG*/
/**********************LED Light***********/
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_12;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_2MHz;
GPIO_Init(GPIOB, &GPIO_InitStruct);
/*********************** 霍尔传感器中断 **********/
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_15;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);//Harl
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource11);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource12);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource15);
EXTI_InitStructure.EXTI_Line = EXTI_Line11 | EXTI_Line12|EXTI_Line15;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
/***************************************************************************
函数: void PWM_Init(void)
描述:配置 PWM 定时器 TIM1
参数:
返回:无
***************************************************************************/
void PWM_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_OCInitTypeDef TIM_OCInitStructure;
//TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
TIM_Cmd(TIM1 , DISABLE);
TIM_CtrlPWMOutputs(TIM1, DISABLE);// 禁止 OC 输出
//IO 口设置
GPIO_SetBits(GPIOA, GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10); //PWM 口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOB, GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);//普通 IO 口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// 定时器设置
TIM_TimeBaseInitStruct.TIM_Period = PWM_PERIOD_T;//5 极电机, 3000RPM,每个 Step
有 10 个脉冲,载波 15KHZ
TIM_TimeBaseInitStruct.TIM_Prescaler = 2;
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM1 , &TIM_TimeBaseInitStruct);
//TIM_ClearITPendingBit(TIM1, TIM_IT_Update);
//TIM_ARRPreloadConfig(TIM1, ENABLE);
//TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
剩余10页未读,继续阅读
ldz18722676267
- 粉丝: 2
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
- SPC统计方法基础知识.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0