三相直流无刷电机驱动程序
三相直流无刷电机驱动程序
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驱动原理三相直流电机(BLDC)是一种无刷电机,它采用三相交流电源和电子换向器来提供电机转子的转子,以实现高效率和高控制性能。
其中,PWM(Pulse Width Modulation)驱动是一种常见的驱动方式,它通过调整电机供电的脉冲宽度及频率来实现对电机速度和转矩的精确控制。
BLDC电机的架构包括定子和转子。
定子是由三个线圈组成的,每个线圈与电源相连,形成一个三相交流电源。
转子则是由永磁体组成的,它被安装在电机轴上,并通过电机驱动器进行驱动。
电机驱动器通过检测转子位置并适时地触发相应的线圈,以产生恰当的磁场来推动转子的运动。
PWM驱动是通过调整电机供电的脉冲宽度及频率来控制电机转速和转矩的方法。
具体实现上,PWM驱动使用电子开关(如晶体管或MOSFET)来控制电机驱动器的输入电流和电压。
通过调整电子开关的开关周期和占空比,可以改变电机驱动器输入电流的平均值,从而控制电机的运行状态。
在PWM驱动中,电子开关以固定的频率切换开关状态,通过开关控制电流向电机驱动器的输送和截断。
开关周期就是每个切换周期的时间。
占空比则是脉冲开启时间与开关周期之比。
占空比越大,表示开启时间越长,电流平均值越大;反之,占空比越小,电流平均值越小。
对于三相直流电机,每个线圈的电流都是通过PWM驱动进行控制的。
换向控制是通过在三个线圈之间循环切换来实现的。
即在每个PWM 周期内,电机驱动器按顺时针或逆时针的方式依次激活线圈。
在每个激活线圈的时间段内,电流被加载到该线圈上,形成一个可变磁场,推动转子运动。
在PWM驱动中,控制电机的转速和转矩的关键是调整占空比。
通过增加或减小占空比,可以改变电机驱动器输入电流的平均值,从而控制电机的输出功率。
此外,调整PWM的频率也可以影响电机的性能。
通常情况下,增加PWM频率能够减小电机的转矩波动和噪声,提高系统的响应速度和效率。
总结起来,PWM驱动是一种通过调整电机供电的脉冲宽度及频率来精确控制电机转速和转矩的方法。
BLDC-直流无刷电机驱动使用说明
技术 QQ:872224418
本页已使用福昕阅读器进行编辑。 福昕软件(C)2005-2009,版权所有, 仅供试电用话。:15995015165
BLDC-HG128 使用指南
产品特点
● 三相式无刷带霍尔电机驱动板
● 最佳输入电压:DC 24V ● 最高输入电压:DC 30V
功能
电源正 电源地
Hall 电源正 Hall Hall Hall
Hall 电源地 U 相 V 相
W 相
功能
制动输入 输入为逻辑低时允许电机转动; 输入为逻辑高时电机不允许转动; (如是在工作时则立即减速)。 60°/120°传感器电气相位输入选择 高电平状态控 2.欠压锁定 3.可作为传感器电源的 6.25 伏参考电压 4.速度线性可调 5.可选 60°/120°传感器相位 6.内部热关断 7.运行使能 8.正反转 9.过温保护、故障保护
网址:
接口说明
名称 +24 GND H+ HA HB HC GND U V W
开关说明
名称
BREAK
60°/120°
ENA
LOF RST DIR
技术 QQ:872224418
本页已使用福昕阅读器进行编辑。 福昕软件(C)2005-2009,版权所有, 仅供试电用话。:15995015165
类型 电源 电源 电源 输入 输入 输入 电源 输出 输出 输出
低电平状态控制电路工作在 120°
输出使能 输入为逻辑高电平时电机转动
输入为逻辑低电平时电机停转
错误指示所存 复位输入
正反转选择
输正向反向输入用于改变电机转向
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无刷直流电动机驱动控制程序————————————————————————————————作者:————————————————————————————————日期: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常州合泰电机电器股份有限公司直流无刷电机驱动器用户使用手册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. 精确控制:由于控制器可以根据转子位置和速度信息进行精确控制,因此无刷直流电机具有较好的速度和转矩响应特性。
这使得无刷直流电机在一些对运动控制要求较高的场合得到了广泛应用,比如机器人、无人机和电动汽车等。
直流无刷电机驱动程序
直流无刷电机驱动程序#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三相无刷直流电机控制驱动器使用说明书
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- 外部调速电位器接口端子,分别对应电源,可调端,地。可调电阻值
三相直流无刷电机驱动程序文件
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;}}}. . . .。
三相无刷电机驱动器工作原理解析
三相无刷电机驱动器工作原理解析【文章主题:三相无刷电机驱动器工作原理解析】一、引言三相无刷电机驱动器是一种常用的电机驱动器,被广泛应用于各行各业。
了解其工作原理对于我们理解电机驱动技术的发展和应用具有重要意义。
本文将对三相无刷电机驱动器的工作原理进行深入解析,旨在帮助读者对该技术有更全面、深入的理解。
二、基本原理1. 无刷电机概述无刷电机是相对于传统的有刷电机而言的,其最大的特点是不需要刷子和整流器来实现转子的换向。
三相无刷电机由定子和转子组成,定子上的三个线圈按一定的间隔排列,转子上则包含多个磁极。
通过改变电流的方向和大小,可以使得转子在定子线圈的作用下转动,实现驱动效果。
2. 三相无刷电机驱动器组成三相无刷电机驱动器主要由功率电子器件、驱动电路和控制算法组成。
功率电子器件主要包括MOSFET、IGBT等,负责将输入的直流电压转换为三相交流电压;驱动电路用于控制功率电子器件的开关,使其按照预定的规律切换;控制算法则决定驱动器的工作模式和反馈控制策略。
三、工作原理解析1. 直流电压输入三相无刷电机驱动器通常采用直流电源作为输入源,输入电压经过滤波和变压等处理后,供给给驱动器使用。
通过控制输入电压的大小和方向,可以实现电机的转速控制和转向控制。
2. 电机的启动当电机刚开始运行时,需要通过特定的启动算法来使其转动。
常见的启动方法包括霍尔传感器启动和传感器空转启动。
霍尔传感器启动是通过检测转子位置来确定通电顺序,保证定子线圈与转子磁极之间始终保持一定的空间关系。
而传感器空转启动则是根据一定的规则和电机特性进行启动,提供适当的电流和占空比控制来实现。
3. 相依转子位置的换相在电机运行过程中,为了保证定子线圈与转子磁极之间的空间关系始终保持一致,需要根据转子位置来进行换相。
换相是通过控制驱动器中的功率开关,使相应的线圈通电,产生磁场与转子磁极相互作用,从而实现转子的持续转动。
4. 电机速度及转矩控制三相无刷电机驱动器可以通过改变驱动电流的大小和频率来实现对电机速度和转矩的控制。
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. 机器人技术:随着机器人技术的发展,三相无刷直流电机驱动电路也被广泛应用于机器人的关节驱动系统,实现机器人的灵活运动和高精度控制。
matlab 三相无刷直流弦波电机驱动时序
【文章开始】matlab 三相无刷直流弦波电机驱动时序在电机控制领域,三相无刷直流电机是一种广泛应用的电机类型。
它具有结构简单、转速范围广、响应速度快等特点,因此被广泛应用于工业控制、航空航天和汽车电子等领域。
而要实现对三相无刷直流电机的精确控制,时序驱动技术是至关重要的一环。
在本文中,我们将重点讨论matlab中三相无刷直流电机驱动的时序技术。
1. 三相无刷直流电机简介让我们简单了解一下三相无刷直流电机的基本原理。
它由三相绕组组成,通过外部提供的电压信号来产生磁场,从而驱动电机转动。
在工业控制中,我们通常使用交流变直流的方式来为三相无刷直流电机供电,并通过时序驱动技术进行精确控制。
2. 时序驱动原理时序驱动技术是指根据电机的转子位置和速度,精确地控制电机相间的通断顺序,从而实现电机转子的顺利转动。
在matlab中,我们可以利用编程语言来实现时序驱动,根据电机的转子位置和速度,计算出合适的电压信号,并通过控制器输出到电机的三个相绕组上,从而驱动电机稳定、高效地运转。
3. matlab实现时序驱动在matlab中,我们可以利用Simulink工具进行三相无刷直流电机的时序驱动设计。
我们需要建立电机的数学模型,包括电机的电气参数、机械参数和控制器参数等。
通过Simulink的仿真环境,我们可以验证电机的实际运行情况,并对时序驱动进行调试和优化。
4. 个人观点和理解对于三相无刷直流电机的时序驱动,我个人认为在实际应用中需要充分考虑电机的动态特性和负载的变化情况,以便实现更加精确和稳定的控制。
matlab作为一种强大的工程计算软件,可以帮助我们快速、高效地设计和实现电机的时序驱动系统,为工程实践提供了便利和支持。
5. 总结matlab在三相无刷直流电机的时序驱动领域具有很大的应用潜力。
通过深入学习电机控制理论和matlab编程技术,我们可以更好地理解和掌握电机的时序驱动原理,并在工程实践中发挥出更大的作用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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;}}}。