找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6028|回復(fù): 7
打印 上一主題 下一主題
收起左側(cè)

關(guān)于pid控制pwm輸出的問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:405033 發(fā)表于 2018-10-17 20:47 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
incrementalpid_t *pidStructure;


typedef struct{
float Target;      //設(shè)定目標(biāo)值
float Measured;     //測量值
float err;        //本次偏差值
float err_last;     //上一次偏差
float err_beforeLast;  //上上次偏差
float Kp, Ki, Kd;    //Kp, Ki, Kd控制系數(shù)
float pwm;        //pwm輸出
float zancun;
}incrementalpid_t;


int Position_PID(positionpid_t *pid_t, int target, int measured)

{
pid_t->Target = (float)target;
pid_t->Measured = (float)measured;

pid_t->err = pid_t->Target - pid_t->Measured;      //誤差(目標(biāo)值-測量值)
pid_t->integral_err += pid_t->err;           //誤差積分

pid_t->pwm = pid_t->Kp*pid_t->err    //增量pid
      + pid_t->Ki*pid_t->integral_err
      + pid_t->Kd*(pid_t->err - pid_t->err_last);

pid_t->err_last = pid_t->err;

    if(pid_t->pwm < -PositionPID_Amplitude) pid_t->pwm = -PositionPID_Amplitude;
if(pid_t->pwm > PositionPID_Amplitude)  pid_t->pwm = PositionPID_Amplitude;

return (int)pid_t->pwm;
}

新人一枚,想問一下如果想用TIM_SetComparex()這個(gè)函數(shù)去接收pid_t->pwm的話,要怎么去寫,一開始是
TIM_SetCompare1(TIM1,pidStructure->pwm)這樣直接去寫的,但是沒有成效,所以不知道是哪里有問題(想法很簡單,就把pid這個(gè)輸出量傳給TIM_SetComparex去控制pwm的輸出)是這個(gè)想法一開始就不成立嗎,懇求大佬指點(diǎn)指點(diǎn)(也省略了很多代碼沒貼出,主要是吧pid_t->pwm作為pwm的操控量)。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:388197 發(fā)表于 2018-10-18 16:13 | 只看該作者
沒看懂positionpid_t是什么類型,是另外聲明的結(jié)構(gòu)體還是什么?懷疑是樓主在主程序里聲明的結(jié)構(gòu)體變量名,可能樓主把結(jié)構(gòu)體變量名寫成了函數(shù)聲明時(shí)的形參.
如果函數(shù)調(diào)用的是上邊聲明的結(jié)構(gòu)體變量,應(yīng)該聲明成這樣才對(duì).
int Position_PID(incrementalpid_t *pid_t int target, int measured)
主程序調(diào)用時(shí)則寫成
Positon_PID(&pid_t,p1,p2);(假設(shè)pid_t已經(jīng)聲明為incrementalpid_t類型結(jié)構(gòu)體,p1和p2已經(jīng)聲明為int類型變量)
回復(fù)

使用道具 舉報(bào)

板凳
ID:405033 發(fā)表于 2018-10-25 20:34 | 只看該作者
cjm82 發(fā)表于 2018-10-18 16:13
沒看懂positionpid_t是什么類型,是另外聲明的結(jié)構(gòu)體還是什么?懷疑是樓主在主程序里聲明的結(jié)構(gòu)體變量名,可能 ...

嗯嗯,看到了這個(gè)錯(cuò)誤,謝謝你啦,還有我想問一下,這個(gè)最后return回來的值能夠直接傳給TIM_SetCompare1()這個(gè)函數(shù)嗎,類似于TIM-SetCompare1(TIM1,pid_t->pwm),假設(shè)pid_t已經(jīng)聲明為incrementalpid_t類型結(jié)構(gòu)體。
回復(fù)

使用道具 舉報(bào)

地板
ID:405033 發(fā)表于 2018-10-30 18:31 | 只看該作者
不用了,已經(jīng)解決了,謝謝
回復(fù)

使用道具 舉報(bào)

5#
ID:438112 發(fā)表于 2018-12-3 20:08 | 只看該作者
請(qǐng)問樓主最后這個(gè)setcompare實(shí)現(xiàn)了嗎?我是想利用PWM的輸出結(jié)果去調(diào)整PWM的占空比,可以分享下代碼嗎?萬分感激!郵箱journey1022@163.com
回復(fù)

使用道具 舉報(bào)

6#
ID:405033 發(fā)表于 2018-12-3 20:39 | 只看該作者
journey1022 發(fā)表于 2018-12-3 20:08
請(qǐng)問樓主最后這個(gè)setcompare實(shí)現(xiàn)了嗎?我是想利用PWM的輸出結(jié)果去調(diào)整PWM的占空比,可以分享下代碼嗎?萬分 ...

你好,其實(shí)你先在這個(gè)函數(shù)直接傳固定值進(jìn)去,看一下電壓有沒有變化就可以驗(yàn)證了,還有,參考原子的pwm輸出程序庫函數(shù)版本的,就可以看到這個(gè)函數(shù)的具體用處了,而且照你的說法,你有用到pid還是什么。。。。。。
回復(fù)

使用道具 舉報(bào)

7#
ID:438762 發(fā)表于 2018-12-3 21:23 | 只看該作者
嗯嗯,看到了這個(gè)錯(cuò)誤,謝謝你啦
回復(fù)

使用道具 舉報(bào)

8#
ID:438112 發(fā)表于 2018-12-4 08:18 | 只看該作者
瘋子本人 發(fā)表于 2018-12-3 20:39
你好,其實(shí)你先在這個(gè)函數(shù)直接傳固定值進(jìn)去,看一下電壓有沒有變化就可以驗(yàn)證了,還有,參考原子的pwm輸 ...

好的,我先看看原子的例程,我是用PID,謝謝你啦。不懂的可能還要麻煩你
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表