PWM直流调速系统项目设计--毕业论文.docx_第1页
PWM直流调速系统项目设计--毕业论文.docx_第2页
PWM直流调速系统项目设计--毕业论文.docx_第3页
PWM直流调速系统项目设计--毕业论文.docx_第4页
PWM直流调速系统项目设计--毕业论文.docx_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PWM直流调速系统设计PWM直流调速系统设计( 电气工程学院)摘要:根据直流电机调速的相关知识,以及PWM基本原理和实现方法,本文介绍了一种基于单片机的直流电机调速系统,选择STM32单片机作为系统的控制核心, 利用软件产生PWM信号,采用位置式PID算法控制直流电机的速度调节,提高了调速系统的精度,增强了对直流电机速度的可控性。关键词:STM32单片机、直流电机、调速在各类机电设备中,直流电动机以其良好的调速特性、启动和制动性能。在轻工、冶金、石油、机械制造等现代工业部门中得到广泛应用。本文所设计的直流电机调速系统,是以STM32单片机作为电机调速系统的核心控制器,使用PWM信号来控制直流电机的速度等方面来实现的。一、绪论1、项目过程概述单片机直流调速系统可实现对直流电动机的平滑调速。PWM是通过控制固定电压的直流电源开关频率,从而改变负载两端的电压,进而达到控制要求的一种电压调整方法。通过改变PWM“占空比”来改变平均电压的大小,从而控制电动机的转速。本系统以STM32为核心,通过单片机控制,C语言编程实现对直流电机的平滑调速。2、项目目的 1)掌握PWM直流调速系统的设计原理和具体设计方案;2)掌握元器件的选型依据与原则;3)掌握AutoCAD软件的使用和原理框图的绘制方法;4)掌握Altium Dsigner软件的使用及PCD原理图的绘制方法;5)学会至少运用一种编程软件;6)掌握所设计系统的安装与调试;3、主要元器件名称数量名称数量导线若干整流桥1个排针1排驱动1个保险座1个电容2个保险管1个稳压器2个电阻2个12v测速电机1个开发板1个电位器1个电源线1根仿真器1个电木板1个万用板2个4*4矩阵键盘1个开关1个2、 主要内容1、电源部分:交流电源220V通过变压器将电压降为30V和15V后,在经过整流桥变为直流电压,之后经过两个稳压管,分别提供12V和5V的直流电压。原理图如下所示。2、驱动部分:驱动部分处于控制与执行之间,电机驱动芯片驱动电机,一款H 桥元件的直流电机驱动芯片,其中四个二极管对芯片起保护作用。芯片可连续提供5 A 的电流, 驱动负载能力较强。芯片通过信号INlIN4控制H桥的输入端(本项目只用到IN1和IN2),该芯片的两个输出端引脚直接接小功率直流电机两端后就可以控制电机正反转,调整电动机转速。其中输出脚用来连接电流检测电阻,Vss接逻辑控制的电源。3、按键部分:根据设计需求,本系统中使用了16个独立按键用以实现对电机正反转的设定以及对电机启动、停止、加速、减速等的控制。4、显示屏部分:1602LCD采用标准的16脚接口,各引脚说明如下表所示:5、 编码器部分:系统中运用转速反馈通过偏差进行PID运算,因此需要速度采集电路。本次设计中应用了比较常见的光电测速方法来实现,其具体做法是将电机轴上固定一圆盘,且其边缘上有N个等分凹槽,在圆盘的一侧固定一个发光二极管,其位置对准凹槽处,在另一侧和发光二极光平行的位置上固定一光敏三极管,如果电动机转到凹槽处时,发光二极管通过缝隙将光照射到光敏三极管上,三极管导通,反之三极管截止,电机每转一圈在脉冲的输出端就会产生N个低电平。这样就可根据低电平的数量来计算电机此时转速了。3、 总电路框图设计1、系统整体控制方案的分析:本直流电机调速系统以单片机系统为依托,根据PWM调速的基本原理,以直流电机电枢上电压的占空比来改变平均电压的大小,从而控制电动机的转速为依据,实现对直流电动机的平滑调速,并通过单片机控制速度的变化。光电编码器将测得的电机转速信号变成电信号反馈给STM32单片机。单片机系统自行给定转速(内给定),或者从占空比输入电路获得电机给定转速(外给定)。系统根据给定的电机转速信号与反馈速度信号比较,得出偏差,经过增量式PID运算得出控制变量改变PWM波占空比,也就是改变了直流电机电枢两端的平均电压,进而调节的电机的转速,实现了STM32单片机对直流电机的PWM闭环调速。2、系统整体接线图及原理图四、软件设计本系统编程部分工作在keil4开发环境下完成,采用模块化的设计方法,与各子程序作为实现各部分功能和过程的入口,完成PWM脉宽调速的控制。1、 按键配置程序#include key.hint Target_Speed=0; /设定速度控制的目标速度为50个脉冲每10msfloat Encoder_Speed=0;/左右编码器的脉冲速度int Moto1=0;float Kp=0.35,Ki=0.8,Kd=0.4;u8 keyval=0;static u16 temp1;/* 名称 : Keyscan()* 功能 : 实现按键的读取。下面这个子程序是按处理 矩阵键盘 的基本方法处理的。* 输入 : 无* 输出 : 按键值*/u8 Keyscan(void) u8 i,j;for(j=0;j4;j+) GPIO_ResetBits(GPIOE,0x01(j+11);for(i=0;i4;i+) if(GPIO_ReadInputDataBit(GPIOE,0x01(7+i)=0)Delay_ms(10); /延时消抖if(GPIO_ReadInputDataBit(GPIOE,0x01(7+i)=0)while(GPIO_ReadInputDataBit(GPIOE,0x01(7+i)=0); /松手检测return (i+j*4+1); GPIO_SetBits(GPIOE,GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14);return 0; /*键值处理函数*/void keychuli(u8 keyval)/根据键值做出相应处理 switch(keyval)case 1:Target_Speed-=200;break;case 2:Target_Speed+=200;break;case 3:Target_Speed=0;Target_Speed=Amplitude(Target_Speed,Target_Amplitude);/给定限幅break;case 4:Target_Speed=4000;Target_Speed=Amplitude(Target_Speed,Target_Amplitude);/给定限幅break;case 5:Target_Speed+=1000;Target_Speed=Amplitude(Target_Speed,Target_Amplitude);/给定限幅break;case 6:Target_Speed+=100;Target_Speed=Amplitude(Target_Speed,Target_Amplitude);/给定限幅break;case 7:Target_Speed+=10;Target_Speed=Amplitude(Target_Speed,Target_Amplitude);/给定限幅break;case 8:Target_Speed+=1;Target_Speed=Amplitude(Target_Speed,Target_Amplitude);/给定限幅break;case 9:Target_Speed-=1000;Target_Speed=Amplitude(Target_Speed,Target_Amplitude);break;case 10:Target_Speed-=100;Target_Speed=Amplitude(Target_Speed,Target_Amplitude);break;case 11:Target_Speed-=10;Target_Speed=Amplitude(Target_Speed,Target_Amplitude);break;case 12:arget_Speed-=1;Target_Speed=Amplitude(Target_Speed,Target_Amplitude);break;case 13:Kd-=0.1;break;case 14:Kd+=0.1;break;case 15:Ki-=0.1;break;case 16:Ki+=0.1;break;default:break;LCD_disp_SPEED(8,0,Encoder_Speed);LCD_disp_Encoder_SPEED(8,1,Target_Speed);int Amplitude(int motol,int Amplitude)/SPEED限幅if(motolAmplitude) motol=Amplitude;return motol;2、位置式PI控制器入口参数:编码器测量位置信息,目标位置返回值:电机PWM根据位置式离散PID公式 pwm=Kp*e(k)+Ki*e(k)+Kde(k)-e(k-1)e(k)代表本次偏差 e(k-1)代表上一次的偏差 e(k)代表e(k)以及之前的偏差的累积和;其中k为1,2,k;pwm代表输出在我们的位置控制闭环系统里面,只使用PI控制pwm=Kp*e(k)+Ki*e(k)int Position_PI(int Encoder,int Target) static int Bias,Speed,Integral_bias,Last_bias;Bias=Target-Encoder; /计算偏差Integral_bias+=Bias; /求出偏差的积分Speed=Kp*Bias+Ki*Integral_bias+Kd*(Bias-Last_bias); /位置式PI控制器Last_bias=Bias;return Speed; /增量输出void TIM2_IRQHandler(void)static u16 temp1;if (TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET) TIM_ClearITPendingBit(TIM2,TIM_FLAG_Update); Encoder_Speed=300*Read_Encoder()/256;Moto1=Position_PI(Encoder_Speed,Target_Speed);/位置式PI控制器Moto1=Amplitude(Moto1,Speed_Amplitude);/SPEED限幅PWM_SPEED(Moto1); 3、LCD设置void LCD_init(void) /初始化 LCD_writecmd(0x38);Delay_ms(5);LCD_writecmd(0x38);Delay_ms(5);LCD_writecmd(0x38);Delay_ms(5);LCD_writecmd(0x38); /显示模式设置LCD_writecmd(0x08); /显示关闭 LCD_writecmd(0x0c); /显示开、光标不显示 LCD_writecmd(0x06); /显示光标移动设置 LCD_writecmd(0x01); /显示清屏 void LCD_check_busy(void) LCD_EL; LCD_RSL; LCD_RWH; GPIOD-ODR|=0X00FF; LCD_EH; while(BUSY=1);void LCD_writecmd(u8 cmd) /低8位 u16 temp; temp=GPIOD-ODR&0XFF00; temp+=cmd; GPIOD-ODR=temp; LCD_RSL; LCD_RWL; LCD_EL; Delay_ms(1); LCD_EH;Delay_ms(1);void LCD_writedata(u8 dat) u16 temp; temp=GPIOD-ODR&0XFF00; temp+=dat; GPIOD-ODR=temp; LCD_RSH; LCD_RWL; LCD_EL;Delay_ms(1); LCD_EH;Delay_ms(1);void LCD_disp_char(u8 x,u8 y,u8 dat) u8 address; if(y=0) address=0x80+x; else address=0xc0+x; LCD_writecmd(address); LCD_writedata(dat);void LCD_disp_string(u8 x,u8 y,u8 *string)u8 address;if(y=0) address=0x80+x; else address=0xc0+x; LCD_writecmd(address);while(*string) LCD_writedata(*string); string+; void LCD_ClearScreen(void)LCD_writecmd(0x01);void LCD_disp_WELCOME(void) LCD_disp_string(5,0,WELCOME); LCD_disp_string(3,1,The 5 Group);void LCD_disp_SPEED(u8 x,u8 y,int speed)u8 s5;if(speed0)s0=+;else speed=-speed;s0=-;s1=(u8)(speed/1000)+0x30);s2=(u8)(speed%1000)/100)+0x30);s3=(u8)(speed%100)/10)+0x30);s4=(u8)(speed%10)+0x30);LCD_disp_string(x,y,s);LCD_disp_string(2,1,INPUT); LCD_disp_string(2,0,OUTPUT);void LCD_disp_Encoder_SPEED(u8 x,u8 y,int Encoder_Speed)u8 s5;if(Encoder_Speed0)s0=+;else Encoder_Speed=-Encoder_Speed;s0=-;s1=(u8)(Encoder_Speed/1000)+0x30);s2=(u8)(Encoder_Speed%1000)/100)+0x30);s3=(u8)(Encoder_Speed%100)/10)+0x30);s4=(u8)(Encoder_Speed%10)+0x30);LCD_disp_string(x,y,s);4、 延时程序void Delay_us(u16 xus)u16 x,y;for(x=xus; x0; x-)for(y=14; y0; y-);void Delay_ms(u32 xms)u32 x,y;for(x=xms; x0; x-)for(y=14396; y0; y-);5、 PWM产生程序:本设计中采用STM32F103的定时器TIM3定时器来产生PWM波形void TIM2_NVIC_Configuration(void) NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);void TIM2_Configuration(void) RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE); TIM_DeInit(TIM2); TIM_TimeBaseStructure.TIM_Period=20000;/* 自动重装载寄存器周期的值(计数值) */ /* 累计 TIM_Period个频率后产生一个更新或者中断 */ TIM_TimeBaseStructure.TIM_Prescaler= (720 - 1); /* 时钟预分频数 72M/72 */ TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; /* 采样分频 */ TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; /* 向上计数模式 */ TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_ClearFlag(TIM2, TIM_FLAG_Update);/* 清除溢出中断标志 */ TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); TIM_Cmd(TIM2, ENABLE);/* 开启时钟 */void TIM3_Config(void) / make PWM /* PWM信号电平跳变值 */GPIO_InitTypeDef GPIO_InitStructure; GPIO_AFIODeInit();/* TIM3 clock enable */PCLK1经过2倍频后作为TIM3的时钟源等于72MHzRCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); /* GPIOA and GPIOB clock enable */RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOC, ENABLE); GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE); /重新映射到PB4和5/*GPIOA Configuration: TIM3 channel 1 and 2 as alternate function push-pull */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; / 复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStructure); /* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = 10000; /当定时器从0计数到999,即为1000次,为一个定时周期TIM_TimeBaseStructure.TIM_Prescaler = 71; /设置预分频:不预分频,即为72MHz 每0.01s产生一个中断TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;/设置时钟分频系数:不分频TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; /向上计数模式TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);TIM_ClearFlag(TIM3, TIM_FLAG_Update); /* 清除溢出中断标志 */TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);/* PWM1 Mode configuration: Channel1 */TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; /配置为PWM模式1TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulse =0; /设置跳变值,当计数器计数到这个值时,电平发生跳变TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; /当定时器计数值小于CCR1_Val时为低电平 TIM_OC1Init(TIM3, &TIM_OCInitStructure); /使能通道1TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);/* PWM1 Mode configuration: Channel2 */TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulse =0; /设置通道2的电平跳变值,输出另外一个占空比的PWMTIM_OC2Init(TIM3, &TIM_OCInitStructure); /使能通道2TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);TIM_ARRPreloadConfig(TIM3, ENABLE); / 使能TIM3重载寄存器ARR/* TIM3 enable counter */ TIM_Cmd(TIM3, ENABLE); /使能定时器3void PWM_SPEED(int speed)if(speed0)/正转 TIM_OCInitStructure.TIM_Pulse = 0;TIM_OC2Init(TIM3, &TIM_OCInitStructure);TIM_OCInitStructure.TIM_Pulse =speed; TIM_OC1Init(TIM3, &TIM_OCInitStructure); /使能通道3else/反转 TIM_OCInitStructure.TIM_Pulse = 0;TIM_OC1Init(TIM3, &TIM_OCInitStructure);speed=-speed;TIM_OCInitStructure.TIM_Pulse = speed; TIM_OC2Init(TIM3, &TIM_OCInitStructure); /使能通道36、 主程序:系统的主程序是一个循环程序int main(void)u8 keyval=0;LED_GPIO_Config(); LCD_GP

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论