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

合集下载

PT2432 PT2432A 3 相无传感器无刷直流马达驱动器说明书

PT2432 PT2432A 3 相无传感器无刷直流马达驱动器说明书

PT2432/PT2432A 3相无传感器无刷直流马达驱动器说明PT2432是一个集成的12V(PT2432A:24V)3相无传感器无刷直流马达驱动器,并具有先进的保护功能。

其中包括软启动电路,过热保护,堵转保护和限电流保护。

PT2432是非常适合无传感器马达应用,对于要求高效率风扇马达控制也非常理想。

速度控制接口(VSP)可支持PWM和DC命令,允许从平稳低速到高速马达控制。

PT2432仅需要很少的外围器件,可实现紧凑的PCB布局。

PT2432采用了全新的BCD工艺,只需要单一电源,而电压范围从6 V至 15V(PT2432A:从20V 至28V),采用HTSSOP16和QFN48封装,实现了优异的功率效率,使其成为集中、低成本、无传感器无刷直流马达系统完美解决方案。

产品特色∙多电源BCD技术∙三相无传感器控制∙软启动控制功能∙软切换功能可静音运行∙堵转保护功能∙具有30o C迟滞窗口的过热保护功能∙支持PWM或DC马达速度控制命令∙可由一个外部精密电阻设置过电流限值∙FG输出功能,提供了类似于霍尔传感器的脉冲信号应用∙三相无传感器无刷直流马达驱动器∙CPU,GPU,或服务器之风扇∙水泵∙小型电机功能方块图HTSSOP16应用电路应用电路组件值表Notes : 1. C2和C3是取决于马达类型.2. R1是取决于马达的应用.QFN48应用线路应用电路组件值表Notes : 1. C3和C4是取决于马达类型.2. R1和R2是取决于马达的应用.HTSSOP16引脚配置引脚说明QFN48引脚配置引脚说明功能說明电源PT2432提供一种内建电压稳压器,除了输出驱动级外,供电给模拟与数字电路区块。

驱动级的负载是马达线圈,呈现电感特性,当马达开始转动,会引导出大电流和尖峰电压。

需要一个合适的旁路电容,并尽可能的放置接近VDD引脚来减少这些尖峰。

此外,加入一个15V(PT2432A:28V)齐纳二极管将帮助抵御从马达反电动势(BEMF)电压。

三相直流电机 pwm驱动原理

三相直流电机 pwm驱动原理

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

三相直流无刷电机驱动板设计

三相直流无刷电机驱动板设计
C7 104 4 FAULT C25 101pF A_GND R4 100R TP? FAULT 1 U5A + 2 3 R22 1K C24 101 +5V +5V TP?Vref +5V R21 3K/1% U5B 7 C9 104 W1 5K
AH PWM0 R5 +5V 100 R? 15K
U3A VCC 74HC02 1
AL PWM1 R6 100
R3 1M
8 LM358
图 2 硬件防死区保护电路
图 5 过流保护电路
2.4 驱动电路
驱动芯片采用 IR2101, 该驱动芯片在高电平不小于 3.3V 的 驱动能力很强, 系统响应时间也很 情况下, 最大可以输出 20V, 短, 只有 50ns。驱动电路, 如图 3 所示。
2 三相直流无刷电机驱动板硬件设计
2.1 总体方案设计
总体方案设计, 如图 1 所示。 方案中, 主控器件 MCU 采用 LM3S6 15 单片机, 运用 LM3S615 中 PWM 模块产生 6 路带死区的 PWM
*来稿日期: 2010-07-25
第5期 2.3 硬件防死区保护电路
黄小莉等: 三相直流无刷电机驱动板设计
图 6 电源电路
3 三相直流无刷电机驱动板软件设计
主程序流程图, 如图 7 所示。 主程序中包括 2 个主要环节, (1 ) 初始化要用到的 GPIO 端口, 定时器, UART, 以及 PWM 模块 ) 处理上位机发送到下位机的数据。 等; (2
4 结论
完成了对三相直流无刷电机相关控制, 由于内置精确的 PID 算法, 能够很好的控制电机的转速, 从 500RPM 到 2780RPM 电机 启动都不会出现超调量, 转速也很稳定。设计中运用了 512 线的 正交编码盘, 并对正交编盘输出波形进行双边沿检测, 使转速检 测精度提高了一半, 转速最大误差不超过 0.89%, 这样也确保了 转速 PID 算法的精确度。运用正交编码盘对电机的位置进行检 测, 只要我们设定好要转的圈数, 按下对应的功能键, 电机就会在

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;。

三相直流无刷电机

三相直流无刷电机

三相直流无刷电机
一、三相直流无刷电机
三相直流无刷电机是由三相交流电动机经过改装后,在电路上加装电子开关,将调速器和开关组合,从而形成一种能够根据电路控制短路电流和短路电压从而调整电机转速的新型电机。

它具有功率大、效率高、可靠性好、使用寿命长、结构简单、可调速范围广等优点,被广泛应用于电梯、机床、医疗器械、饮料机、压缩机等领域的调速驱动、控制用途。

二、三相直流无刷电机的工作原理
三相直流无刷电机的工作原理是通过交流电源的输入,由调速器把电源输入转换成直流电源,从而调节电机的转速。

当调速器调节电压的时候,供电电压的变化会导致交流电机的转速发生变化,从而改变电机的转速,从而达到控制的目的。

三、三相直流无刷电机的结构
三相直流无刷电机的结构由交流电机、调速器、控制电路和散热装置组成,其中调速器通过电路控制调节交流电机的转速,控制电路可以控制调速器的输出电压,从而改变电机的转速,散热装置可以将电机运行时产生的热量散发出去,以保证电机的可靠性和稳定性。

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

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

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

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

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

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

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

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

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

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

功率电子器件通常采用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;}}}。

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

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

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- 外部调速电位器接口端子,分别对应电源,可调端,地。可调电阻值

三相无刷电机驱动原理

三相无刷电机驱动原理

三相无刷电机驱动原理
三相无刷电机驱动原理是通过交替开关三相电流来控制电机的转速和方向。

在无刷电机的转子上,有若干个固定的永磁体,称为磁极。

驱动电机的电路中包含了三个相位的电流传感器。

根据传感器的反馈信号,电机驱动电路可以实时计算出转子的位置和速度。

根据转子的位置和速度信息,电机驱动电路会依次开启或关闭三相驱动器中的功率晶体管,这些晶体管被称为MOSFET。

通过对这些晶体管的开关控制,电流会被施加到三个电机相位上,产生旋转力矩。

具体来说,当一个磁极通过固定的传感器时,电机驱动电路会闭合相应的晶体管,施加电流到该相位上。

当磁极继续旋转时,相应的传感器会检测到磁极位置的变化,并将信号传回电机驱动电路。

通过对传感器信号的处理,电机驱动电路可以判断何时开启下一个相位的晶体管,以保持电流的不间断供应。

通过不断地切换三个相位的电流控制,无刷电机可以以高效率和精确性地运行。

此外,由于无刷电机没有碳刷和换向器,因此减少了摩擦和电火花的产生,提高了电机的使用寿命和可靠性。

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

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

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)电机低功耗的驱动

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

直流无刷驱动(C语言)

直流无刷驱动(C语言)
如何使用 HT45RM03 配合 HT45B0C 来控制 3 相 DC 直流无刷马达
如何使用 HT45RM03 配合 HT45B0C 来控 制 3 相 DC 直流无刷马达
文件编码: 文件编码:HA0117S HA0117S
简介
本范例主要应用于三相无刷马达(马达内部带位置传感器),DC36V 的额定工作 电压,使用 MCU PWM 输出驱动三相无刷马达运转。 三相无刷马达采用电子换向,具有高效率,低噪音,寿命长等优点,被广泛应 用于电动车。本范例使用 HT45RM03 配合 HT45B0C 驱动三相无刷马达,其中 HT45RM03 为主控制芯片,HT45B0C 为 NMOS driver。
No
L_ExitGetCurrentValue
Yes R_CurrentValue[n]<=>R_Curre ntValue[2] No
R_CurrentValue[3] > R_CurrentValue[n]?
No R_CurrentValue[n]<=>R_Curre ntValue[3] Yes
Hall sensor(SA,SB,SC) 000 001 011 111 110 100 NMOS 管状态 Q5, Q4 on Q1, Q4 on Q1, Q6 on Q3, Q6 on Q3, Q2 on Q5, Q2 on
* hall sensor 对应的输出顺序随 BLDC 规格而定。
6
如何使用 HT45RM03 配合 HT45B0C 来控制 3 相 DC 直流无刷马达
No call SBR_StopMotor
F_RunStop=1?
Yes
F_VelometerRotated = 0?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

直流无刷电机驱动程序

直流无刷电机驱动程序

直流无刷电机驱动程序#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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;//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;}}}。

相关文档
最新文档