欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
stm32四輪小車pid代碼求助 不論怎么設置初值,車輪總是全速轉動
[打印本頁]
作者:
云中落羽
時間:
2021-2-21 09:56
標題:
stm32四輪小車pid代碼求助 不論怎么設置初值,車輪總是全速轉動
自己寫了一個四輪的小車,主控是stm32f103rct6
目前的問題是,不論怎么設置初值,車輪總是全速轉動,并且拔掉編碼器的線,車輪轉速依舊沒啥變化,不知道是哪里除了問題
單片機源程序如下:
#include "sys.h"
#include "delay.h"
#include "encoder.h"
#include "timer.h"
#include "pwm.h"
#include "pid.h"
#include "motor.h"
#include <stdio.h>
#include "usart.h"
int FleftSpeedNow =0;
int FrightSpeedNow =0;
int BleftSpeedNow =0;
int BrightSpeedNow =0;
int FleftSpeeSet =400;//mm/s
int FrightSpeedSet = 2000;//mm/s
int BleftSpeeSet = 600;//mm/s
int BrightSpeedSet = 600;//mm/s
int main(void)
{
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//禁用JTAG 啟用 SWD
MY_NVIC_PriorityGroupConfig(2); //=====設置中斷分組
delay_init(); //=====延時函數初始化
Motor_Init(); //電機初始化
Encoder_Init_TIM2(); //=====初始化編碼器
Encoder_Init_TIM1();
Encoder_Init_TIM3();
Encoder_Init_TIM4(); //=====初始化編碼器
PWM_Init(7199,0); //=====初始化PWM
TIM5_Int_Init(50-1,7200-1); //=====定時器初始化 5ms一次中斷
PID_Init(); //=====PID參數初始化
uart_init(9600);
FrontmotorLeft=400;
//閉環速度控制
while(1)
{
//給速度設定值,想修改速度,就更該leftSpeeSet、rightSpeedSet變量的值
Fpid_Task_Letf.speedSet = FleftSpeeSet;
Fpid_Task_Right.speedSet = FrightSpeedSet;
Bpid_Task_Letf.speedSet = BleftSpeeSet;
Bpid_Task_Right.speedSet = BrightSpeedSet;
//給定速度實時值
Fpid_Task_Letf.speedNow = FleftSpeedNow;
Fpid_Task_Right.speedNow = FrightSpeedNow;
Bpid_Task_Letf.speedNow = BleftSpeedNow;
Bpid_Task_Right.speedNow = BrightSpeedNow;
//執行PID控制函數
Pid_Ctrl(&FrontmotorLeft ,&FrontmotorRight,&BackmotorLeft ,&BackmotorRight);
//根據PID計算的PWM數據進行設置PWM
Set_Pwm_Front(FrontmotorLeft,FrontmotorRight);
Set_Pwm_Back(BackmotorLeft,BackmotorRight);
delay_ms(10);
}
}
//5ms 定時器中斷服務函數 --> 計算速度實時值,運行該程序之前,確保自己已經能獲得輪速,如果不懂,可看之前電機測速的文章
void TIM5_IRQHandler(void) //TIM7中斷
{
if(TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET) //檢查指定的TIM中斷發生與否
{
TIM_ClearITPendingBit(TIM5, TIM_IT_Update); //清除TIMx的中斷待處理位
Get_Motor_Speed(&FleftSpeedNow ,&FrightSpeedNow,&BleftSpeedNow,&BrightSpeedNow);//計算電機速度
}
}
#include "sys.h"
#include "delay.h"
#include "encoder.h"
#include "timer.h"
#include "pwm.h"
#include "pid.h"
#include "motor.h"
#include <stdio.h>
#include "usart.h"
int FleftSpeedNow =0;
int FrightSpeedNow =0;
int BleftSpeedNow =0;
int BrightSpeedNow =0;
int FleftSpeeSet =400;//mm/s
int FrightSpeedSet = 2000;//mm/s
int BleftSpeeSet = 600;//mm/s
int BrightSpeedSet = 600;//mm/s
int main(void)
{
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//禁用JTAG 啟用 SWD
MY_NVIC_PriorityGroupConfig(2); //=====設置中斷分組
delay_init(); //=====延時函數初始化
Motor_Init(); //電機初始化
Encoder_Init_TIM2(); //=====初始化編碼器
Encoder_Init_TIM1();
Encoder_Init_TIM3();
Encoder_Init_TIM4(); //=====初始化編碼器
PWM_Init(7199,0); //=====初始化PWM
TIM5_Int_Init(50-1,7200-1); //=====定時器初始化 5ms一次中斷
PID_Init(); //=====PID參數初始化
uart_init(9600);
FrontmotorLeft=400;
//閉環速度控制
while(1)
{
//給速度設定值,想修改速度,就更該leftSpeeSet、rightSpeedSet變量的值
Fpid_Task_Letf.speedSet = FleftSpeeSet;
Fpid_Task_Right.speedSet = FrightSpeedSet;
Bpid_Task_Letf.speedSet = BleftSpeeSet;
Bpid_Task_Right.speedSet = BrightSpeedSet;
//給定速度實時值
Fpid_Task_Letf.speedNow = FleftSpeedNow;
Fpid_Task_Right.speedNow = FrightSpeedNow;
Bpid_Task_Letf.speedNow = BleftSpeedNow;
Bpid_Task_Right.speedNow = BrightSpeedNow;
//執行PID控制函數
Pid_Ctrl(&FrontmotorLeft ,&FrontmotorRight,&BackmotorLeft ,&BackmotorRight);
//根據PID計算的PWM數據進行設置PWM
Set_Pwm_Front(FrontmotorLeft,FrontmotorRight);
Set_Pwm_Back(BackmotorLeft,BackmotorRight);
delay_ms(10);
}
}
//5ms 定時器中斷服務函數 --> 計算速度實時值,運行該程序之前,確保自己已經能獲得輪速,如果不懂,可看之前電機測速的文章
void TIM5_IRQHandler(void) //TIM7中斷
{
if(TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET) //檢查指定的TIM中斷發生與否
{
TIM_ClearITPendingBit(TIM5, TIM_IT_Update); //清除TIMx的中斷待處理位
Get_Motor_Speed(&FleftSpeedNow ,&FrightSpeedNow,&BleftSpeedNow,&BrightSpeedNow);//計算電機速度
}
}
復制代碼
PID - 全車.7z
2021-2-21 15:22 上傳
點擊文件名下載附件
194.4 KB, 下載次數: 19
作者:
FB0
時間:
2021-2-22 00:00
我的建議是冷靜把步驟一步步認真分析一遍,一般來說各個部分沒問題,那就出現在控制算法上了,要不找一個成功案例程序,先分析一下成功案例的思想,然后比較不足,
作者:
TTQ001
時間:
2021-2-22 05:59
應該首先更正:Pid_Ctrl里的Pid_Which(&Bpid_Task_Letf, &Fpid_Task_Right);
應該是Pid_Which(&Bpid_Task_Letf, &Bpid_Task_Right);
作者:
Hephaestus
時間:
2021-2-22 13:05
沒硬件無法分析,你可以打斷點到關鍵的行號上,看看PID算法給出的數據是什么。
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1