三相直流无刷电机驱动程序

合集下载

三相直流无刷电机驱动程序

三相直流无刷电机驱动程序

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);//HarlGPIO_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个脉冲,载波15KHZTIM_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);//配置PWM输出TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;TIM_OCInitStructure.TIM_Pulse = 1;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Set;TIM_OC1Init(TIM1, &TIM_OCInitStructure);TIM_OC2Init(TIM1, &TIM_OCInitStructure);TIM_OC3Init(TIM1, &TIM_OCInitStructure);TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器TIM_Cmd(TIM1 , ENABLE);TIM_Cmd(TIM1 , ENABLE);TIM_CtrlPWMOutputs(TIM1, ENABLE);}/*****************************************************************************************函数:void Motor_Init(void)描述:参数:返回:*****************************************************************************************/ void Motor_Init(void){IO_Init();PWM_Init();}/***************************************************************************************** 函数:void Flash_Led(u8 n)描述:参数:返回:*****************************************************************************************/ void Flash_Led(u8 n){u8 i=0;for(i=0;i<n;i++){Led_On;DelayMs(100*n);Led_Off;DelayMs(100*n);}}/***************************************************************************************** 函数:void SetPWMduty(u8 PWMChanel,u16 pulse)描述:设置pwm波占空比参数:返回:*****************************************************************************************/ void SetPWMduty(u8 PWMChanel,u16 pulse){switch(PWMChanel){case 1 :TIM1->CCR1=pulse;break;case 2 :TIM1->CCR2=pulse;break;case 3 :TIM1->CCR3=pulse;break;default :break;}}/******************************************************************************* 函数:PWM_T_Output描述:设置相应的PWM梯形波输出参数:pName上桥臂名称,nName下桥臂名称返回:无********************************************************************************/ void PWM_T_Output(u8 pName , u8 nName , u8 mRate){switch(pName){case 1:GPIO_SetBits(GPIOB, GPIO_Pin_15 | GPIO_Pin_14 );GPIO_ResetBits(GPIOB , GPIO_Pin_13);break;case 2:GPIO_SetBits(GPIOB, GPIO_Pin_13 | GPIO_Pin_15 );GPIO_ResetBits(GPIOB , GPIO_Pin_14);break;case 3:GPIO_SetBits(GPIOB, GPIO_Pin_13 | GPIO_Pin_14 );GPIO_ResetBits(GPIOB , GPIO_Pin_15);break;default:GPIO_SetBits(GPIOB, GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15); }switch(nName){case 1:TIM_SetCompare2(TIM1,0);TIM_SetCompare3(TIM1,0);TIM_SetCompare1(TIM1,(u16)(PWM_PERIOD_T * mRate / 100));break;case 2:TIM_SetCompare3(TIM1,0);TIM_SetCompare1(TIM1,0);TIM_SetCompare2(TIM1,(u16)(PWM_PERIOD_T * mRate / 100));break;case 3:TIM_SetCompare2(TIM1,0);TIM_SetCompare1(TIM1,0);TIM_SetCompare3(TIM1,(u16)(PWM_PERIOD_T * mRate / 100));break;default:TIM_SetCompare1(TIM1,0);TIM_SetCompare2(TIM1,0);TIM_SetCompare3(TIM1,0);}TIM_SetAutoreload(TIM1, PWM_PERIOD_T);}/***************************************************************************************** 函数:PWM_T_Calculation描述:梯形波计算参数:HallValue霍尔值,mRate调制百分比,direction方向返回:无*****************************************************************************************/ void PWM_T_Calculation(u8 hallValue , u8 mRate , u8 direction){if(direction == 1){switch(hallValue){case 5:PWM_T_Output(1 , 3 , mRate);break;case 1:PWM_T_Output(1 , 2 , mRate);break;case 3:PWM_T_Output(3 , 2 , mRate);break;case 2:PWM_T_Output(3 , 1 , mRate);break;case 6:PWM_T_Output(2 , 1 , mRate);break;。

三相直流电机 pwm驱动原理

三相直流电机 pwm驱动原理

三相直流电机 pwm驱动原理三相直流电机(BLDC)是一种无刷电机,它采用三相交流电源和电子换向器来提供电机转子的转子,以实现高效率和高控制性能。

其中,PWM(Pulse Width Modulation)驱动是一种常见的驱动方式,它通过调整电机供电的脉冲宽度及频率来实现对电机速度和转矩的精确控制。

BLDC电机的架构包括定子和转子。

定子是由三个线圈组成的,每个线圈与电源相连,形成一个三相交流电源。

转子则是由永磁体组成的,它被安装在电机轴上,并通过电机驱动器进行驱动。

电机驱动器通过检测转子位置并适时地触发相应的线圈,以产生恰当的磁场来推动转子的运动。

PWM驱动是通过调整电机供电的脉冲宽度及频率来控制电机转速和转矩的方法。

具体实现上,PWM驱动使用电子开关(如晶体管或MOSFET)来控制电机驱动器的输入电流和电压。

通过调整电子开关的开关周期和占空比,可以改变电机驱动器输入电流的平均值,从而控制电机的运行状态。

在PWM驱动中,电子开关以固定的频率切换开关状态,通过开关控制电流向电机驱动器的输送和截断。

开关周期就是每个切换周期的时间。

占空比则是脉冲开启时间与开关周期之比。

占空比越大,表示开启时间越长,电流平均值越大;反之,占空比越小,电流平均值越小。

对于三相直流电机,每个线圈的电流都是通过PWM驱动进行控制的。

换向控制是通过在三个线圈之间循环切换来实现的。

即在每个PWM 周期内,电机驱动器按顺时针或逆时针的方式依次激活线圈。

在每个激活线圈的时间段内,电流被加载到该线圈上,形成一个可变磁场,推动转子运动。

在PWM驱动中,控制电机的转速和转矩的关键是调整占空比。

通过增加或减小占空比,可以改变电机驱动器输入电流的平均值,从而控制电机的输出功率。

此外,调整PWM的频率也可以影响电机的性能。

通常情况下,增加PWM频率能够减小电机的转矩波动和噪声,提高系统的响应速度和效率。

总结起来,PWM驱动是一种通过调整电机供电的脉冲宽度及频率来精确控制电机转速和转矩的方法。

BLDC和PMSM电机的构造及驱动方案介绍

BLDC和PMSM电机的构造及驱动方案介绍

BLDC和PMSM电机的构造及驱动方案介绍无刷直流(BLDC)和永磁同步电机(PMSM)现在在许多应用中受到青睐,但运行它们的控制软件可能难以实现。

恩智浦的Kinetis电机套件弥补了与嵌入式控制软件和直观GUI的差距,最大限度地降低了软件的复杂性并加快了开发过程。

本文将简要介绍BLDC和PMSM电机的构造和关键操作参数,然后介绍如何驱动它们。

然后,它将讨论软件为何复杂,如何管理以及一些硬件选项。

然后,它将研究如何使用恩智浦的Kinetis电机套件启动和运行项目。

三相无刷直流电机(BLDC)及其近似同类电机,永磁同步电机(PMSM)已成为在过去十年中,由于其控制电子设备的成本急剧下降,新的控制算法激增,因此在过去的十年中,工业领域也越来BLDC电机具有高可靠性,高效率和高功率体积比。

它们可以高速运行(大于10,000 rpm),具有低转子惯量,允许快速加速,减速和快速反向,并具有高功率密度,将大量扭矩包装成紧凑的尺寸。

今天,它们被用于任何数量的应用,包括风扇,泵,真空吸尘器,四轴转换器和医疗设备,仅举几例。

PMSM与带有绕线定子和永磁转子的BLDC具有相似的结构,但定子结构和绕组更类似于AC感应电机,在气隙中产生正弦磁通密度。

PMSM与施加的三相交流电压同步运行,并且具有比交流感应电动机更高的功率密度,因为没有定子功率用于感应转子中的磁场。

今天的设计也更强大,同时具有更低的质量和惯性矩,使其对工业驱动,牵引应用和电器具有吸引力。

创造驱动器鉴于这些优势,它不是不知道这些电机是如此受欢迎。

然而,没有任何东西没有价格,在这种情况下,驱动和控制电路的复杂性。

消除换向电刷(及其伴随的可靠性问题)使得需要电气换向以产生定子旋转场。

这需要一个功率级(图1)。

图1:三相电机驱动的简化框图。

三个半桥在控制器的指导下切换电机相电流,其输出由前置驱动器放大和电平移位。

(使用Digi-Key方案绘制的图表- 它)。

三相直流无刷霍尔电机驱动器说明书

三相直流无刷霍尔电机驱动器说明书

前言本款产品适合驱动持续工作电流在10A以下、额定电压范围在12V~40V之间的任何一款三相直流无刷霍尔电机。

具有免维护、长寿命、低速下总能保持最大转矩等优势。

本产品广泛应用于针织设备、医疗设备、食品机械、电动工具、园林机械、智能家居等电气自动化控制领域。

本手册阐述了该驱动器的的功能、安装、调试、维护、运行等方面的内容。

使用产品前,请认真阅读本手册并熟知本产品的安全注意事项。

在使用本款产品时,若有疑问,请仔细查阅产品说明书或致电我公司售后服务部,我们将竭诚为您服务。

安全注意事项警示标志:危险:表示该操作错误可能危及人身安全!注意:表示该操作错误可能导致设备损坏!注意事项:安装:防止灰尘、腐蚀性气体、导电物体、液体及易燃物侵入,并保持良好的散热条件。

接线:请由专业人员仔细阅读完使用说明之后进行接线作业;接线必须在电源断开的状态下进行,防止电击。

通电前:接通电源前检查并保证接线的准确无误;请确认输入电源与驱动器的额定工作电压及极性是否一致;通电中:驱动器接通电源后,请勿直接接触输出端子,有的端子上有高电压,非常危险;请确保在驱动器指示灯熄灭后再对驱动器的接线端子进行插拔;请勿对驱动器随意进行耐高压与绝缘性能试验;请勿将电磁接触器、电磁开关接到输出回路。

目录前言 (1)安全注意事项 (2)目录 (3)一.概述 (5)1.型号说明 (5)2.功能参数 (5)3.功能特点 (6)二.端口说明 (7)1.接口定义 (7)2.接线示意图 (8)3.安装尺寸 (9)三.功能与使用 (10)1.出厂说明 (10)2.操作步骤说明 (10)2.1外置电位器调速 (11)2.2外部电压调速 (11)2.3外部PWM信号调速 (11)2.4CAN总线控制 (11)3.功能端子说明 (12)3.1F/R端子:正反转功能 (12)3.2EN端子:使能功能 (12)3.3BRK端子:刹车抱死功能 (12)3.4SV端子:外部调速端子 (13)3.5PG端子:电机转速信号输出 (13)3.6ALM端子:报警输出 (13)3.7PWR/ALM:指示灯 (14)一.概述本款驱动器适用于对直流无刷有霍尔电机进行转速控制,其最大的优点是在低速时总能控制电机保持最大转矩。

DSP无刷直流电动机驱动控制程序

DSP无刷直流电动机驱动控制程序

DSP无刷直流电动机驱动控制程序————————————————————————————————作者:————————————————————————————————日期:2.4 无刷直流电动机驱动控制程序//########################################################################## ###/////无刷电机控制源程序//TMS320F2812////########################################################################## ###//=====================================================================//头文件调用//=====================================================================#include "DSP28_Device.h"#include "math.h"#include "float.h"//=====================================================================//常量附值//=====================================================================#define Idc_max 3000 //电流给定最大值#define Idc_min 0 //电流给定最小值//=====================================================================//标志位//=====================================================================char Iab_Data=0;struct Flag_Bits { // bits descriptionUint16 Send:1; // 0 串口发数Uint16 Test:1; // 1 串口测试Uint16 Vflag:1; // 2 转速更新Uint16 SendEnd:1; // 3 串口发送结束Uint16 Sign1:1; // 4 上一次给定转向标志Uint16 Sign2:1; // 5 本次给定转向标志Uint16 Openint:1; // 6 启动标志Uint16 Adfrist:1; // 7 保留Uint16 Spdoff:1; // 8 保留Uint16 Zero:1; // 9 转速过零标志Uint16 Mode:3; // 10-12 保留Uint16 Dshow:1; // 13 保留Uint16 Sign:1; // 14 当前转向标志};union Flag_Reg {Uint16 all;struct Flag_Bits bit;}FlagRegs;//===================================================================== //全局变量//===================================================================== //串口通信变量unsigned int Sci_Rx[8]={0,0,0,0,0,0,0,0}; //接收数据数组unsigned int Sci_Tx[8]={0,0,0,0,0,0,0,0}; //发送数据数组char T_pointer=0; //发送数据数组指针char R_pointer=0; //接收数据数组指针char T_length=1; //发送数据长度char R_length=0; //接收数据长度char a2=0;//控制参数unsigned int spd_kp=0; //转速环P参数unsigned int spd_ki=0; //转速环I参数unsigned int id_kp=0,id_ki=0; //电流PI参数signed int spd_given=0; //转速给定signed int spd_given1=0; //转速给定signed int spd_given2=0; //转速给定//控制变量unsigned int cap1=0; //前次换向标志位unsigned int cap2=0; //本次换向标志位unsigned int intruptcount=0; //定时器1下溢中断次数unsigned int speed_given = 1000; //转速给定signed int Idc_given2=0; //算得本次电流给定值signed int speed_e1=0; //前次转速误差signed int speed_e2=0; //本次转速误差signed int Ia_e1=0; //前次电流误差signed int Ia_e2=0; //本次电流误差char t2first=0;signed int COMP2=0; //装比较寄存器值//转速反馈char Spd_Data=0; //滤波计数int speed_counter=0; //速度环计数器unsigned int cap_a; //本次捕获单元数据unsigned int cap_b; //上次捕获单元数据long cap_c; //捕获单元数据差signed int BLDC_SPD[10]={0,0,0,0,0,0,0,0,0,0};//转速滤波signed int spd_fd_q1=0; //转速反馈临时变量unsigned int spd_fd_q0=0; //转速检测值char cc=0;//电流反馈unsigned int ia[6]={0,0,0,0,0,0}; //A相电流反馈值unsigned int ib[6]={0,0,0,0,0,0}; //B相电流反馈值signed int ia_fd=0,ib_fd=0; //电流反馈signed int Temp_filter=0; //临时变量unsigned int t1per=0; //周期寄存器数值//临时变量signed long long1_tmp=0;signed long long2_tmp=0;signed int u16_tmp1=0;signed int u16_tmp2=0;//===================================================================== //子程序声明//===================================================================== interrupt void t1uf_int(void);interrupt void cap_int(void);void Ad(void);void speed(void); //计算速度void Ia_PI(void); //电流环调节Iavoid speed_PI(void); //速度环调节void bldc(void);void Check_Rxdata(void);void Sci_Send(signed int sci_delay);char *Fen_Jie(signed int Send_Temp);unsigned int Sci_Rx_check(unsigned int i_Rx,unsigned int *p_Rx);signed int DIV_CAL(long signed int dividend,signed int divisor);unsigned int U_DIV_CAL(long unsigned int udividend,unsigned int udivisor);//=====================================================================//主程序开始//===================================================================== void main(void){//控制寄存器初始设置InitSysCtrl(); //初始化系统DINT; //关全局中断IER = 0x0000;IFR = 0x0000;InitPieCtrl(); //初始化PIE中断InitPieVectTable(); //初始化PIE中断矢量表InitGpio(); //初始化Gpio输入输出口InitEv(); //初始化Eva的T和T2InitAdc_Eva(); //初始化ADInitData();EALLOW; // This is needed to write to EALLOW protected registersPieVectTable.T1UFINT=&t1uf_int;//T1下溢中断地址PieVectTable.CAPINT4=&cap_int;PieVectTable.CAPINT5=&cap_int;PieVectTable.CAPINT6=&cap_int;EDIS; // This is needed to disable write to EALLOW protected registersPieCtrl.PIEIER2.bit.INTx6 = 1; //T1下溢中断使能PieCtrl.PIEIER5.bit.INTx5 = 1;PieCtrl.PIEIER5.bit.INTx6 = 1;PieCtrl.PIEIER5.bit.INTx7 = 1;IER |= M_INT2; // Enable CPU Interrupt 2IER |= M_INT4; // Enable CPU Interrupt 4IER |= M_INT5; // Enable CPU Interrupt 5EvbRegs.EVBIMRC.bit.CAP4INT=1;EvbRegs.EVBIMRC.bit.CAP5INT=1;EvbRegs.EVBIMRC.bit.CAP6INT=1;EvbRegs.CAPCONB.all=0x36FF;NOP;NOP;NOP;NOP;EvbRegs.CAPCONB.all=0xB6FF;EINT; //使能全局中断INTMERTM; // Enable Global realtime interrupt DBG//等待中断(中断之外的时间内进行LCD的发送和接收)for(;;){SCI_CTL();}}//===================================================================== //串口控制//===================================================================== //*************//接收数据检测//************void Check_Rxdata(){switch(Sci_Rx[0]){case 'm': //转速给定和转速在线更新 case 'v':{FlagRegs.bit.Vflag=1;if(Sci_Rx[1]=='-'){FlagRegs.bit.Sign1=0; //转速为负值spd_given1 = Sci_Rx_check(4,Sci_Rx);}else{FlagRegs.bit.Sign1=1; //转速为正值spd_given1 = Sci_Rx_check(3,Sci_Rx);}if(Sci_Rx[0]=='m'){FlagRegs.bit.Sign2=FlagRegs.bit.Sign1;FlagRegs.bit.Sign=FlagRegs.bit.Sign1;}break;}case 's': //启动{Sci_Tx[0]='a';Sci_Tx[1]='+';Sci_Tx[2]='0';Sci_Tx[3]='0';Sci_Tx[4]='0';Sci_Tx[5]='0';Sci_Tx[6]='0';Sci_Tx[7]='z';spd_given=spd_given1;Protect_Data();Motor_Start();FlagRegs.bit.Send=1;T_length=8;T_pointer=0;break;}case 't': //停止 {Motor_Stop();break;}default: break;}}//*******************// 串口接收/发送判断//******************SCI_CTL(){if((SciaTx_Ready() == 1) && (FlagRegs.bit.Send == 1))//发送数据准备好并且软件使能发送{if(FlagRegs.bit.Test==0) //SCI测通状态{SciaRegs.SCITXBUF = Sci_Rx[T_pointer];T_pointer++; //发送缓冲器数组指针+1if(T_pointer==R_length){FlagRegs.bit.Test=1;FlagRegs.bit.Send=0;T_pointer=0;}}else //SCI非测通状态{SciaRegs.SCITXBUF = Sci_Tx[T_pointer];T_pointer++; //发送缓冲器数组指针+1if(T_pointer==T_length){FlagRegs.bit.Send = 0;T_pointer=0;}if(T_pointer>=10){T_pointer=0;FlagRegs.bit.Send= 0;}}R_pointer=0;}#if !SCIA_INTif(SciaRx_Ready() == 1) //接收数据准备好{FlagRegs.bit.SendEnd=0;FlagRegs.bit.Send= 0;Sci_Rx[R_pointer] = SciaRegs.SCIRXBUF.all;R_pointer++;if(Sci_Rx[R_pointer-1]=='z'){R_length=R_pointer-1;FlagRegs.bit.Send= 1;FlagRegs.bit.SendEnd=1;if(FlagRegs.bit.Test==1){Check_Rxdata();R_pointer = 0;}}if(R_pointer== 10){R_pointer = 0;}}#endif}//****************//接收数据格式调整//****************unsigned int Sci_Rx_check(unsigned int i_Rx,unsigned int *p_Rx){unsigned long data_Rx;unsigned int *p_tmp_Rx=p_Rx+i_Rx;data_Rx=1000*(*p_tmp_Rx)+100*(*(p_tmp_Rx+1))+10*(*(p_tmp_Rx+2))+(*(p_tmp_Rx+ 3))-53328;return(data_Rx);}//****************//发送数据格式调整//****************char *Fen_Jie(signed int Send_Temp) {unsigned int Temp;char s1,s2,s3,s4;char String_Tmp[6]={0,0,0,0,0,'\0'}; if(Send_Temp< 0){String_Tmp[0]='-';Send_Temp=-Send_Temp;}else{String_Tmp[0]='+';}s1=((long)Send_Temp*2097)>>21;if(s1>=10) {s1=9;}Temp=Send_Temp-s1*1000;s2=((long)Temp*5253)>>19;if(s2>=10) {s2=9;}Temp=Temp-s2*100;s3=((long)Temp*3277)>>15;if(s3>=10) {s3=9;}s4=Temp-s3*10;if(s4>=10) {s4=9;}String_Tmp[1]=s1+48; //千位String_Tmp[2]=s2+48; //百位String_Tmp[3]=s3+48; //十位String_Tmp[4]=s4+48; //个位return(String_Tmp);}//**************// 数据发送//**************void Sci_Send(signed int sci_delay){//串口数据发送char *p_send=0;a2++;if((a2>=sci_delay)&&(FlagRegs.bit.Send==0)&&(FlagRegs.bit.SendEnd==1)) {p_send=Fen_Jie(spd_fd_q0);Sci_Tx[0]='a';Sci_Tx[1]=*p_send;Sci_Tx[2]='0';Sci_Tx[3]=*(p_send+1);Sci_Tx[4]=*(p_send+2);Sci_Tx[5]=*(p_send+3);Sci_Tx[6]=*(p_send+4);Sci_Tx[7]='z';FlagRegs.bit.Send=1;a2=0;}}//===================================================================== //电机状态控制//===================================================================== //*******************// 数据处理//******************Protect_Data(){if(spd_kp<=0)spd_kp=1; //转速环P参数else if(spd_kp>30000) spd_kp=30000;if(spd_ki<=0)spd_ki=1; //转速环P参数else if(spd_ki>30000) spd_ki=30000;if(id_kp<=0)id_kp=1; //转速环P参数else if(id_kp>30000) id_kp=30000;if(id_ki<=0)id_ki=1; //转速环P参数else if(id_ki>30000) id_ki=30000;EvaRegs.T1PR =7500; //矢量控制开关频率5K固定t1per=7500;EvaRegs.T1CON.all = 0X080C; //连续增减计数InitAdc_Eva();} //************//电机停止//************ Motor_Stop(){EvaRegs.CMPR1=0;EvaRegs.CMPR2=0;EvaRegs.CMPR3=0;EvaRegs.ACTR.all=0X0FFF;InitData();FlagRegs.bit.Openint=0;EvaRegs.T1CON.bit.TENABLE=0;EvbRegs.T3CON.bit.TENABLE=0;}//************//电机启动//************Motor_Start(){EvaRegs.ACTR.all=0X0999;FlagRegs.bit.Openint=1;t1per=7500;EvaRegs.T1PR =7500; //周期寄存器 5khzEvaRegs.T1CON.all = 0X080C; //连续增减计数EvbRegs.T3PR =0xffff; // 周期寄存器EvbRegs.T3CON.all = 0X170C; // 连续增减计数EvbRegs.EVBIMRA.all=0X0000; // T3下溢使能EvbRegs.EVBIFRA.all=0X0FFFF; // 清中断标志位GpioMuxRegs.GPBMUX.bit.CAP4Q1_GPIOB8=0; //将cap456设置为io口 GpioMuxRegs.GPBMUX.bit.CAP5Q2_GPIOB9=0;GpioMuxRegs.GPBMUX.bit.CAP6QI2_GPIOB10=0;cap2 = GpioDataRegs.GPBDAT.all & 0x0700; //记录cap4-6初始状态cap2 = cap2>>8;cap2 = cap2&0x0007;if(FlagRegs.bit.Sign==1) cap2=7-cap2;else cap2=cap2;GpioMuxRegs.GPBMUX.bit.CAP4Q1_GPIOB8=1; //将cap456设置为CAP口 GpioMuxRegs.GPBMUX.bit.CAP5Q2_GPIOB9=1;GpioMuxRegs.GPBMUX.bit.CAP6QI2_GPIOB10=1;EvaRegs.T1CON.bit.TENABLE=1;FlagRegs.bit.Vflag=1;}//===================================================================== //直流无刷电动机驱动双闭环主程序//===================================================================== //*****************//驱动主程序//*****************void bldc(){intruptcount++;speed();switch((int)cap2){case 4:{Ad(); //检测电流if(ia_fd<0) ia_fd=0; //保护speed_PI(); //转速PI调节Ia_PI(); //电流PI调节EvaRegs.ACTR.all = 0x0F3E; //ia+,ib-EvaRegs.CMPR1=COMP2;break;}case 5:{Ad(); //检测电流if(ia_fd<0) ia_fd=0; //保护speed_PI(); //转速PI调节Ia_PI(); //电流PI调节EvaRegs.ACTR.all = 0x03FE; //ia+,ic- EvaRegs.CMPR1=COMP2;break;}case 1:{Ad();if(ib_fd<0) ib_fd=0;ia_fd=ib_fd;speed_PI();Ia_PI();EvaRegs.ACTR.all = 0x03EF; //ib+,ic- EvaRegs.CMPR2=COMP2;break;}case 3:{Ad();if(ib_fd<0) ib_fd=0;speed_PI();Ia_PI();EvaRegs.ACTR.all = 0x0FE3; //ib+,ia- EvaRegs.CMPR2=COMP2;break;}case 2:{Ad();ia_fd=-ia_fd;if(ia_fd<0) ia_fd=0;speed_PI();Ia_PI();EvaRegs.ACTR.all = 0x0EF3; //ic+,ia- EvaRegs.CMPR3=COMP2;break;}case 6:{Ad();ib_fd=-ib_fd;if(ib_fd<0) ib_fd=0;speed_PI();Ia_PI();EvaRegs.ACTR.all = 0x0E3F; //ic+,ib-EvaRegs.CMPR3=COMP2;break;}default: break;}}//********************************//电流反馈//********************************void Ad(){char delay_zy=0;ia_fd=0,ib_fd=0; //AB相电流检测值清零 for(Iab_Data=0;Iab_Data<=5;Iab_Data++){ia[Iab_Data]=AdcRegs.RESULT0>>4;ib[Iab_Data]=AdcRegs.RESULT1>>4;if(Iab_Data==0){for(delay_zy=0;delay_zy<=10;delay_zy++) {;}}else if(Iab_Data==1){if(ia[0]>ia[1]){Temp_filter= ia[1];ia[1] = ia[0];ia[0] = Temp_filter;}if(ib[0]>ib[1]){Temp_filter= ib[1];ib[1] = ib[0];ib[0] = Temp_filter;}}else{if(ia[Iab_Data]>ia[1]){Temp_filter= ia[1];ia[1] = ia[Iab_Data];ia[Iab_Data] = Temp_filter;}else if(ia[Iab_Data]<ia[0]){Temp_filter= ia[0];ia[0] = ia[Iab_Data];ia[Iab_Data] = Temp_filter;}if(ib[Iab_Data]<ib[0]){Temp_filter= ib[0];ib[0] = ib[Iab_Data];ib[Iab_Data] = Temp_filter;}else if(ib[Iab_Data]>ib[1]){Temp_filter= ib[1];ib[1] = ib[Iab_Data];ib[Iab_Data] = Temp_filter;}}}ia_fd=(ia[2]+ia[3]+ia[4]+ia[5])>>2; ib_fd=(ib[2]+ib[3]+ib[4]+ib[5])>>2; ia_fd=ia_fd-2133;ib_fd=ib_fd-2150;}//********************************//转速反馈计算//********************************void speed(void){if((cap2 != cap1)&&(t2first==1)){if(cap_c!= 0){long2_tmp = 1953125/cap_c;spd_fd_q1 = long2_tmp;intruptcount=0;switch(cap2){case 5:{if(cap1==4) spd_fd_q1=-spd_fd_q1; break;}case 4:{if(cap1==6) spd_fd_q1=-spd_fd_q1; break;case 6:{if(cap1==2) spd_fd_q1=-spd_fd_q1; break;}case 2:{if(cap1==3) spd_fd_q1=-spd_fd_q1; break;}case 3:{if(cap1==1) spd_fd_q1=-spd_fd_q1; break;}case 1:{if(cap1==5) spd_fd_q1=-spd_fd_q1; break;}default:break;}BLDC_SPD[Spd_Data]=spd_fd_q1;if(Spd_Data==1)if(BLDC_SPD[0]>BLDC_SPD[1]){Temp_filter = BLDC_SPD[1];BLDC_SPD[1] = BLDC_SPD[0];BLDC_SPD[0] = Temp_filter;}}else{if(BLDC_SPD[Spd_Data]>BLDC_SPD[1]){Temp_filter= BLDC_SPD[1];BLDC_SPD[1] = BLDC_SPD[Spd_Data];BLDC_SPD[Spd_Data] = Temp_filter;}else if(BLDC_SPD[Spd_Data]<BLDC_SPD[0]) {Temp_filter= BLDC_SPD[0];BLDC_SPD[0] = BLDC_SPD[Spd_Data];BLDC_SPD[Spd_Data] = Temp_filter;}}Spd_Data++;if(Spd_Data>=10){Spd_Data=0;}cc++;if(cc>=3){cc=0;spd_fd_q0=(BLDC_SPD[2]+BLDC_SPD[3]+BLDC_SPD[4]+BLDC_SPD[5]+BLDC_SPD[6]+BLDC_ SPD[7]+BLDC_SPD[8]+BLDC_SPD[9])>>3;}cap1=cap2;}else{spd_fd_q0 = 0;}}else{if(intruptcount>=1500){intruptcount=0;spd_fd_q0=0;}else{spd_fd_q0=spd_fd_q0;}}if(t2first==0) t2first=1;}//********************************//转速调节器//********************************void speed_PI(void){unsigned int abs_spd=0;signed int spd_ki_bldc=1;speed_counter++;if(speed_counter>=10){speed_counter=0;if(FlagRegs.bit.Vflag==1) //转速给定更新{if(FlagRegs.bit.Sign1!=FlagRegs.bit.Sign2)//新转向和原有转向不同 {FlagRegs.bit.Zero =1; //换转向标志位置位spd_given2=spd_given; //缓存目标频率spd_given=0; //当前目标频率给定0}FlagRegs.bit.Vflag =0; //转速给定更新标志位清零FlagRegs.bit.Sign2=FlagRegs.bit.Sign1; //更新转向标志}if((spd_fd_q0==0)&&(FlagRegs.bit.Zero==1)) //当前给定频率,目标频率需要反向(电机需要从正转到反转){spd_given=spd_given2; //给定新的目标频率FlagRegs.bit.Zero=0; //换转向标志位清零FlagRegs.bit.Sign=FlagRegs.bit.Sign1; //给定新的转向}speed_e1 = speed_e2; //将本次误差用作下次使用speed_e2 = spd_given - abs(spd_fd_q0);abs_spd=abs(spd_given)>>2;if((abs(speed_e2))<abs_spd){spd_ki_bldc=spd_ki;}else{if(spd_given<100) spd_ki_bldc=12;//10*8else if(spd_given<150) spd_ki_bldc=10;else if(spd_given<200) spd_ki_bldc=8;else if(spd_given<250) spd_ki_bldc=6;else if(spd_given<300) spd_ki_bldc=5;else spd_ki_bldc=4;}long1_tmp= (long)spd_kp * (speed_e2 - speed_e1); long2_tmp= (long)spd_ki_bldc * speed_e2;u16_tmp1=(long1_tmp+long2_tmp)>>10;Idc_given2=Idc_given2+u16_tmp1;if(Idc_given2 > Idc_max) //限幅Idc_given2 = Idc_max;else if(Idc_given2 < Idc_min)Idc_given2 = Idc_min;}}//********************************//电流调节器//********************************void Ia_PI(void){Ia_e1 = Ia_e2; //将本次误差用作下次使用Ia_e2 = Idc_given2 - ia_fd;long1_tmp=(long)id_kp * (Ia_e2 - Ia_e1);long2_tmp=(long)id_ki * Ia_e2;u16_tmp1=(long1_tmp+long2_tmp)>>12;COMP2=COMP2+u16_tmp1;if(COMP2 < 0)COMP2 = 0;else if(COMP2 > (t1per-200))COMP2 = (t1per-200);}//===================================================================== //T1下溢中断子程序//===================================================================== interrupt void t1uf_int(void){IFR=0x0000; //中断标志位清零PieCtrl.PIEACK.all=0xffff;if(FlagRegs.bit.Openint==1) //控制程序准备开始运行{bldc();GpioDataRegs.GPACLEAR.bit.GPIOA11=1;Sci_Send(400);}EvaRegs.EVAIFRA.bit.T1UFINT=1; //T1下溢中断标志位清零EINT;}//=====================================================================// CAP4/5/6中断子程序//===================================================================== interrupt void cap_int(void){IFR=0x0000;PieCtrl.PIEACK.all=0xffff;GpioMuxRegs.GPBMUX.bit.CAP4Q1_GPIOB8=0; //将cap456设置为io口GpioMuxRegs.GPBMUX.bit.CAP5Q2_GPIOB9=0;GpioMuxRegs.GPBMUX.bit.CAP6QI2_GPIOB10=0;cap2 = GpioDataRegs.GPBDAT.all & 0x0700; //记录cap4-6初始状态cap2 = cap2>>8;cap2 = cap2&0x0007;if(FlagRegs.bit.Sign==1) cap2=7-cap2;else cap2=cap2;if(EvbRegs.EVBIFRC.bit.CAP4INT==1){cap_a=EvbRegs.CAP4FIFO;EvbRegs.EVBIFRC.bit.CAP4INT=1;}else if(EvbRegs.EVBIFRC.bit.CAP5INT==1){cap_a=EvbRegs.CAP5FIFO;EvbRegs.EVBIFRC.bit.CAP5INT=1;}else if(EvbRegs.EVBIFRC.bit.CAP6INT==1)cap_a=EvbRegs.CAP6FIFO;EvbRegs.EVBIFRC.bit.CAP6INT=1;}cap_c=cap_a-cap_b;if(cap_c<0) cap_c=cap_c+0xffff;cap_b=cap_a;GpioMuxRegs.GPBMUX.bit.CAP4Q1_GPIOB8=1; //将cap456设置为CAP口 GpioMuxRegs.GPBMUX.bit.CAP5Q2_GPIOB9=1;GpioMuxRegs.GPBMUX.bit.CAP6QI2_GPIOB10=1;EINT;}InitData(){char i;T_pointer=0; //发送数据数组指针R_pointer=0; //接收数据数组指针a2=0;for(i=0;i<8;i++){Sci_Rx[i]=0;Sci_Tx[i]=0;cap1=0; //前次换向标志位cap2=0; //本次换向标志位intruptcount=0; //定时器1下溢中断次数Idc_given2=0; //算得本次电流给定值speed_e1=0; //前次转速误差speed_e2=0; //本次转速误差Ia_e1=0; //前次电流误差Ia_e2=0; //本次电流误差t2over=0;t2first=0;COMP2=0; //装比较寄存器值speed_counter=0; //速度环计数器cap_a=0;cap_b=0;cap_c=0;for(i=0;i<10;i++){BLDC_SPD[i]=0;}}/////////////////////////////////////////////////////////////////////// // BLDC.c 程序结束////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 文件名: DSP28_Ev.c// 意义: DSP28 EV初始化/////////////////////////////////////////////////////////////////////// #include "DSP28_Device.h"void InitEv(void){//定时器T1初始化EvaRegs.T1PR =7500; //周期寄存器 5khzEvaRegs.T1CON.all = 0X080C; //连续增减计数EvaRegs.CMPR1=0; //比较寄存器初始化EvaRegs.CMPR2=0;EvaRegs.CMPR3=0;EvaRegs.ACTR.all=0X0FFF; //6PWM强制高CONA.all=0X8A00; //比较寄存器T1下溢重载CONA.bit.ACTRLD=2; //方式控制寄存器立即重载EvaRegs.DBTCONA.all=0X0FF4; //死区3.2usEvaRegs.T1CNT=0;EvaRegs.EVAIMRA.all=0X0200; //T1下溢使能EvaRegs.EVAIFRA.all=0X0FFFF; //清中断标志位//定时器T4初始化EvbRegs.T4PR = 60000; // 周期寄存器EvbRegs.T4CON.all = 0X0F0C; // 连续增减计数EvbRegs.EVBIMRB.all=0X0000; // T4中断不使能EvbRegs.EVBIFRB.all=0X0FFFF; // 清中断标志位}/////////////////////////////////////////////////////////////////////// // DSP28_Ev.c结束/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 文件名: DSP28_Sci.c// 意义: DSP28 SCI 初始化//////////////////////////////////////////////////////////////////////// #include "DSP28_Device.h"unsigned int * UART_MODE = (unsigned int *) 0x4010;void InitSci(void){// Initialize SCI-A:*UART_MODE = 0x44;EALLOW;GpioMuxRegs.GPFMUX.all = 0x0030;EDIS;SciaRegs.SCICCR.all = 0x07; //8位,无校验SciaRegs.SCICTL1.all = 0x03; //软件复位发送接收使能SciaRegs.SCIHBAUD = 0x01; //波特率9600B/S SciaRegs.SCILBAUD = 0x0E7;SciaRegs.SCICTL1.all = 0x23; //清除软件复位发送接收使能}//发送准备好int SciaTx_Ready(void){unsigned int i;if(SciaRegs.SCICTL2.bit.TXRDY == 1){i = 1;}else{i = 0;}return(i);}//接收准备好int SciaRx_Ready(void){unsigned int i;if(SciaRegs.SCIRXST.bit.RXRDY == 1){i = 1;}else{i = 0;}return(i);}///////////////////////////////////////////////////////////////////////////DSP28_Sci.c结束///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// 文件名: DSP28_SysCtrl.c// 意义: DSP28 系统控制寄存器初始化//////////////////////////////////////////////////////////////////////////// #include "DSP28_Device.h"void InitSysCtrl(void){Uint16 i;EALLOW;DevEmuRegs.M0RAMDFT = 0x0300;DevEmuRegs.M1RAMDFT = 0x0300;DevEmuRegs.L0RAMDFT = 0x0300;DevEmuRegs.L1RAMDFT = 0x0300;DevEmuRegs.H0RAMDFT = 0x0300;// Disable watchdog moduleSysCtrlRegs.WDCR= 0x0068;// Initalize PLLSysCtrlRegs.PLLCR = 0xA; //CLKIN=150M// Wait for PLL to lockfor(i= 0; i< 5000; i++){}// HISPCP/LOSPCP prescale register settings, normally it will be set to default valuesSysCtrlRegs.HISPCP.all = 0x0001; //高速时钟75MSysCtrlRegs.LOSPCP.all = 0x0002; //低速时钟37.5M// Peripheral clock enables set for the selected peripherals.SysCtrlRegs.PCLKCR.bit.EVAENCLK=1; //使能EVASysCtrlRegs.PCLKCR.bit.EVBENCLK=1; //使能EVBSysCtrlRegs.PCLKCR.bit.SCIENCLKA=1;//使能SCISysCtrlRegs.PCLKCR.bit.ADCENCLK=1; //使能ADC}///////////////////////////////////////////////////////////////////////////DSP28_SysCtrl.c结束//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 文件: DSP28_PieCtrl.c// 意义: DSP28 PIE 控制寄存器初始化///////////////////////////////////////////////////////////////////////// #include "DSP28_Device.h"void InitPieCtrl(void){// Disable PIE:PieCtrl.PIECRTL.bit.ENPIE = 0;// Clear all PIEIER registers:PieCtrl.PIEIER1.all = 0;PieCtrl.PIEIER2.all = 0;PieCtrl.PIEIER3.all = 0;PieCtrl.PIEIER4.all = 0;PieCtrl.PIEIER5.all = 0;PieCtrl.PIEIER6.all = 0;PieCtrl.PIEIER7.all = 0;PieCtrl.PIEIER8.all = 0;PieCtrl.PIEIER9.all = 0;PieCtrl.PIEIER10.all= 0;PieCtrl.PIEIER11.all= 0;PieCtrl.PIEIER12.all= 0;// Clear all PIEIFR registers:PieCtrl.PIEIFR1.all = 0;PieCtrl.PIEIFR2.all = 0;PieCtrl.PIEIFR3.all = 0;PieCtrl.PIEIFR4.all = 0;PieCtrl.PIEIFR5.all = 0;PieCtrl.PIEIFR6.all = 0;PieCtrl.PIEIFR7.all = 0;PieCtrl.PIEIFR8.all = 0;PieCtrl.PIEIFR9.all = 0;PieCtrl.PIEIFR10.all= 0;PieCtrl.PIEIFR11.all= 0;PieCtrl.PIEIFR12.all= 0;// Enable PIE:PieCtrl.PIECRTL.bit.ENPIE = 1;PieCtrl.PIEACK.all = 0xFFFF;}///////////////////////////////////////////////////////////////////////////DSP28_PieCtrl.c结束//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 文件名: DSP28_PieVect.c// 意义: DSP28 PIE 向量表初始化//////////////////////////////////////////////////////////////////////////// #include "DSP28_Device.h"const struct PIE_VECT_TABLE PieVectTableInit = {PIE_RESERVED, // Reserved spacePIE_RESERVED,PIE_RESERVED,PIE_RESERVED,PIE_RESERVED,PIE_RESERVED,PIE_RESERVED,PIE_RESERVED,PIE_RESERVED,PIE_RESERVED,PIE_RESERVED,PIE_RESERVED,PIE_RESERVED,// Non-Peripheral InterruptsINT13_ISR, // XINT13 or CPU-Timer 1 INT14_ISR, // CPU-Timer2DATALOG_ISR, // Datalogging interrupt RTOSINT_ISR, // RTOS interruptEMUINT_ISR, // Emulation interrupt NMI_ISR, // Non-maskable interrupt ILLEGAL_ISR, // Illegal operation TRAP USER0_ISR, // User Defined trap 0 USER1_ISR, // User Defined trap 1 USER2_ISR, // User Defined trap 2USER3_ISR, // User Defined trap 3 USER4_ISR, // User Defined trap 4 USER5_ISR, // User Defined trap 5 USER6_ISR, // User Defined trap 6 USER7_ISR, // User Defined trap 7 USER8_ISR, // User Defined trap 8 USER9_ISR, // User Defined trap 9 USER10_ISR, // User Defined trap 10 USER11_ISR, // User Defined trap 11 // Group 1 PIE VectorsPDPINTA_ISR, // EV-APDPINTB_ISR, // EV-Brsvd_ISR,XINT1_ISR,XINT2_ISR,ADCINT_ISR, // ADCTINT0_ISR, // Timer 0WAKEINT_ISR, // WD// Group 2 PIE VectorsCMP1INT_ISR, // EV-ACMP2INT_ISR, // EV-ACMP3INT_ISR, // EV-AT1PINT_ISR, // EV-AT1CINT_ISR, // EV-AT1UFINT_ISR, // EV-Arsvd_ISR,// Group 3 PIE Vectors T2PINT_ISR, // EV-A T2CINT_ISR, // EV-A T2UFINT_ISR, // EV-A T2OFINT_ISR, // EV-A CAPINT1_ISR, // EV-A CAPINT2_ISR, // EV-A CAPINT3_ISR, // EV-A rsvd_ISR,// Group 4 PIE Vectors CMP4INT_ISR, // EV-B CMP5INT_ISR, // EV-B CMP6INT_ISR, // EV-B T3PINT_ISR, // EV-B T3CINT_ISR, // EV-B T3UFINT_ISR, // EV-B T3OFINT_ISR, // EV-B rsvd_ISR,// Group 5 PIE Vectors T4PINT_ISR, // EV-B T4CINT_ISR, // EV-B T4UFINT_ISR, // EV-B T4OFINT_ISR, // EV-BCAPINT5_ISR, // EV-B CAPINT6_ISR, // EV-B rsvd_ISR,// Group 6 PIE Vectors SPIRXINTA_ISR, // SPI-A SPITXINTA_ISR, // SPI-A rsvd_ISR,rsvd_ISR,MRINTA_ISR, // McBSP-A MXINTA_ISR, // McBSP-A rsvd_ISR,rsvd_ISR,// Group 7 PIE Vectors rsvd_ISR,rsvd_ISR,rsvd_ISR,rsvd_ISR,rsvd_ISR,rsvd_ISR,rsvd_ISR,rsvd_ISR,// Group 8 PIE Vectors rsvd_ISR,rsvd_ISR,rsvd_ISR,rsvd_ISR,rsvd_ISR,rsvd_ISR,rsvd_ISR,// Group 9 PIE Vectors SCIRXINTA_ISR, // SCI-A SCITXINTA_ISR, // SCI-A SCIRXINTB_ISR, // SCI-B SCITXINTB_ISR, // SCI-B ECAN0INTA_ISR, // eCAN ECAN1INTA_ISR, // eCANrsvd_ISR,rsvd_ISR,// Group 10 PIE Vectors rsvd_ISR,rsvd_ISR,rsvd_ISR,rsvd_ISR,rsvd_ISR,rsvd_ISR,rsvd_ISR,rsvd_ISR,// Group 11 PIE Vectorsrsvd_ISR,rsvd_ISR,rsvd_ISR,rsvd_ISR,rsvd_ISR,rsvd_ISR,rsvd_ISR,// Group 12 PIE Vectorsrsvd_ISR,rsvd_ISR,rsvd_ISR,rsvd_ISR,rsvd_ISR,rsvd_ISR,rsvd_ISR,rsvd_ISR,};void InitPieVectTable(void){int16 i;Uint32 *Source = (void *) &PieVectTableInit;Uint32 *Dest = (void *) &PieVectTable;EALLOW;for(i=0; i < 128; i++)*Dest++ = *Source++;EDIS;// Enable the PIE Vector TablePieCtrl.PIECRTL.bit.ENPIE = 1;}///////////////////////////////////////////////////////////////////////// //DSP28_PieVect.c结束////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 文件名: DSP28_Gpio.c// 意义: 初始化I/O///////////////////////////////////////////////////////////////////////// #include "DSP28_Device.h"void InitGpio(void){EALLOW;// Set GPIO A port pins, enable 6PWMGpioMuxRegs.GPAMUX.all=0x033F; // EVA PWM 1-6GpioMuxRegs.GPADIR.all=0xFF3F;。

合泰 BLDCH-2208A 直流无刷电机驱动器 用户使用手册说明书

合泰 BLDCH-2208A 直流无刷电机驱动器 用户使用手册说明书

使用前请认真阅读本手册BLDCH-2208A常州合泰电机电器股份有限公司直流无刷电机驱动器用户使用手册1 简介BLDCH-2208A 直流无刷电机驱动器是由常州合泰电机电器股份有限公司自主研发完成的,针对中功率高压直流无刷电机驱动的高性能无刷驱动产品。

BLDCH-2208A 直流无刷电机驱动器适用于功率为750W 及以下三相直流无刷电机。

本产品设计采用先进的DSP 控制技术,具有大扭矩,低噪声,低振动,快速启停等特性。

同时具备PID 电流及速度闭环控制、过压,欠压,过流,过温等保护功能。

实现了手动速度调节与上位机模拟电压速度调节,上位机脉冲频率速度调节的完美统一。

1.2 使用特点■ 产品易使用、快上手① 自带电位器可调速② 接上开关、就可以实现正反转、启停、刹车■ 多样化调速手段① 内置电位器调速② 外接电位器调速③ 外部信号调速④ PWM 调速■ 速度信号输出、报警输出■自带电流设定保护功能2 电气性能及环境指标2.1 电气指标驱动器参数最小值额定值最大值输入电压 AC (V)180220265输出电流(A) 4.28适用电机转速(rpm)020000霍尔信号电压(V) 4.55 5.5霍尔驱动电流(mA)20外接调速电位器(KΩ)102.2 环境指标环境因素环境指标冷却方式自然冷却或强制冷却使用场合避免粉尘,油污及腐蚀性气体使用温度10℃~+50℃环境湿度80%RH(无结露)震动 5.7m/S2 max 存储温度-20℃~+125℃■ 开环、闭环速度控制P-sv 电流设定电位器,通过设定运行电流最高限定值,便可实现电机过载保护。

当电机运行电流超过设定值时,保护功能启动,驱动器停止作业保护电机。

3 械尺寸及安装图9717434356543.565644 驱动器接口及接线示意图 4.1 驱动器接口+SPEEDRV:调速电位器RUN/ALMSPEEDALM 霍尔端口REF-HW HV HU REF+SV:外部电位器接线端COM:公共端口F/R:方向EN:使能BRK:快速刹车+5V:公共电源P-sv:电流设定电位器+SPEED电机端口U V WAC ~AC ~FG SW1SW24、2 输入口连接4、3 输出口连接信号端子信号名内容输入SV 调速信号输入端口① 外接输入调速电位器; ② 模拟信号输入; ③ PWM 调速信号输入。

三相全波无刷直流电机及其驱动方法基础

三相全波无刷直流电机及其驱动方法基础

三相全波无刷直流电机及其驱动方法基础下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。

文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you! In addition, this shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!三相全波无刷直流电机及其驱动方法基础引言随着电动化技术的发展,无刷直流电机及其驱动方法在各种应用中扮演着越来越重要的角色。

三相无刷直流电机驱动原理

三相无刷直流电机驱动原理

三相无刷直流电机驱动原理一、引言三相无刷直流电机是一种广泛应用于工业和家电领域的电机,其驱动原理是通过电子器件实现电机转子的控制和驱动。

本文将从三相无刷直流电机的基本结构、工作原理以及驱动器件的选择和控制方法等方面进行介绍。

二、三相无刷直流电机的基本结构三相无刷直流电机由转子、定子和传感器组成。

转子是由永磁体组成,定子则由三组线圈(A、B、C相)和磁铁组成。

传感器用于检测转子位置,通常采用霍尔元件或光电传感器。

三、三相无刷直流电机的工作原理三相无刷直流电机通过交替激励定子线圈,产生磁场,使转子转动。

其工作原理可以简单描述为以下几个步骤:1. 传感器检测转子位置:传感器会实时检测转子的位置,并将检测结果反馈给控制器。

2. 控制器计算相应的电流:根据传感器反馈的转子位置信息,控制器会计算出相应的电流值,并将电流信号发送给电机驱动器。

3. 电机驱动器控制电流:电机驱动器根据控制器发送的电流信号,控制电流的大小和方向,使电机产生适当的转矩。

4. 电机转子运动:根据电机驱动器控制的电流信号,电机转子会按照一定的顺序和速度进行旋转。

5. 重复上述步骤:电机会不断地重复执行上述步骤,以保持转子的稳定转动。

四、三相无刷直流电机驱动器件的选择选择适合的驱动器件对于三相无刷直流电机的正常运行至关重要。

常用的驱动器件包括功率MOSFET、IGBT和功率集成电路等。

1. 功率MOSFET:功率MOSFET具有开关速度快、损耗小等特点,适合用于中低功率的电机驱动。

2. IGBT:IGBT具有较高的工作电压和工作温度范围,适合用于高功率电机驱动。

3. 功率集成电路:功率集成电路集成了多种功能和保护电路,能够提供更全面的电机驱动控制。

五、三相无刷直流电机的控制方法三相无刷直流电机的控制方法主要有霍尔传感器反馈控制和电动势反馈控制。

1. 霍尔传感器反馈控制:通过采集霍尔传感器检测的转子位置信息,实时调整电机驱动器的输出电流,以控制电机转速和转向。

三相无刷直流电机驱动电路

三相无刷直流电机驱动电路

三相无刷直流电机驱动电路三相无刷直流电机驱动电路是一种常用于工业和家电领域的电机驱动方案。

相比传统的有刷直流电机,无刷直流电机具有更高的效率、更低的噪音和更长的使用寿命。

本文将介绍三相无刷直流电机驱动电路的原理、特点以及应用领域。

一、无刷直流电机的原理无刷直流电机是一种基于电子换向技术的电机,其工作原理类似于传统的有刷直流电机。

无刷直流电机由转子、定子和电子换向器三部分组成。

转子是由永磁体组成的,定子则是由多相绕组组成的。

电子换向器根据转子位置和速度信息,通过控制电流的方向和大小,实现电机的高效运转。

三相无刷直流电机驱动电路主要由功率电子器件、驱动电路和控制器三部分组成。

功率电子器件通常采用IGBT(绝缘栅双极型晶体管)或MOSFET(金属氧化物半导体场效应晶体管),用于控制电流的通断和方向。

驱动电路负责产生适当的驱动信号,将控制器输出的信号转化为功率电子器件所需的控制信号。

控制器是电机控制系统的核心,负责根据转子位置和速度信息,产生适当的控制信号,并将其送至驱动电路。

三、三相无刷直流电机驱动电路的特点1. 高效率:无刷直流电机由于无需通过电刷和换向器,减少了能量损耗,提高了电机的效率。

在工业和家电领域,高效率是提高设备性能的关键因素之一。

2. 低噪音:无刷直流电机在工作过程中,没有机械接触和摩擦,因此噪音较低。

这使得无刷直流电机在一些对噪音要求较高的场合得到了广泛应用,比如家电领域的洗衣机和吸尘器等。

3. 高可靠性:由于无刷直流电机没有电刷和换向器等易损件,因此具有更长的使用寿命和更高的可靠性。

这使得无刷直流电机在一些对设备寿命要求较高的场合得到了广泛应用,比如工业自动化领域的机床和机械手等。

4. 精确控制:由于控制器可以根据转子位置和速度信息进行精确控制,因此无刷直流电机具有较好的速度和转矩响应特性。

这使得无刷直流电机在一些对运动控制要求较高的场合得到了广泛应用,比如机器人、无人机和电动汽车等。

三相直流无刷电机驱动程序

三相直流无刷电机驱动程序

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;//配置PWM输出TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;TIM_OCInitStructure.TIM_Pulse = 1;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Set;TIM_OC1Init(TIM1, &TIM_OCInitStructure);TIM_OC2Init(TIM1, &TIM_OCInitStructure);TIM_OC3Init(TIM1, &TIM_OCInitStructure);TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器TIM_Cmd(TIM1 , ENABLE);TIM_Cmd(TIM1 , ENABLE);TIM_CtrlPWMOutputs(TIM1, ENABLE);}/****************************************************************************** ***********函数:void Motor_Init(void)描述:参数:返回:******************************************************************************* **********/void Motor_Init(void){IO_Init();PWM_Init();}/****************************************************************************** ***********函数:void Flash_Led(u8 n)描述:参数:返回:******************************************************************************* **********/void Flash_Led(u8 n){u8 i=0;for(i=0;i<n;i++){Led_On;DelayMs(100*n);Led_Off;DelayMs(100*n);}}/****************************************************************************** ***********函数:void SetPWMduty(u8 PWMChanel,u16 pulse)描述:设置pwm波占空比参数:返回:******************************************************************************* **********/void SetPWMduty(u8 PWMChanel,u16 pulse){switch(PWMChanel){case 1 :TIM1->CCR1=pulse;break;case 2 :TIM1->CCR2=pulse;break;case 3 :TIM1->CCR3=pulse;break;default :break;}}/****************************************************************************** *函数:PWM_T_Output描述:设置相应的PWM梯形波输出参数:pName上桥臂名称,nName下桥臂名称返回:无*******************************************************************************void PWM_T_Output(u8 pName , u8 nName , u8 mRate){switch(pName){case 1:GPIO_SetBits(GPIOB, GPIO_Pin_15 | GPIO_Pin_14 );GPIO_ResetBits(GPIOB , GPIO_Pin_13);break;case 2:GPIO_SetBits(GPIOB, GPIO_Pin_13 | GPIO_Pin_15 );GPIO_ResetBits(GPIOB , GPIO_Pin_14);break;case 3:GPIO_SetBits(GPIOB, GPIO_Pin_13 | GPIO_Pin_14 );GPIO_ResetBits(GPIOB , GPIO_Pin_15);break;default:GPIO_SetBits(GPIOB, GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15); }switch(nName){case 1:TIM_SetCompare2(TIM1,0);TIM_SetCompare3(TIM1,0);TIM_SetCompare1(TIM1,(u16)(PWM_PERIOD_T * mRate / 100));break;case 2:TIM_SetCompare3(TIM1,0);TIM_SetCompare1(TIM1,0);TIM_SetCompare2(TIM1,(u16)(PWM_PERIOD_T * mRate / 100));break;case 3:TIM_SetCompare2(TIM1,0);TIM_SetCompare1(TIM1,0);TIM_SetCompare3(TIM1,(u16)(PWM_PERIOD_T * mRate / 100));break;default:TIM_SetCompare1(TIM1,0);TIM_SetCompare2(TIM1,0);TIM_SetCompare3(TIM1,0);TIM_SetAutoreload(TIM1, PWM_PERIOD_T);}/****************************************************************************** ***********函数:PWM_T_Calculation描述:梯形波计算参数:HallValue霍尔值,mRate调制百分比,direction方向返回:无******************************************************************************* **********/void PWM_T_Calculation(u8 hallValue , u8 mRate , u8 direction){if(direction == 1){switch(hallValue){case 5:PWM_T_Output(1 , 3 , mRate);break;case 1:PWM_T_Output(1 , 2 , mRate);break;case 3:PWM_T_Output(3 , 2 , mRate);break;case 2:PWM_T_Output(3 , 1 , mRate);break;case 6:PWM_T_Output(2 , 1 , mRate);break;case 4:PWM_T_Output(2 , 3 , mRate);break;default:PWM_T_Output(4 , 4 , 0);break;}}else{switch(hallValue){case 5:PWM_T_Output(3 , 1 , mRate);break;case 1:PWM_T_Output(2 , 1 , mRate);break;case 3:PWM_T_Output(2 , 3 , mRate);break;case 2:PWM_T_Output(1 , 3 , mRate);break;case 6:PWM_T_Output(1 , 2 , mRate);break;case 4:PWM_T_Output(3 , 2 , mRate);break;default:PWM_T_Output(4 , 4 , 0);break;}}}/****************************************************************************** *函数:PWM_T_Int描述:定时器中断程序,根据霍尔位置设置输出梯形波参数:direction=顺时针/逆时针,mRate调制率返回:无******************************************************************************* */void PWM_T_Int(u8 direction , u8 mRate){u8 hallValueTemp;u8 hallValue;hallValueTemp = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_11) + (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12) << 1) + (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_15) << 2);hallValue = hallValueTemp;PWM_T_Calculation(hallValue , mRate , direction);}/************************************************************************ 函数:PWM_Stop描述:PWM控制信号使能输出,禁止TIM1中断,使能TIM1中断参数:pwmflag=DISABLE,PWM信号使能输出,pwmflag=ENABLE,禁止PWM输出返回:无*************************************************************************/ void PWM_Stop(u8 pwmflag){NVIC_InitTypeDef NVIC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;if(pwmflag == ENABLE)//禁止PWM输出{TIM_Cmd(TIM1 , DISABLE);//TIM_Cmd(TIM2 , DISABLE);NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_TIM16_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;NVIC_Init(&NVIC_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_SetBits(GPIOA, GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10); //PWM口//PWM_T_Output(4 , 4 , 0);}if(pwmflag == DISABLE)//使能PWM输出{NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_TIM16_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;GPIO_Init(GPIOA, &GPIO_InitStructure);// TIM_Cmd(TIM2 , ENABLE);}}/****************************************************************************** ***********函数:void Motor_Start(void)描述:启动电机参数:返回:******************************************************************************* **********/void Motor_Start(void){PWM_T_Int(Motor.Dir,Motor.Speed);}/****************************************************************************** ***********函数:void Motor_Stop(void)描述:停止参数:返回:******************************************************************************* **********/void Motor_Stop(void){//U_Up_On;V_Up_On;W_Up_On;//U_Dn_On;V_Dn_On;W_Dn_On;PWM_T_Output(4,4,0);}/****************************************************************************** ***********函数:void EXTI15_10_IRQHandler(u8 dir,u8 hall)描述:霍尔传感器中断参数:返回:******************************************************************************* **********/void EXTI15_10_IRQHandler(void){Hall_Conter++;if ((EXTI_GetITStatus(EXTI_Line11) != RESET)||(EXTI_GetITStatus(EXTI_Line12) != RESET)||(EXTI_GetITStatus(EXTI_Line15) != RESET)){if(Motor.State!=STOP)PWM_T_Int(Motor.Dir,Motor.Speed);}EXTI_ClearITPendingBit(EXTI_Line11); //清除标志EXTI_ClearITPendingBit(EXTI_Line12); //清除标志EXTI_ClearITPendingBit(EXTI_Line15); //清除标志}/****************************************************************************** ***********函数:void Test_Motor(u8 dir,u8 hall)描述:电机控制参数:返回:******************************************************************************* **********/void Test_Motor(void){while(1){switch(Motor.State){case STOP :Motor_Stop();break;case RUN :Motor_Start();Motor.State=FREE;break;default :break;}}}。

直流无刷电机驱动程序

直流无刷电机驱动程序

直流无刷电机驱动程序#include#include "derivative.h"#include "INIT_PLL.h"#define BOOL int#define TRUE 1#define FALSE 0#define KEY1 PTH_PTH3#define KEY1_DIR DDRH_DDRH3 unsigned char WZ,ZKB1=10,ZKB2=20; BOOL A,B,C,HA,HB,S1,ZHENG,FAN;void INIT_KEY(void){KEY1_DIR=0;PPSH&=0XF0;PIEH|=0X0F;PIFH|=0X0F;}void INIT_ECT(void)//定时器初始化{TSCR1_TEN=1; //定时器使能为TIOS&=0XE0;TCTL3=0X03;TCTL4=0Xff;TIE=0X1F; //允许定时器中断TSCR2=0X07; //预分频系数111 128分频时钟周期为4us TFLG1=0XFF; //清除各IC/OC中断标志位TFLG2=0XFF; //清除自由定时器中断标志位}void INIT_PWM(void) //PWM初始化{PWMPRCLK=0X00; //A BPWMSCLA=4; //SA=A(32M)/2/4PWMSCLB=4; //SB=B(32M)/2/4PWMCLK=0Xff; //时钟选择 0: A/B 1: SA/SB PWMCAE=0XFF; //0:左对齐 1:居中对齐DDRP=0XFF;PWMPER0=100; //占空比PWMDTY0=0;PWMPER1=100;PWMDTY1=0;PWMPER2=100;PWMDTY2=0;PWMPER3=100;PWMDTY3=0;PWMPER4=100;PWMDTY4=0;PWMPER5=100;PWMDTY5=0;PWME=0X00;}/*void delay(void){unsigned int i,j;for(i=0;i<100;i++)for(j=0;j<500;j++);}*/#pragma CODE_SEG __NEAR_SEG NON_BANKED//*******************霍尔信号检测*********************//void interrupt 8 T0_inter(void) {TFLG1_C0F=1; A=PTT_PTT0;} void interrupt 9 T1_inter(void) {TFLG1_C1F=1; B=PTT_PTT1;} void interrupt 10 T2_inter(void) {TFLG1_C2F=1; C=PTT_PTT2;} void interrupt 11 T3_inter(void) {TFLG1_C3F=1; HA=PTT_PTT3;}void interrupt 12 T4_inter(void) {TFLG1_C4F=1; HB=PTT_PTT4;}void interrupt 25 PTH_inter(void){if(PIFH_PIFH3!=0) //停止{PIFH_PIFH3=1;S1=1;ZHENG=0;FAN=0;}if(PIFH_PIFH2!=0){PIFH_PIFH2=1;ZHENG=1;FAN=0;S1=0;}if(PIFH_PIFH1!=0){PIFH_PIFH1=1;ZHENG=0;FAN=1;S1=0;}if(PIFH_PIFH0!=0) //占空比加1{PIFH_PIFH2=1;ZKB1=ZKB1+5;ZKB2=ZKB1+10;if(ZKB1>=85){ZKB1=85;ZKB2=95;}}}//***************************************************// #pragma CODE_SEG DEFAULT//******************转子位置判断*********************// void ZZWZ(void){if((A==1)&&(B==0)&&(C==1)) WZ=1;if((A==1)&&(B==0)&&(C==0)) WZ=2;if((A==1)&&(B==1)&&(C==0)) WZ=3;if((A==0)&&(B==1)&&(C==0)) WZ=4;if((A==0)&&(B==1)&&(C==1)) WZ=5;if((A==0)&&(B==0)&&(C==1)) WZ=6;}//***************************************************////*****************六种导通状态**********************//void A_B(void){PWMPOL_PPOL0=1; PWMPOL_PPOL1=0; PWMPOL_PPOL3=1;PWMPOL_PPOL2=1; PWMPOL_PPOL4=1; PWMPOL_PPOL5=1;PWMDTY0=ZKB1; PWMDTY1=ZKB2; PWMDTY3=100;PWMDTY2=0; PWMDTY4=0; PWMDTY5=0;PWME=0X3F;}void A_C(void){PWMPOL_PPOL0=1; PWMPOL_PPOL1=0; PWMPOL_PPOL5=1;PWMPOL_PPOL2=1; PWMPOL_PPOL3=1; PWMPOL_PPOL4=1;PWMDTY0=ZKB1; PWMDTY1=ZKB2; PWMDTY5=100;PWMDTY2=0; PWMDTY3=0; PWMDTY4=0;PWME=0X3F;}void B_C(void)PWMPOL_PPOL2=1; PWMPOL_PPOL3=0; PWMPOL_PPOL5=1;PWMPOL_PPOL0=1; PWMPOL_PPOL1=1; PWMPOL_PPOL4=1;PWMDTY2=ZKB1; PWMDTY3=ZKB2; PWMDTY5=100;PWMDTY0=0; PWMDTY1=0; PWMDTY4=0;PWME=0X3F;}void B_A(void){PWMPOL_PPOL2=1; PWMPOL_PPOL3=0; PWMPOL_PPOL1=1;PWMPOL_PPOL0=1; PWMPOL_PPOL4=1; PWMPOL_PPOL5=1;PWMDTY2=ZKB1; PWMDTY3=ZKB2; PWMDTY1=100;PWMDTY0=0; PWMDTY4=0; PWMDTY5=0;PWME=0X3F;}void C_A(void){PWMPOL_PPOL4=1; PWMPOL_PPOL5=0; PWMPOL_PPOL1=1;PWMPOL_PPOL0=1; PWMPOL_PPOL2=1; PWMPOL_PPOL3=1;PWMDTY4=ZKB1; PWMDTY5=ZKB2; PWMDTY1=100;PWMDTY0=0; PWMDTY2=0; PWMDTY3=0;PWME=0X3F;}void C_B(void)PWMPOL_PPOL4=1; PWMPOL_PPOL5=0; PWMPOL_PPOL3=1;PWMPOL_PPOL0=1; PWMPOL_PPOL1=1; PWMPOL_PPOL2=1;PWMDTY4=ZKB1; PWMDTY5=ZKB2; PWMDTY3=100;PWMDTY0=0; PWMDTY1=0; PWMDTY2=0;PWME=0X3F;}//***************************************************////*********************正转换相函数**********************//void A_B_C_ZHENG(void){switch(WZ){case 1:C_A();break;case 2:C_B();break;case 3:A_B();break;case 4:A_C();break;case 5:B_C();break;case 6:B_A();break;}}//*********************反转换相函数**********************//void A_B_C_FAN(void){switch(WZ){case 1:A_C();break;case 2:B_C();break;case 3:B_A();break;case 4:C_A();break;case 5:C_B();break;case 6:A_B();break;}}//***************************************************// void main(void){DisableInterrupts;INIT_PLL();INIT_PWM();INIT_ECT();INIT_KEY();EnableInterrupts;A=PTT_PTT0;B=PTT_PTT1;C=PTT_PTT2;for(;;){if(S1==1){PWME=0X00;}else if(ZHENG==1){ZZWZ();A_B_C_ZHENG(); }else if(FAN==1) {ZZWZ();A_B_C_FAN();}elsePWME=0;}}。

三相直流无刷电机驱动程序

三相直流无刷电机驱动程序

1. 检测霍尔传感器的值可以判断出转子的位置,再使能相应的上下桥臂,则能驱动电机运动;若要让电机持续转动,则必须再次检测传感器值及使能相应的上下桥臂。

这里采用的是将霍尔传感器输出的三根线相边的10 口配程成外部中断,并且为边沿触发,在中断函数中加入传感器检测与上下桥臂切换程序,如此电机就能持续运转了。

2. 上桥臂的控制采用10 口置高低电平来控制上桥臂的通断,下桥臂则使用单片机内部集成的三路PWM波来控制,通过控制PWM波的占空比,可以实现对电机的调速了。

实际测得,占空比与电机的速度成正比例关系,在PWM波频率为20KHZ时,占空比增加1%, 速度增加60rpm ,并在占空比为53%时达到额泄转速3000rpm (空载)。

3. 速度测量则采用如下公式:电机每转一圈,霍尔值改变6次x5个周期=30次,记录边沿触发的中断次数N/30=电机转过的圈数,设运转时间为t(s)则电机转速v=N/30/t*60 rpm.即动转时间为2s时,霍尔值改变次数即为速度值,单位rpm4. 调速:给左速度,由电机驱动板自动由当前速度平滑过渡到给左速度。

实际测试发现,速度变化星很大时,电机会有突然加速或减速时的冲击:因此,调速应有一个缓冲的过程。

即加速或减速应以小步进缓慢增加或减少占空比来让速度渐渐达到最终值。

#include "stm32fl0x.h,'#include H driver_motor.h n#define PWM_PERIOD_T 400#define U_Up_On GPIOB->BSRR = GPIO_PinJL3 #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 = GPI0_Pin_15 #define W_Up_Off GPIOB->BRR = GPI0_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 & GPI0_Pin_15 #define SV_HOR GPIOA->IDR & GPIO_Pin_12 #defineSW_HOR GPIOA->IDR & GPIO_Pin_ll//u8 Motor_Dir=0;//u8 Motor_EN=0;//u8 Hor_Value=7; //ul6 TIM2_Conter=0; ul6 Hall_Conter=0;MotorStruct Motor={CLOCK /40/STOP};♦* 函数:void 101 nit(void)*描述:10*参数:*返回:*其它:扌 *****/****** 京****##4(車 ************************取****扌 *4t**4c*4t***********4t 車**/void 10」nit(void)GPIO 」nitTypeDef GPIO 」nitStruct;EXTIJnitTypeDef EXTHnitStructure;//GPIO_PinRemapConfig(GPIO -Remap^SWJ_JTAGDisable, ENABLE);厂使能 SWD 禁用JTAG*/GPIO 」nitStruct ・GPIO_Mode=GPIOJ\/lode_Out_PP;GPIO 」nitStruct ・GPIO_Speed 二 GPI0_Speed_2MHz;GPIO 」nit(GPIOB, &GPIO 」nitStruct);GPIO InitStruct.GPIO Pin=GPIO Pin 11|GPIO Pin 12|GPI0 Pin 15;GPIO 」nitStruct ・GPIO_Mode 二GPIO_Mock_IN_FLOATING;GPIO 」nitStruct ・GPIO_Speed 二 GPI0_Speed_2MHz;GPIO 」nit(GPIOA, &GPIO 」nitStruct);//HarlGPIO_EXTILineConfig(GPIO_PortSourceGPIOA / GPIO_PinSourcell);GPI0_EXTILineConfig(GPI0_PortSourceGPI0A /GPI0_PinSourcel2);GPI0_EXTILineConfig(GPI0_PortSourceGPI0A /GPI0_PinSourcel5);EXTI 」nitStructure.EXTI_Line = EXTI_Linell | EXTI_Lin"21 EXTI_Linel5;EXTIJnitStructure.EXTI_Mode = EXTI_Mode_lnterrupt; EXTIJnitStructure.EXTI_Trigger = EXTI_Trigger_Risi ng_Falling; */*車****案*****案京********霍尔 传感器 qu 断 京****卓4(車** GPIO 」nitStruct ・GPIO_Pin 二GPI0_Pin_12;EXTIJnitStructure.EXTLLineCmd = ENABLE;EXTI_lnit(&EXTI」nitStructure);}/*****床******京*****寧******************************* 4c 車*************車***寧京**** 函数:void PWM」nit(void)描述:配置PWM左时器TIM1参数:返回:无*****************京*************************京***********球************京******/ void PWMJnit(void){GPIO」nitTypeDef GPIO」nitStructure;TIM_TimeBaselnitTypeDef TIM_TimeBaselnitStruct;TIM_OCInitTypeDef TIM_OCInitStructure;/AlM_BDTRInitTypeDef TIM_BDTRInitStructure;TIM^CmdfTIMl, DISABLE);TIM_CtrlPWMOutputs(TIMl, 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」n itStructure.GPIO_Speed = GPIO^Speed^lOMHz;GPIO」n itStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO」nit(GPIOA, &GPIO」nitStructure);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」n itStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO」n itStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO」nit(GPIOB, &GPIO」nitStructure);〃定时器设豊TIM_TimeBaselnitStruct.TIM_Period = PWM_PERIOD_T;//5 极电机,3000RPM,每个Step 有10个脉冲,载波15KHZTIM_TimeBaselnitStruct.TIM_Prescaler = 2;TIM_TimeBaselnitStruct.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaselnitStruct.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaselnitStruct.TIM_RepetitionCounter = 0;TIM_TimeBaselnit(TIMl, &TIM_TimeBaselnitStruct);//TIM^ClearlTPendingBittTIMl, TIMJ TJJpdate);//TIM_ARRPreloadConfig(TIMl, ENABLE);〃TIM」TConfig(TIMl z TIM」T_Upda0 ENABLE);〃配置PWM输出TIM_OCI nitStnjcture・TIM_OCMode = TIM_OCMode_PWMl;TIM_OCI nitStructueTIM_OutputState = TIM_OutputState__Enable;TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;TIM_OCInitStructure.TIM_Pulse = 1;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;TIM_OCInitStructure.TIM_OCNPolarity = Tl M_OCN Polarity_Low;TIM_OCI nitStructure・TIM_OCIdlGState = Tl M_OCId leState_Set;TIM_OCI nitStructure・TIM_OCNIdlGState = Tl M_OCN ldleState_Set;TIM^OClIni^TIMl, &TIM_OCInitStructure);TIM_OC2lnit(TIMl, &TIM_OCInitStructure);TIM_OC3lnit(TIMl, &TIM_OCInitStructure);TIM^OClPreloadConfig^IMl, TIM_OCPreload_Enable);TlM_0C2PreloadConfig(TIM1, TIM_OCPreload_Enable);TlM_0C3PreloadConfig(TIM1, TIM_OCPreload_Enable);TIM^ARRPreloadConfigfTIMl, ENABLE); 〃使能TIMx 在ARR 上的预装载寄存器TIM^CmdfTIMl, ENABLE);TIM^CmdfTIMl, ENABLE);TIM_CtrlPWMOutputs(TIMl z ENABLE);}/* ****京*************************京************球************京*********** 4(京*******函数:void Motor_lnit(void)描述:"参数:返回:*****京***********京*拿***********************索******車****京************京拿******車**♦♦* *♦♦♦♦♦♦/void Motor_lnit(void){IO_lnit();PWM Jnit();}函数:void 口ash_Led(u8 n)描述:参数:返回:扌 *****/****** 京****#4(車************************取*******4|**/***************** void Flash_Led(u8 n){u8 i=0;for(i=0;i<n;i++){Led_On;DelayMs(100*n);Led_Off;DelayMs(100*n);}}函数:void SetPWMduty(u8 PWMChanel,ul6 pulse)描述:设置pwm波占空比参数:返回:*****京******4(**********京******寧******京*****************京******4(車**********京****4t**H“*/void SetPWMduty(u8 PWMChanel,ul6 pulse){switch(PWMChanel){case 1:TIMl->CCRl=pulse;break;case 2 :TIMl->CCR2=pulse;break;case 3 :TIMl->CCR3=pulse;break;default:break;}}/* ****京*************************京************球***********京*************京*******♦函数:PWM_T_Output描述:设垃相尺的PWM梯形波输出参数:pName上桥臂名称,nName下桥臂名称返回:无****4(京***********京*拿****************未璟*****未*****京*****京*******車****京拿**********/void PWM_T_Output(u8 pName , u8 nName, u8 mRate)switch(pName){case 1:GPIO_SetBits(GPIOB,GPIO_Pin_15 | GPIO_Pin_14 );GPIO_ResetBits(GPIOB, GPIO_PinJL3);break;case 2:GPIO_SetBits(GPIOB, GPIO_Pin^l3 | GPIO_Pin_15 );GPIO_ResetBits(GPIOB, GPIO_Pin_14);break;case 3:GPIO_SetBits(GPIOB/ GPIO_Pin^l3 | GPIO_Pin_14 );GPIO_ResetBits(GPIOB, GPIO_PinJL5);break;default:GPIO_SetBits(GPIOB f GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);}switch(nName){case 1:TIM_SetCompare2(TIM:L0);Tl M_SetCom pa re3 (Tl M l z 0);TIM_SGtComparJ(TIM:L(ul6)(PWM_PERIOD_T ♦ mRate / 100)); break;case 2:TIM_SetCompare3(TIMl,0);TIM_SetComparel(TIMl z O);TIM_SetCompare2(TIMl/(ul6)(PWM_PERIOD_T * mRate / 100)); break;case 3:TIM_SGtCompare2(TIMbO);TIM^SetComparelfTIMl^);TIM_SetCompare3(TIMl/(ul6){PWM_PERIOD_T ♦ mRate / 100)); break;default:Tl M_SetCompa re 1 (Tl M l z0);TIM_SetCompare2 仃IMIQ);TIM_SetCompare3(TIMl,0);TIM_SetAutoreload(TIMl, PWM_PERIOD_T);}/***** 床 ****** 京 ***** 寧 ******************** * * ********* 4c 車* *** 床 ******寧車 ** 孚 ******** * 函数:PWM_T_Calculation描述:梯形矗匸算参数:HallValue霍尔值,mRate调制百分比,direction方向返回:无************扌************************************京************扌*****未**********void PWM_T_Calculation(u8 hallValue , u8 mRate , u8 direction){if(directi on == 1){switch(hallValue){case 5:PWM_T_Output(l, 3 , mRate);break;case 1:PWM_T_Output(l, 2 , mRate);break;case 3:PWM_T_Output(3,2 z mRate);break;case 2:PWM_T_Output(3,1, mRate);break;case 6:PWM_T__Output(2 z 1 z mRate);break;case 4:PWM_T_Output(2,3 z mRate);break;default:PWM_T_0utput(4,4/0);break;}}elseswitch(hallValue) case 5:PWM_T_0utput(3,1, mRate);break;case 1:PWM_T_0utput(2 z 1, mRate);break;case 3:PWM_T_0utput(2,3 , mRate);break;case 2:PWM_T_Output(l,3 z mRate);break;case 6:PWM_T_Output(l, 2, mRate);break;case 4:PWM_T__0utput(3,2 z mRate);break;default:PWM_T_0utput(4,4,0);break;}}}/拿 *****京******車************車**********末木************拿*****京****球)k*************車♦函数:PWM_T_lnt描述:左时器卡断程序,根据霍尔位置设置输出梯形波参数:direction=顺时针/逆时针"Rate调制率返回:无Tvoid PWM_TJnt(u8 direction , u8 mRate){u8 hallValueTemp;u8 hallValue;hallValueTemp = GPIO^ReadlnputDataBitfGPlOA, GPIO_Pin_12) + (GPIO_ReadlnputDataBit(GPIOA, GPIO_Pin_12) « 1) + (GPIO_ReadlnputDataBit(GPIOA, GPIO_Pin_15)« 2);hallValue = hallValueTemp;PWM_T_Calculation(hallValue , mRate z direction);****4(京*****41************ 未*****京 ****** 京*****京 ************ 京車************* 函数:PWM_Stop描述:PWM控制信号使能输出,禁止TIM1中断,使能TIM1中断参数:pwmflag二DISABLE,PWM 信号使能输出,pwmflag二ENABLE,禁止PWM 输出返回:无*****************京************孚4|***********4(拿**** 京****************** 京****void PWM_Stop(u8 pwmflag){NVICJnitTypeDef NVICJnitStructure;GPIO」nitTypeDef GPIO」nitStructure;if(pwmflag == ENABLE)//禁止PWM 输出{TIM_Cmd(TIMi, DISABLE);〃TIM_Cmd(TIM2, DISABLE);NVICJnitStructure.NVICJRQChannel = TII\7ll_UP_TIM16_IRQn;NVIC_lnitStructure.NVIC_IRQChannelPreemptionPriority=2;NVICJnitStructure.NVICJRQChannelSubPriority = 1;NVICJnitStructure.NVICJRQCha nnelCmd = DISABLE;NVIC_lnit(&N VICJnitStructure);GPIO InitStructure.GPIO Pin = GPIO Pin 8 | GPIO Pin 9 | GPIO Pin 10;GPIO」n itStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO」n itStructure.GPIO_Mode = GPIO_Mode_Out_OD;GPIO」nit(GPIOA, &GPIO」nitStructure);GPIO_SetBits(GPIOA, GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10); //PWM 口〃PWM_T_Output(4,4,0);}if(pwmflag == DISABLE)//使能PWM 输出{NVICJnitStructure.NVICJRQChannel = TIMl_UP_TIM16_IRQn;NVICJnitStructure.NVICJRQChannelPreemptionPriority=2;NVICJnitStructure.NVICJRQCha nnelSubPriority = 1;NVICJnitStructure.NVICJRQCha nnelCmd = ENABLE;NVIC_lnit(&N VICJnitStructure);GPIO InitStructure.GPIO Pin 二GPIO Pin 8 | GPIO Pin 9 | GPIO Pin 10;GPIO」n itStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO」n itStructure.GPIO_Mode = GPIO_Mode_AF_OD;GPIO」nit(GPIOA, &GPIO」nitStructure);//TIM_Cmd(TIM2, ENABLE);/*****京*拿******車****************束*******車****京***********京京拿****************** men****函数:void Motor_Start(void)描述:启动电机参数:返回:*****************京*************************京************************京********** /void Motor_Start(void){PWM_TJnt(Motor.DiGMotor.Speed);}/****** 京 ************* <t ****************** 4t <t **************** 京 ****** 4(車*********** *♦♦* *♦♦♦♦♦* *函数:void Motor_Stop(void)描述:停止 "参数:返回:/void Motor_Stop(void){〃U_Up_O n;V_Up_On;W_Up_On;〃U_Dn_On;V_Dn_On;W_Dn_On;PWM_T_Output(440);}/***"*京*拿******車****************束*******車****京****** 4t ******京拿******車*********** men****函数:void EXTI15_10_IRQHandler(u8 dir,u8 hall)描述:霍尔传感器中断参数:返回:*****************京*************************京***********球************京********** /void EXTI15_10JRQHandler(void){Hall_Conter++;if ((EXTI_GetlTStatus(EXTLLinell) != RESET) || (EXTLGetlTStatus(EXTI_Linel2) != RESET) | | (EXTLGetlTStatus(EXTLLinel5) != RESET))if( M otor. State !=STOP)PWM_T_lnt(Motor.Dir,Motor.Speed);}EXTLCIearlTPendingBit(EXTLLinell);// 淸除标志EXTLClearlTPendingBlt(EXTLLinel2);// 淸除标志EXTLCIearlTPendingBit(EXTLLinel5);//7^ 除标志}函数:void Test_Motor(u8 dir,u8 hall)描述:电机控渝参数:返回:取**********扌 ****** 京****#4(車************************取*******4|**/*****************void Test_Motor(void){while(l){switch(Motor.State){case STOP :Motor_Stop();break;case RUN :Motor_Start();Motor.State=FREE;break;default:break;}11/11。

LDBL308三相无刷直流电机控制驱动器使用说明书

LDBL308三相无刷直流电机控制驱动器使用说明书
LDBL308 三相无刷直流电机 控制驱动器使用说明书
V081201
南京利德运动控制工程有限公司
Nanjing LEADER Motion Control Engineering Co., Ltd
地 址:南京市中央路258-27号新立基大厦6楼C座 /邮编:210009
电 话:025-83113058/83113958 传真:025-83113058
对于 R/S 滑行停车要快得多。 注意:制.动.方.式.,.实.际.是.让.能.量.消.耗.在.电.机.的.线.圈.上.。.故.电.机.在.急.停.控.制.时.,.线.圈.会.发.烫.,.尤.
其.是.在.重.载.情.况.下.,.更.是.如.此.。.因.此.用.户.在.不.必.要.的.情.况.下.,.请.不.要.频.繁.控.制.急.停.,.以.免.损.坏.电.机.。. 5. 程序复位控制
JP2 2 号键键盘接口,连于键盘一只脚上,键盘另一只脚连于 GND
JP3 3 号键键盘接口,连于键盘一只脚上,键盘另一只脚连于 GND
输 ALARM 驱动器故障信号输出端子
出 SPOUT 驱动器速度脉冲信号输出端子
四、功能及使用说明
1. 调速方法
本驱动器,提供了 3 种调速方式,分别为内部电位器调速,外部电位器调速,以及分段调速,

电机霍尔位置传感器信号端子。请务必将驱动器的霍尔端子与电机的
H+、H-、

霍尔端子对应连接,错误的接线将导致电机工作异常,甚至损坏驱动
HA、HB、

器和电机。电机的霍尔线原则上不超过 6 米,且应采用屏蔽线,并远
HC

离干扰源
信 +5V-AVI- 外部调速电位器接口端子,分别对应电源,可调端,地。可调电阻值

三相无刷直流电机调速系统的驱动设计

三相无刷直流电机调速系统的驱动设计

三相无刷直流电机调速系统的驱动设计佚名【摘要】By using IR2136 (International Rectifier) to design a three-phase brushless DC motor driver circuit based on TMS320F28335 floating-point processor and implementing positive-negative rotating and speedcon⁃trolling, this paper designs a driving circuit of the three-phase brushless DC motor, including power module, sig⁃nal isolation module,IR2136 logic circuit, driving circuit of the three-phase full bridge and over current protec⁃tion circuit, etc.% 以TMS320F28335浮点型处理器为控制器,采用International Rectifier公司的IR2136作为驱动芯片,设计了三相无刷直流电机的驱动电路,实现三相无刷直流电机调速及正反转控制,其中包括电源模块、信号隔离模块、IR2136逻辑电路、三相全桥驱动电路及过流保护电路等。

【期刊名称】《常熟理工学院学报》【年(卷),期】2013(000)004【总页数】5页(P86-90)【关键词】三相无刷直流电机;驱动电路;IR2136;DSP【正文语种】中文【中图分类】TP23现代社会中,为了适应不同的实际应用,各种类型的电机应运而生,其中包括同步电机、异步电机、直流电机、开关磁阻电机和各种其他类型的电机[1].相比之下,直流电机具有线性机械特性好、调速范围宽、启动转矩大及控制简单等优点.但传统的直流电机易受电刷和换向器的限制,造成结构复杂、可靠性差等缺点.随着电力电子技术及功率半导体技术的发展,无刷直流电机得到了广泛的应用,通过电子换向器取代了机械电刷和机械换向器,它不仅继承了传统直流电机的优点,而且克服了机械电刷和机械换向器的影响,使得它的结构简单,易于维护.本设计将TMS320F28335作为控制器,具有较高的信号处理和控制功能,并且TMS320F28335具有浮点运算功能,能够实现复杂的智能控制算法,其上片载存储容量大且支持存储器扩展,同时还具有丰富的外设资源,包括18个PWM输出端口、16通道12位A/D转换器、6个事件捕捉端口、2个正交编码通道、多种串行端口外设模块等,有利于整体系统的升级及扩展.TI公司生产的C2000系DSP在电机控制中应用较为广泛.同时,采用IR公司的三相无刷直流电机的专用驱动功率芯片IR2136,利用MOS⁃FET作为功率开关,设计三相全控桥式电路.驱动电路能够接收霍尔位置传感器的信息,以此为换相依据,经DSP处理后输出6路PWM波,按一定的顺序控制6个MOSFET的导通和关断.本文详细介绍了三相无刷直流电机驱动电路的设计,对电路中的关键元件进行分析和选型,并且简要介绍了软件设计.1.1 总体方案设计驱动电路原理框图如图1所示,主要包括信号调理与隔离部分、驱动部分、三相全桥逆变部分和电流检测部分.1.2 电源模块本设计使用的三相无刷直流电机的型号是57BL-52-230,额定电压为24 V,额定功率为60 W.而IR2136的工作电压为15 V,信号隔离采用光耦元件,其工作电压为5 V,DSP控制板已集成3.3 V与1.8 V稳压模块,故只需5 V供电即可.采用TI公司的LM2596作为降压芯片,如图2所示,系统的电源输入为24 V,可以直接提供给电机,而通过一个LM2596结合相应的外部匹配电路,即可将电压降到15 V,提供IR2136使用.使用另一块LM2596,修改匹配电路之后即可将15 V电压降为5 V,以供控制电路使用.1.3 信号调理与隔离电机的控制信号由DSP产生,频率较高,同时DSP的工作电压为3.3 V,工作电流也比较低,属于弱电信号,而IR2136所处的电路为强电部分,直接连接会使得主回路的强电信号干扰控制回路中弱电信号,同时为了提高整个控制系统的安全性和可靠性,因此需要采用光耦元件将控制回路与主回路隔离开来.本设计中采用的高速光耦6N137,信号隔离电路如图3所示.光耦的使用保证了控制信号的单向传递,而且高速光耦6N137的传输速度为10 Mbit/S,而PWM波的频率为20 KHz,因此完全能够传输PWM.同时6N137内部就有逻辑增益输出的能力,而且其工作电压为5 V,使得输出的PWM的信号抬高到5 V,也增加了负载能力和抗干扰能力,完全符合IR2136的输入端要求.1.4 IR2136驱动模块IR公司推出IR2136三相逆变器驱动器集成电路系列,适用于变速电机驱动器设计.新器件集成了6个MOS⁃FET或IGBT高电压栅驱动器,并融合多元化的保护功能.这些集成电路还有助于简化电机驱动器设计,可将驱动电路的尺寸缩减一半.自举二极管和电容是仅在P WM应用中要求严格的外接元件,在实际应用中给Vcc电源加一退耦电容用于补偿电源线的电感.自举电容上的电压仅为Vcc电源电压.它的电容值由下列因素所决定[2-3]:(1)用来增加MOS管的门极电压;(2)高压侧驱动器电路的静态电流Iqbs;(3)IR2136内部电平转换器的电流;(4)MOS管的栅-源正向漏电流;(5)自举电容的漏电流(仅当自举电容为电解电容时有关).最小的自举电容值可由下式求出[2]:其中:Qg——高压侧MOFET的栅极电荷;F——工作频率;ICbs(leak)——自举电容的漏电流;Vf——自举二极管的正向导通压降;VLS——低压侧或负载的压降.本设计中Qg=146 nC,Iqbs=300 mA,ICbs(leak)=0,f=20 K,Vcc=15 V,Vf=1.3 V,VLS=1.3 V,通过计算得到C=762 nF,因此自举电容值应大于762 nF,自举电容的大小很重要,一般选择时要大于计算所得值,如果选择电容值较小,就会使高压侧输出端输出不正常,上桥臂的MOSFET不能正常导通,本设计中使用了4.7 μF的电容.自举二极管必须承受住高压侧MOSFET导通时源极电压,二极管的电流额定值是栅极电荷与频率之积.自举二极管的高温反向漏电流特性对于那些电容在较长时间需要保持电荷的应用来说,可能是一个重要的参数.同样,为了减小由自举电容反馈进电源的电荷数量,二极管应选择快恢复二极管[3].本设计中自举二极管承受的反向电压为39 V,考虑余量及峰值电压的问题,自举二极管的反向耐压值应尽量偏大,因此本设计采用了快恢复二极管FR302,其反向峰值电压为100 V,正向压降为1.3 V,正向电流为3 A,反向恢复时间为150ns.IR2136驱动电路如图4所示[4-5].1.5 三相全桥逆变模块逆变电路的作用是将直流电转换为能够驱动三相无刷直流电机的三相交流电U、V 和W.由于MOSFET的栅源极之间是容性结构,需在栅源之间并联一个大电阻,迅速的对寄生电容放电,不至于引起MOSFET的误导通,导致上下桥臂直接导通.同时,需在栅极串联一个适当大小的电阻,其原因为:第一,栅极回路存在寄生电感,与栅源之间的寄生电容会在脉冲的激励下产生很强的振荡,串联一个电阻能使振荡迅速衰减.第二,电容与电感都是无功器件,如果没有栅极电阻,MOS管的温度会上升很多.第三,栅极电阻可以调节开关器件的通断速度,使得开关器件减少损耗的同时又能较好的抑制干扰.本设计中采用的MOSFET是IRF3205,额定电流为110 A,选择栅极电阻为10 Ω.三相全控桥式电路如图5所示[6-7].1.6 电流采样与过流保护过流保护是为了使工作过程中电机出现过流时,关闭三相全桥逆变电路的MOS管,保护电机不至于烧坏.图4中的R35就是简易电流传感器,将母线电流信号转换为电压信号,由于母线电流并不是很大,采样电阻也较小,所以COM端的电压信号较小,经过滤波、放大和隔离电路后将电压信号送到DSP的AD采样口.将采集到的电压信号与程序设定的值比较,当大于设定值时即当作过流,然后是6路PWM 口均输出高电平,使得MOS管全部关断,电机停止工作,从而保护电机.HCNR200是一款线性度很高的光耦,可以将控制电路与驱动电路隔开.电流采样电路见图6.1.7 位置电路本设计采用的是带位置传感器的三相无刷直流电机,通过霍尔位置传感器读取相位信号,进行电子换相.由于传感器的输出信号常常带有一些干扰信号,所以在送入DSP的捕获单元时需要将其进行整形,在这里选用的是施密特触发反相器74LS14,而74LS14的工作电压为5 V,DSP的IO口电压为3.3 V,此处采用了最简单的电阻分压的方法,经电阻分压之后再将信号送入DSP的捕获单元.如图7所示.基于TMS320F28335的三相无刷直流电机控制系统硬件见图8,系统软件基本流程图如图9所示[7],实际应用中还需加上其他模块.图9(a)为主程序流程图,包括系统时钟、I/O端口、看门狗、系统中断等初始化以及变量初始化等.图9(b)、(c)为中断子程序流程图,电机启动后,每当霍尔传感器读取的信号发生改变时都会进入捕捉中断,调整PWM控制信号,确定MOSFET的导通顺序.在定时中断服务程序计算速度和速度PID控制,计算出对应的占空比.速度控制采用PID算法,其具有结构简单、稳定性好、工作可靠、调整方便等特点,在实际工业中应用十分广泛.结合控制电路与电机,进行实际测试,利用串口将测量的转速及误差发送到PC机,利用matlab绘制波形,发送周期为0.5 ms.如图10和11所示,开始时设定转速为零,过了1.2 s之后将转速设定为1500 rad/s,通过matlab计算,超调量为5.2%,调节时间为1.1 s.在速度的控制上,性能良好.本设计完成的三相无刷直流电机控制系统的驱动硬件电路,具有防直通、过流保护等功能.通过实际电路测试,完全能够驱动三相无刷直流电机,配合软件设计能够实现电机正反转、调速及过流保护的功能.该驱动适用于低压小功率的三相无刷直流电机.【相关文献】[1]夏长亮.无刷直流电机控制系统[M].北京:科学出版社,2009.[2]International Rectifier.应用指南AN-978高压悬浮门驱动IC.International Rectifier,2007.[3]Jonathan Adams.Bootstrap Component Selection For Control IC’s.International Rectifier,2008.[4]曾建安,曾岳南.MOSFET和IGBT驱动器IR2136及其在电机控制中的作用[J].电机技术,2005(1):13-15.[5]秦文甫,张昆峰.基于IR2136的无刷直流电机驱动电路的设计[J].电子设计工程,2012(9):118-120.[6]Grant D,Pelly B.新型高电压桥驱动器电路简化P WM逆变器设计[C].PCIM研讨会,1989.[7]王晓明,王玲.电动机的DSP控制—TI公司DSP应用[M].北京:北京航空航天大学出版社,2004.。

三相直流无刷电机驱动程序文件

三相直流无刷电机驱动程序文件

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);//HarlGPIO_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个脉冲,载波15KHZTIM_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);//配置PWM输出TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;TIM_OCInitStructure.TIM_Pulse = 1;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Set;TIM_OC1Init(TIM1, &TIM_OCInitStructure);TIM_OC2Init(TIM1, &TIM_OCInitStructure);TIM_OC3Init(TIM1, &TIM_OCInitStructure);TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR 上的预装载寄存器 TIM_Cmd(TIM1 , ENABLE);TIM_Cmd(TIM1 , ENABLE);TIM_CtrlPWMOutputs(TIM1, ENABLE);}/****************************************************************************** ***********函数:void Motor_Init(void)描述:参数:返回:******************************************************************************* **********/void Motor_Init(void){IO_Init();PWM_Init();}/****************************************************************************** ***********函数:void Flash_Led(u8 n)描述:参数:返回:******************************************************************************* **********/void Flash_Led(u8 n){u8 i=0;for(i=0;i<n;i++){Led_On;DelayMs(100*n);Led_Off;DelayMs(100*n);}}/****************************************************************************** ***********函数:void SetPWMduty(u8 PWMChanel,u16 pulse)描述:设置pwm波占空比参数:返回:******************************************************************************* **********/void SetPWMduty(u8 PWMChanel,u16 pulse){switch(PWMChanel){case 1 :TIM1->CCR1=pulse;break;case 2 :TIM1->CCR2=pulse;break;case 3 :TIM1->CCR3=pulse;break;default :break;}}/****************************************************************************** *函数:PWM_T_Output描述:设置相应的PWM梯形波输出参数:pName上桥臂名称,nName下桥臂名称返回:无*******************************************************************************void PWM_T_Output(u8 pName , u8 nName , u8 mRate){switch(pName){case 1:GPIO_SetBits(GPIOB, GPIO_Pin_15 | GPIO_Pin_14 );GPIO_ResetBits(GPIOB , GPIO_Pin_13);break;case 2:GPIO_SetBits(GPIOB, GPIO_Pin_13 | GPIO_Pin_15 );GPIO_ResetBits(GPIOB , GPIO_Pin_14);break;case 3:GPIO_SetBits(GPIOB, GPIO_Pin_13 | GPIO_Pin_14 );GPIO_ResetBits(GPIOB , GPIO_Pin_15);break;default:GPIO_SetBits(GPIOB, GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15); }switch(nName){case 1:TIM_SetCompare2(TIM1,0);TIM_SetCompare3(TIM1,0);TIM_SetCompare1(TIM1,(u16)(PWM_PERIOD_T * mRate / 100));break;case 2:TIM_SetCompare3(TIM1,0);TIM_SetCompare1(TIM1,0);TIM_SetCompare2(TIM1,(u16)(PWM_PERIOD_T * mRate / 100));break;case 3:TIM_SetCompare2(TIM1,0);TIM_SetCompare1(TIM1,0);TIM_SetCompare3(TIM1,(u16)(PWM_PERIOD_T * mRate / 100));break;default:TIM_SetCompare1(TIM1,0);TIM_SetCompare2(TIM1,0);TIM_SetCompare3(TIM1,0);TIM_SetAutoreload(TIM1, PWM_PERIOD_T);}/****************************************************************************** ***********函数:PWM_T_Calculation描述:梯形波计算参数:HallValue霍尔值,mRate调制百分比,direction方向返回:无******************************************************************************* **********/void PWM_T_Calculation(u8 hallValue , u8 mRate , u8 direction){if(direction == 1){switch(hallValue){case 5:PWM_T_Output(1 , 3 , mRate);break;case 1:PWM_T_Output(1 , 2 , mRate);break;case 3:PWM_T_Output(3 , 2 , mRate);break;case 2:PWM_T_Output(3 , 1 , mRate);break;case 6:PWM_T_Output(2 , 1 , mRate);break;case 4:PWM_T_Output(2 , 3 , mRate);break;default:PWM_T_Output(4 , 4 , 0);break;}}else{switch(hallValue){case 5:PWM_T_Output(3 , 1 , mRate);break;case 1:PWM_T_Output(2 , 1 , mRate);break;case 3:PWM_T_Output(2 , 3 , mRate);break;case 2:PWM_T_Output(1 , 3 , mRate);break;case 6:PWM_T_Output(1 , 2 , mRate);break;case 4:PWM_T_Output(3 , 2 , mRate);break;default:PWM_T_Output(4 , 4 , 0);break;}}}/****************************************************************************** *函数:PWM_T_Int描述:定时器中断程序,根据霍尔位置设置输出梯形波参数:direction=顺时针/逆时针,mRate调制率返回:无******************************************************************************* */void PWM_T_Int(u8 direction , u8 mRate){u8 hallValueTemp;u8 hallValue;hallValueTemp = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_11) + (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12) << 1) + (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_15) << 2);hallValue = hallValueTemp;PWM_T_Calculation(hallValue , mRate , direction);}/************************************************************************ 函数:PWM_Stop描述:PWM控制信号使能输出,禁止TIM1中断,使能TIM1中断参数:pwmflag=DISABLE,PWM信号使能输出,pwmflag=ENABLE,禁止 PWM输出返回:无*************************************************************************/ void PWM_Stop(u8 pwmflag){NVIC_InitTypeDef NVIC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;if(pwmflag == ENABLE)//禁止 PWM输出{TIM_Cmd(TIM1 , DISABLE);//TIM_Cmd(TIM2 , DISABLE);NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_TIM16_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;NVIC_Init(&NVIC_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_SetBits(GPIOA, GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10); //PWM口//PWM_T_Output(4 , 4 , 0);}if(pwmflag == DISABLE)//使能PWM输出{NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_TIM16_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;GPIO_Init(GPIOA, &GPIO_InitStructure);// TIM_Cmd(TIM2 , ENABLE);}}/****************************************************************************** ***********函数:void Motor_Start(void)描述:启动电机参数:返回:******************************************************************************* **********/void Motor_Start(void){PWM_T_Int(Motor.Dir,Motor.Speed);}/****************************************************************************** ***********函数:void Motor_Stop(void)描述:停止参数:返回:******************************************************************************* **********/void Motor_Stop(void){//U_Up_On;V_Up_On;W_Up_On;//U_Dn_On;V_Dn_On;W_Dn_On;PWM_T_Output(4,4,0);}/****************************************************************************** ***********函数:void EXTI15_10_IRQHandler(u8 dir,u8 hall)描述:霍尔传感器中断参数:返回:******************************************************************************* **********/void EXTI15_10_IRQHandler(void){Hall_Conter++;if ((EXTI_GetITStatus(EXTI_Line11) != RESET)||(EXTI_GetITStatus(EXTI_Line12) != RESET)||(EXTI_GetITStatus(EXTI_Line15) != RESET)). .{if(Motor.State!=STOP)PWM_T_Int(Motor.Dir,Motor.Speed);}EXTI_ClearITPendingBit(EXTI_Line11); //清除标志EXTI_ClearITPendingBit(EXTI_Line12); //清除标志EXTI_ClearITPendingBit(EXTI_Line15); //清除标志}/****************************************************************************** ***********函数:void Test_Motor(u8 dir,u8 hall)描述:电机控制参数:返回:******************************************************************************* **********/void Test_Motor(void){while(1){switch(Motor.State){case STOP :Motor_Stop();break;case RUN :Motor_Start();Motor.State=FREE;break;default :break;}}}. . . .。

3相永磁无刷直流电机(PM BLDC)电机低功耗的驱动

3相永磁无刷直流电机(PM BLDC)电机低功耗的驱动

摘要:本文介绍了用模拟和硬件来实现3相永磁无刷直流电机(PM BLDC)电机低功耗的驱动。

此驱动器系统,是由脉冲宽度调制(PWM)控制的一个120度的六个梯形永磁无刷直流电动机驱动。

处理器使用的是常见的PIC16F877,它不仅能够闪存,而且成本很低。

最重要的是它能够实现和微控制器单元(MCU)的序列换向,旋转方向的控制,速度控制和阅读馆传感器的信号的功能。

为了方便低速,高速之间的控制,系统采用了感应式的控制技术。

本文还介绍了Proteus VSM(虚拟系统建模)软件作为实时仿真功能建模,模拟永磁无刷直流电动机驱动器,然后硬件实施。

先通过预期的结果监测和分析整个虚拟模拟所使用的的所有组件,再用已经证实的实验结果与模拟电路和结果进行对比。

使用Proteus VSM可以缩短产品开发时间,从而降低了工业应用程序的开发成本。

关键词:无刷直流电动机,PWM,PIC16F877,Proteus VSM的,永久磁铁。

一引言永磁同步梯形反电动势机器被称为永磁无刷直流电机。

在结构上,PM BLDC电机是一种(电枢在定子中,永久磁铁在转子中)由内而外的直流电动机。

该电动机的驱动系统包括四个主要部分:一个功率转换器,一个永磁同步机(PMSM)传感器控制算法,一个将直流电源转化为合适的交流驱动电源的三相你变转换器。

因此,它将电能转换成机械能。

其中无刷直流驱动的功能是检测转子的位置,它可以由两个流行的方法来实现:有传感器法和无传感器法。

最简单的方法是通过一个位置传感器得知瞬时整流绕阻电流。

图1展示的是传感器控制的永磁无刷电动机驱动系统。

在无传感器法中,虽然不需要任何位置传感器,但需要一个有大容量程序代码和大容量内存的性能要求较高的处理器。

该方法的明显好处是无传感器,降低了材料成本。

但节约了成本也优缺点,表现如下:该系统基于反电动势的检测,电动机必须在最低限速以上运行才能产生足够的的反电动势。

原因很简单,该程序不适用于低速。

三相无刷直流电机驱动电路

三相无刷直流电机驱动电路

三相无刷直流电机驱动电路三相无刷直流电机驱动电路是一种常见的电机控制方式,它通过无刷直流电机控制器将三相交流电转换为直流电,从而驱动电机运行。

本文将介绍三相无刷直流电机驱动电路的原理和应用。

一、三相无刷直流电机驱动电路的原理三相无刷直流电机驱动电路主要包括功率电源、直流电机、无刷直流电机控制器和速度反馈装置等组成部分。

1. 功率电源:提供电机运行所需的电能,一般为交流电源。

2. 直流电机:三相无刷直流电机是一种特殊的电机类型,具有高效率、大功率密度和长寿命等优点,广泛应用于工业自动化领域。

3. 无刷直流电机控制器:是三相无刷直流电机驱动电路的核心部件,主要负责将交流电转换为直流电,并通过控制电流和电压的方式,实现电机的转速和转向控制。

4. 速度反馈装置:用于检测电机的转速和位置信息,并将反馈信号传输给无刷直流电机控制器,以实现闭环控制,提高电机的稳定性和精度。

三相无刷直流电机驱动电路的工作原理可以分为两个阶段:换向和电流控制。

1. 换向:在电机正常运行过程中,电机转子的位置需要根据三相交流电的信号进行换向。

无刷直流电机控制器通过检测转子位置信息,控制相应的功率晶体管开关,从而实现换向操作。

2. 电流控制:在换向之后,无刷直流电机控制器根据转子位置信息,通过PWM(脉宽调制)技术控制电流大小和方向,从而控制电机的转速和转向。

三、三相无刷直流电机驱动电路的应用三相无刷直流电机驱动电路具有广泛的应用前景,在许多领域都有着重要的作用。

1. 工业自动化:三相无刷直流电机驱动电路广泛应用于工业自动化生产线中,用于控制机械臂、输送带、风机等设备的运动。

2. 电动车辆:三相无刷直流电机驱动电路也被广泛应用于电动车辆中,用于控制车辆的动力系统,实现高效、环保的交通方式。

3. 家电产品:三相无刷直流电机驱动电路还可以应用于家电产品中,如洗衣机、冰箱、空调等,提高产品的性能和使用寿命。

4. 机器人技术:随着机器人技术的发展,三相无刷直流电机驱动电路也被广泛应用于机器人的关节驱动系统,实现机器人的灵活运动和高精度控制。

时代超群 ZM-6515A 无刷直流电机驱动器 使用及操作说明书

时代超群 ZM-6515A 无刷直流电机驱动器 使用及操作说明书

直流无刷电机驱动器ZM-6515A使用及操作说明手册V3.2主要特点◆可外接速度显示板,显示转速;也可以接电脑,用来设置驱动器参数◆电流速度双闭环设计,低速力矩大,运行平稳;◆高力矩、高转速输出,最高转速达10000rpm/min;◆调速方式:外接PWM调速,外接电位器调速;◆有EN(使能)、DR(方向)、BK(刹车)信号控制端;◆可输出测速脉冲FG,(门极输出);◆可输出报警信号供用户检测;◆具有过流、过压、欠压、霍尔传感器相位出错、马达堵转等保护功能。

产品概述ZM-6515A无刷直流电机驱动器是我公司最新推出的,针对中功率电机传动领域的高科技产品。

本产品使用大规模的集成电路取代原有硬件设计,具有更高的抗干扰性及快速响应等性能。

本产品适合驱动峰值电流在1515A A 以下,电源电压在DC18V~50V以内(面板标称DC24V~48V)的任意一款低压有霍尔或无霍尔的三相直流无刷电机,并具有大电流工作时温度低的特点。

产品应用于针织设备、医疗设备、食品包装机械、电动工具等一系列的电气自动化控制领域。

功能概述本产品可以实现以下功能:(标准出厂默认设置为方波有霍尔开环模式)1.方波有霍尔速度开环运行2.方波有霍尔速度闭环运行3.方波无霍尔速度开环运行4.方波无霍尔速度闭环运行5.恒扭矩开环模式运行(严禁长时间超负荷运行)6.恒扭矩闭环模式运行(严禁长时间超负荷运行)以上功能用户可根据我司提供的上位机电脑软件或手持调试器来自行设置。

电气性能指标电气性能(环境温度Tj=25℃时)供电电源DC18V~50V直流供电(容量根据电机功率选择)输入最大电流不大于15A(依所配电机和额定负载而定)输入最大功率最大720W 适配电机适配输出功率≤500W的电机绝缘电阻在常温下﹥500MΩ绝缘强度在常温常压下0.5KV,1分钟使用环境参数:【提示注意】由于储运环境温度的剧烈变化,容易产生凝露或结霜,此时应把驱动器放置12小时以上,待驱动器温度与环境温度一致后方可通电运行。

matlab 三相无刷直流弦波电机驱动时序

matlab 三相无刷直流弦波电机驱动时序

【文章开始】matlab 三相无刷直流弦波电机驱动时序在电机控制领域,三相无刷直流电机是一种广泛应用的电机类型。

它具有结构简单、转速范围广、响应速度快等特点,因此被广泛应用于工业控制、航空航天和汽车电子等领域。

而要实现对三相无刷直流电机的精确控制,时序驱动技术是至关重要的一环。

在本文中,我们将重点讨论matlab中三相无刷直流电机驱动的时序技术。

1. 三相无刷直流电机简介让我们简单了解一下三相无刷直流电机的基本原理。

它由三相绕组组成,通过外部提供的电压信号来产生磁场,从而驱动电机转动。

在工业控制中,我们通常使用交流变直流的方式来为三相无刷直流电机供电,并通过时序驱动技术进行精确控制。

2. 时序驱动原理时序驱动技术是指根据电机的转子位置和速度,精确地控制电机相间的通断顺序,从而实现电机转子的顺利转动。

在matlab中,我们可以利用编程语言来实现时序驱动,根据电机的转子位置和速度,计算出合适的电压信号,并通过控制器输出到电机的三个相绕组上,从而驱动电机稳定、高效地运转。

3. matlab实现时序驱动在matlab中,我们可以利用Simulink工具进行三相无刷直流电机的时序驱动设计。

我们需要建立电机的数学模型,包括电机的电气参数、机械参数和控制器参数等。

通过Simulink的仿真环境,我们可以验证电机的实际运行情况,并对时序驱动进行调试和优化。

4. 个人观点和理解对于三相无刷直流电机的时序驱动,我个人认为在实际应用中需要充分考虑电机的动态特性和负载的变化情况,以便实现更加精确和稳定的控制。

matlab作为一种强大的工程计算软件,可以帮助我们快速、高效地设计和实现电机的时序驱动系统,为工程实践提供了便利和支持。

5. 总结matlab在三相无刷直流电机的时序驱动领域具有很大的应用潜力。

通过深入学习电机控制理论和matlab编程技术,我们可以更好地理解和掌握电机的时序驱动原理,并在工程实践中发挥出更大的作用。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void IO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
EXTI_InitTypeDef EXTI_InitStructure;
//GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); /*使能SWD禁用JTAG*/
#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
TIM_TimeBaseInit(TIM1 , &TIM_TimeBaseInitStruct);
//TIM_ClearITPendingBit(TIM1, TIM_IT_Update);
//TIM_ARRPreloadConfig(TIM1, ENABLE);
//TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
GPIO_Init(GPIOB, &GPIO_InitStruct);
/***********************霍尔传感器中断**********/
GPIO_InitStruct.GP_15;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
/*******************************************************************************
*函数:void IO_Init(void)
*描述:IO
*参数:
*返回:
*其它:
*******************************************************************************/
TIM_Cmd(TIM1 , ENABLE);
TIM_CtrlPWMOutputs(TIM1, ENABLE);
}
/*****************************************************************************************
函数:void Motor_Init(void)
TIM_OCInitStructure.TIM_Pulse = 1;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource15);
EXTI_InitStructure.EXTI_Line = EXTI_Line11 | EXTI_Line12|EXTI_Line15;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
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_Init(GPIOB, &GPIO_InitStructure);
//定时器设置
TIM_TimeBaseInitStruct.TIM_Period = PWM_PERIOD_T;//5极电机,3000RPM,每个Step有10个脉冲,载波15KHZ
TIM_TimeBaseInitStruct.TIM_Prescaler = 2;
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;
#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
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
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.调速:给定速度,由电机驱动板自动由当前速度平滑过渡到给定速度。实际测试发现,速度变化量很大时,电机会有突然加速或减速时的冲击;因此,调速应有一个缓冲的过程。即加速或减速应以小步进缓慢增加或减少占空比来让速度渐渐达到最终值。
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_OCInitTypeDef TIM_OCInitStructure;
//TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
TIM_Cmd(TIM1 , DISABLE);
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口
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
/***************************************************************************
//配置PWM输出
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Set;
TIM_OC1Init(TIM1, &TIM_OCInitStructure);
TIM_OC2Init(TIM1, &TIM_OCInitStructure);
TIM_OC3Init(TIM1, &TIM_OCInitStructure);
/**********************LED Light***********/
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_12;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_2MHz;
#include "stm32f10x.h"
#include "driver_motor.h"
相关文档
最新文档