Перейти к содержанию
    

1 hour ago, Alex-lab said:

Вы определите, что по вашему значит отбросить. Для меня это заменить нулем. Это сделать нельзя.

вот код ребят от ST. сам ПИД.

//This is called from TIM3 update interrupt. defined in input.c
void updatePid()
{
    uint32_t abs_position_error;
    int32_t position_delta;
    int32_t position_delta_delta;
    static uint8_t prevdir;
    
    //getEncoderCount(); this is dangerous to call from interrupt
    if (!motor_running)
    {
	pid_integrated_error=0;
	return;
    }

    position_error = encoder_count - pid_requested_position;

    position_delta= pid_requested_position - pid_last_requested_position;
	position_delta_delta = position_delta - pid_last_requested_position_delta;

	pid_last_requested_position = pid_requested_position;
	pid_last_requested_position_delta = position_delta;

	if(abs(position_error)> max_error)
			max_error = abs(position_error);

	abs_position_error = abs(position_error);

	if (abs_position_error > s.max_error)
	{
	      pwm_motorStop();
	      ERROR_LED_ON;
	      return;

	}
//P
	int32_t output = position_error * s.pid_Kp;

//I
	pid_integrated_error += position_error * s.pid_Ki;
	if (pid_integrated_error > 400000)
		pid_integrated_error = 400000;
	if (pid_integrated_error < -400000)
		pid_integrated_error = -400000;

	output += pid_integrated_error;
//D
	output += (position_error - pid_prev_position_error) * s.pid_Kd;
	pid_prev_position_error = position_error;


//FF1
	output += position_delta * s.pid_FF1;
//FF2
	output += position_delta_delta * s.pid_FF2;

	output /= 100; //provide larger dynamic range for pid. (without this, having pid_Ki = 1 was enough for oscillation.

    //limit output power
	if (output > MAX_DUTY)
		output = MAX_DUTY;
	if (output < -MAX_DUTY)
		output = -MAX_DUTY;
	if(output>0)
	{
		dir=0;

	}
	else
	{
		dir=1;

	}

	duty = abs(output);
}

таймер TIM3 настроен на вызов ПИД.

void TIM3_IRQHandler(void) {
  if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
  {
	if(s.inputMethod==inputMethod_stepDir)
	{
	  updatePid();
	  TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
	}
	else
	{
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
		updateCtr++;
		if(updateCtr>50)
		{
			 //pwm_motorStop();
			 //ERROR_LED_ON;

		}

	}

  }

не вижу где dt вступает в игру.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 minute ago, jenya7 said:

не вижу где dt вступает в игру.

Там где идет инициализация таймера. Задается значение регистра CCR или ARR.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Alex-lab said:

Там где идет инициализация таймера. Задается значение регистра CCR или ARR.

void initPid()
{

	pid_requested_position=encoder_count;
	pid_integrated_error = 0;
	pid_prev_position_error =0;

	//TIM3 used for pid loop timing.
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
	TIM_TimeBaseStructure.TIM_Prescaler = 72; //1MHz counter
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseStructure.TIM_Period = 250; //4kHz update interval
	TIM_TimeBaseStructure.TIM_ClockDivision = 0;
	TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
	TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
	TIM_Cmd(TIM3, ENABLE);

	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);

}

как? в выходной PWM добавляется dt?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Alex-lab said:

Вот тут.

но это же константа. константу всегда можно выбросить, не?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 minute ago, jenya7 said:

константу всегда можно выбросить

Лично вам точно можно. Разрешаю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...