您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 增量式PID的stm32实现,整定过程
【分享】增量式PID的stm32实现,整定过程发消息1感谢大家最近的帮忙,让我顺利做完增量PID功能,虽然PID不是什么牛逼的东西,但是真心希望以后刚刚接触这块的人能尽快进入状态。也下面我分享一下近期的这些工作吧。欢迎大家批评指点~首先说说增量式PID的公式,这个关系到MCU算法公式的书写,实际上两个公式的写法是同一个公式变换来得,不同的是系数的差异。资料上比较多的是:还有一种是:感觉第二种的KpKiKd比较清楚,更好理解,下面介绍的就以第二种来吧。(比例、积分、微分三个环节的作用这里就详细展开,百度会有很多)硬件部分:控制系统的控制对象是4个空心杯直流电机,电机带光电编码器,可以反馈转速大小的波形。电机驱动模块是普通的L298N模块。芯片型号,STM32F103ZET6软件部分:PWM输出:TIM3,可以直接输出4路不通占空比的PWM波PWM捕获:STM32除了TIM6TIM7其余的都有捕获功能,使用TIM1TIM2TIM4TIM5四个定时器捕获四个反馈信号PID的采样和处理:使用了基本定时器TIM6,溢出时间就是我的采样周期,理论上T越小效果会越好,这里我取20ms,依据控制对象吧,如果控制水温什么的采样周期会是几秒几分钟什么的。上面的PWM输出和捕获关于定时器的设置都有例程,我这里是这样的:TIM3输出四路PWM,在引脚C的GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9输出四路捕获分别是TIM4TIM1TIM2TIM5,对应引脚是:PB7PE11PB3PA1高级定时器tim1的初始化略不同,它的中断”名称“和通用定时器不同,见代码:1./*功能名称2.描述TIM3产生四路PWM3.*/4.voidTIM3_PWM_Init(u16arr,u16psc)5.{6.GPIO_InitTypeDefGPIO_InitStructure;7.TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;8.TIM_OCInitTypeDefTIM_OCInitStructure;9.10.11.RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);12.RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE);//使能GPIO外设和AFIO复用功能模块时钟使能13.14.GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);//Timer3全映射GPIOC-6,7,8,9//用于TIM3的CH2输出的PWM通过该LED显示15.16.//设置该引脚为复用输出功能,输出TIM3CH1CH2CH3CH4的PWM脉冲波形17.GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;//初始化GPIO18.GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出19.GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;20.GPIO_Init(GPIOC,&GPIO_InitStructure);21.GPIO_ResetBits(GPIOC,GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9);//默认电机使能端状态:不使能22.23.TIM_TimeBaseStructure.TIM_Period=arr;//设置在下一个更新事件装入活动的自动重装载寄存器周期的值24.TIM_TimeBaseStructure.TIM_Prescaler=psc;//设置用来作为TIMx时钟频率除数的预分频值这里是72分频,那么时钟频率就是1M25.TIM_TimeBaseStructure.TIM_ClockDivision=0;//设置时钟分割:TDTS=Tck_tim26.TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//TIM向上计数模式27.TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);//根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位28.29.30.TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;//选择定时器模式:TIM脉冲宽度调制模式131.TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//比较输出使能32.TIM_OCInitStructure.TIM_Pulse=0;//设置待装入捕获比较寄存器的脉冲值33.TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//输出极性:TIM输出比较极性高34.35.TIM_OC1Init(TIM3,&TIM_OCInitStructure);//根据TIM_OCInitStruct中指定的参数初始化外设TIMx36.TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);//使能TIMx在CCR1上的预装载寄存器37.38.39.TIM_OC2Init(TIM3,&TIM_OCInitStructure);//根据TIM_OCInitStruct中指定的参数初始化外设TIMx40.TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);//使能TIMx在CCR2上的预装载寄存器41.42.TIM_OC3Init(TIM3,&TIM_OCInitStructure);//根据TIM_OCInitStruct中指定的参数初始化外设TIMx43.TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable);//使能TIMx在CCR3上的预装载寄存器44.45.TIM_OC4Init(TIM3,&TIM_OCInitStructure);//根据TIM_OCInitStruct中指定的参数初始化外设TIMx46.TIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable);//使能TIMx在CCR4上的预装载寄存器47.48.TIM_ARRPreloadConfig(TIM3,ENABLE);//使能TIMx在ARR上的预装载寄存器49.50.51.TIM_Cmd(TIM3,ENABLE);//使能TIMx外设52.53.54.}55.56.57.58./*功能名称59.描述PWM输入初始化*/60.61.voidTIM4_PWMINPUT_INIT(u16arr,u16psc)62.{63.64.TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;//TIM的初始化结构体65.NVIC_InitTypeDefNVIC_InitStructure;//中断配置66.TIM_ICInitTypeDefTIM4_ICInitStructure;//TIM4PWM配置结构体67.GPIO_InitTypeDefGPIO_InitStructure;//IO口配置结构体68.69.RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//OpenTIM4clock70.RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//opengpioBclock71.72.GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;//GPIO773.GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉输入74.GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;75.GPIO_Init(GPIOB,&GPIO_InitStructure);76.77.TIM_TimeBaseStructure.TIM_Period=arr;//设置在下一个更新事件装入活动的自动重装载寄存器周期的值78.TIM_TimeBaseStructure.TIM_Prescaler=psc;//设置用来作为TIMx时钟频率除数的预分频值79.TIM_TimeBaseStructure.TIM_ClockDivision=0;//设置时钟分割:TDTS=Tck_tim80.TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//TIM向上计数模式81.TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);//根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位82.83.84./*配置中断优先级*/85.NVIC_InitStructure.NVIC_IRQChannel=TIM4_IRQn;86.NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;87.NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;88.NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;89.NVIC_Init(&NVIC_InitStructure);90.91.TIM4_ICInitStructure.TIM_Channel=TIM_Channel_2;92.TIM4_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;93.TIM4_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;94.TIM4_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;95.TIM4_ICInitStructure.TIM_ICFilter=0x3;//Filter:过滤96.97.TIM_PWMIConfig(TIM4,&TIM4_ICInitStructure);//PWM输入配置98.TIM_SelectInputTrigger(TIM4,TIM_TS_TI2FP2);//选择有效输入端99.TIM_SelectSlaveMode(TIM4,TIM_SlaveMode_Reset);//配置为主从复位模式100.TIM_SelectMasterSlaveMode(TIM4,TIM_MasterSlaveMode_Enable);//启动定时器的被动触发101.TIM_ITConfig(TIM4,TIM_IT_CC2|TIM_IT_Update,ENABLE);//中断配置102.TIM_ClearITPendingBit(TIM4,TIM_IT_CC2|TIM_IT_Update);//清除中断标志位103.TIM_Cmd(TIM4,ENABLE);104.}105.106.107.voidTIM4_IRQHandler(void)108.{109.110.if(TIM_GetITStatus(TIM4,TIM_IT_CC2)!=RESET)//捕获1发生捕获事件111.{112.duty_TIM4=TIM_GetCapture1(TIM4);//采集占空比113
本文标题:增量式PID的stm32实现,整定过程
链接地址:https://www.777doc.com/doc-2540796 .html