三相直流无刷电机驱动程序
- 格式:docx
- 大小:23.91 KB
- 文档页数:11
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驱动原理三相直流电机(BLDC)是一种无刷电机,它采用三相交流电源和电子换向器来提供电机转子的转子,以实现高效率和高控制性能。
其中,PWM(Pulse Width Modulation)驱动是一种常见的驱动方式,它通过调整电机供电的脉冲宽度及频率来实现对电机速度和转矩的精确控制。
BLDC电机的架构包括定子和转子。
定子是由三个线圈组成的,每个线圈与电源相连,形成一个三相交流电源。
转子则是由永磁体组成的,它被安装在电机轴上,并通过电机驱动器进行驱动。
电机驱动器通过检测转子位置并适时地触发相应的线圈,以产生恰当的磁场来推动转子的运动。
PWM驱动是通过调整电机供电的脉冲宽度及频率来控制电机转速和转矩的方法。
具体实现上,PWM驱动使用电子开关(如晶体管或MOSFET)来控制电机驱动器的输入电流和电压。
通过调整电子开关的开关周期和占空比,可以改变电机驱动器输入电流的平均值,从而控制电机的运行状态。
在PWM驱动中,电子开关以固定的频率切换开关状态,通过开关控制电流向电机驱动器的输送和截断。
开关周期就是每个切换周期的时间。
占空比则是脉冲开启时间与开关周期之比。
占空比越大,表示开启时间越长,电流平均值越大;反之,占空比越小,电流平均值越小。
对于三相直流电机,每个线圈的电流都是通过PWM驱动进行控制的。
换向控制是通过在三个线圈之间循环切换来实现的。
即在每个PWM 周期内,电机驱动器按顺时针或逆时针的方式依次激活线圈。
在每个激活线圈的时间段内,电流被加载到该线圈上,形成一个可变磁场,推动转子运动。
在PWM驱动中,控制电机的转速和转矩的关键是调整占空比。
通过增加或减小占空比,可以改变电机驱动器输入电流的平均值,从而控制电机的输出功率。
此外,调整PWM的频率也可以影响电机的性能。
通常情况下,增加PWM频率能够减小电机的转矩波动和噪声,提高系统的响应速度和效率。
总结起来,PWM驱动是一种通过调整电机供电的脉冲宽度及频率来精确控制电机转速和转矩的方法。
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无刷直流电动机驱动控制程序————————————————————————————————作者:————————————————————————————————日期: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常州合泰电机电器股份有限公司直流无刷电机驱动器用户使用手册1 简介BLDCH-2208A 直流无刷电机驱动器是由常州合泰电机电器股份有限公司自主研发完成的,针对中功率高压直流无刷电机驱动的高性能无刷驱动产品。
BLDCH-2208A 直流无刷电机驱动器适用于功率为750W 及以下三相直流无刷电机。
本产品设计采用先进的DSP 控制技术,具有大扭矩,低噪声,低振动,快速启停等特性。
同时具备PID 电流及速度闭环控制、过压,欠压,过流,过温等保护功能。
实现了手动速度调节与上位机模拟电压速度调节,上位机脉冲频率速度调节的完美统一。
1.2 使用特点■ 产品易使用、快上手① 自带电位器可调速② 接上开关、就可以实现正反转、启停、刹车■ 多样化调速手段① 内置电位器调速② 外接电位器调速③ 外部信号调速④ PWM 调速■ 速度信号输出、报警输出■自带电流设定保护功能2 电气性能及环境指标2.1 电气指标驱动器参数最小值额定值最大值输入电压 AC (V)180220265输出电流(A) 4.28适用电机转速(rpm)020000霍尔信号电压(V) 4.55 5.5霍尔驱动电流(mA)20外接调速电位器(KΩ)102.2 环境指标环境因素环境指标冷却方式自然冷却或强制冷却使用场合避免粉尘,油污及腐蚀性气体使用温度10℃~+50℃环境湿度80%RH(无结露)震动 5.7m/S2 max 存储温度-20℃~+125℃■ 开环、闭环速度控制P-sv 电流设定电位器,通过设定运行电流最高限定值,便可实现电机过载保护。
当电机运行电流超过设定值时,保护功能启动,驱动器停止作业保护电机。
3 械尺寸及安装图9717434356543.565644 驱动器接口及接线示意图 4.1 驱动器接口+SPEEDRV:调速电位器RUN/ALMSPEEDALM 霍尔端口REF-HW HV HU REF+SV:外部电位器接线端COM:公共端口F/R:方向EN:使能BRK:快速刹车+5V:公共电源P-sv:电流设定电位器+SPEED电机端口U V WAC ~AC ~FG SW1SW24、2 输入口连接4、3 输出口连接信号端子信号名内容输入SV 调速信号输入端口① 外接输入调速电位器; ② 模拟信号输入; ③ PWM 调速信号输入。
三相全波无刷直流电机及其驱动方法基础下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。
文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you! In addition, this shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!三相全波无刷直流电机及其驱动方法基础引言随着电动化技术的发展,无刷直流电机及其驱动方法在各种应用中扮演着越来越重要的角色。
三相无刷直流电机驱动原理一、引言三相无刷直流电机是一种广泛应用于工业和家电领域的电机,其驱动原理是通过电子器件实现电机转子的控制和驱动。
本文将从三相无刷直流电机的基本结构、工作原理以及驱动器件的选择和控制方法等方面进行介绍。
二、三相无刷直流电机的基本结构三相无刷直流电机由转子、定子和传感器组成。
转子是由永磁体组成,定子则由三组线圈(A、B、C相)和磁铁组成。
传感器用于检测转子位置,通常采用霍尔元件或光电传感器。
三、三相无刷直流电机的工作原理三相无刷直流电机通过交替激励定子线圈,产生磁场,使转子转动。
其工作原理可以简单描述为以下几个步骤:1. 传感器检测转子位置:传感器会实时检测转子的位置,并将检测结果反馈给控制器。
2. 控制器计算相应的电流:根据传感器反馈的转子位置信息,控制器会计算出相应的电流值,并将电流信号发送给电机驱动器。
3. 电机驱动器控制电流:电机驱动器根据控制器发送的电流信号,控制电流的大小和方向,使电机产生适当的转矩。
4. 电机转子运动:根据电机驱动器控制的电流信号,电机转子会按照一定的顺序和速度进行旋转。
5. 重复上述步骤:电机会不断地重复执行上述步骤,以保持转子的稳定转动。
四、三相无刷直流电机驱动器件的选择选择适合的驱动器件对于三相无刷直流电机的正常运行至关重要。
常用的驱动器件包括功率MOSFET、IGBT和功率集成电路等。
1. 功率MOSFET:功率MOSFET具有开关速度快、损耗小等特点,适合用于中低功率的电机驱动。
2. IGBT:IGBT具有较高的工作电压和工作温度范围,适合用于高功率电机驱动。
3. 功率集成电路:功率集成电路集成了多种功能和保护电路,能够提供更全面的电机驱动控制。
五、三相无刷直流电机的控制方法三相无刷直流电机的控制方法主要有霍尔传感器反馈控制和电动势反馈控制。
1. 霍尔传感器反馈控制:通过采集霍尔传感器检测的转子位置信息,实时调整电机驱动器的输出电流,以控制电机转速和转向。
三相无刷直流电机驱动电路三相无刷直流电机驱动电路是一种常用于工业和家电领域的电机驱动方案。
相比传统的有刷直流电机,无刷直流电机具有更高的效率、更低的噪音和更长的使用寿命。
本文将介绍三相无刷直流电机驱动电路的原理、特点以及应用领域。
一、无刷直流电机的原理无刷直流电机是一种基于电子换向技术的电机,其工作原理类似于传统的有刷直流电机。
无刷直流电机由转子、定子和电子换向器三部分组成。
转子是由永磁体组成的,定子则是由多相绕组组成的。
电子换向器根据转子位置和速度信息,通过控制电流的方向和大小,实现电机的高效运转。
三相无刷直流电机驱动电路主要由功率电子器件、驱动电路和控制器三部分组成。
功率电子器件通常采用IGBT(绝缘栅双极型晶体管)或MOSFET(金属氧化物半导体场效应晶体管),用于控制电流的通断和方向。
驱动电路负责产生适当的驱动信号,将控制器输出的信号转化为功率电子器件所需的控制信号。
控制器是电机控制系统的核心,负责根据转子位置和速度信息,产生适当的控制信号,并将其送至驱动电路。
三、三相无刷直流电机驱动电路的特点1. 高效率:无刷直流电机由于无需通过电刷和换向器,减少了能量损耗,提高了电机的效率。
在工业和家电领域,高效率是提高设备性能的关键因素之一。
2. 低噪音:无刷直流电机在工作过程中,没有机械接触和摩擦,因此噪音较低。
这使得无刷直流电机在一些对噪音要求较高的场合得到了广泛应用,比如家电领域的洗衣机和吸尘器等。
3. 高可靠性:由于无刷直流电机没有电刷和换向器等易损件,因此具有更长的使用寿命和更高的可靠性。
这使得无刷直流电机在一些对设备寿命要求较高的场合得到了广泛应用,比如工业自动化领域的机床和机械手等。
4. 精确控制:由于控制器可以根据转子位置和速度信息进行精确控制,因此无刷直流电机具有较好的速度和转矩响应特性。
这使得无刷直流电机在一些对运动控制要求较高的场合得到了广泛应用,比如机器人、无人机和电动汽车等。
1. 检测霍尔传感器的值可以判断出转子的位置,再使能相应的上下桥臂,则能驱动电机运动;若要让电机持续转动,则必须再次检测传感器值及使能相应的上下桥臂。
这里采用的是将霍尔传感器输出的三根线相边的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。