Anton01

STM32 TIM2

5 сообщений в этой теме

Anton01    0

Добрый день, есть следующий код он отлично вращает моторчик.

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"

void Delay(unsigned int t)
{
	unsigned int i;
	for (i=0;i<t;i++);
}

void GPIOD_Initialize(){
	GPIO_InitTypeDef GPIOC_Stepper;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	GPIOC_Stepper.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_3|GPIO_Pin_5|GPIO_Pin_7;
	GPIOC_Stepper.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIOC_Stepper.GPIO_Speed= GPIO_Speed_50MHz;
	GPIO_Init(GPIOC,&GPIOC_Stepper);
}


int main(void)
{
	const int time = 10000;
GPIOD_Initialize();
        while(1)
        {

		 GPIO_Write(GPIOC,GPIO_Pin_5);
		 Delay(time);

		 GPIO_Write(GPIOC,GPIO_Pin_5| GPIO_Pin_3);
		 Delay(time);

          GPIO_Write(GPIOC,GPIO_Pin_3);
		 Delay(time);

		 GPIO_Write(GPIOC,GPIO_Pin_3|GPIO_Pin_7);
		 Delay(time);

		 GPIO_Write(GPIOC,GPIO_Pin_7);
		 Delay(time);

		 GPIO_Write(GPIOC,GPIO_Pin_7|GPIO_Pin_1);
		 Delay(time);

		 GPIO_Write(GPIOC,GPIO_Pin_1);
		 Delay(time);

		 GPIO_Write(GPIOC,GPIO_Pin_1|GPIO_Pin_5);
		 Delay(time);
        }
}

Но хочу переделать данный код через таймер TIM2.

 

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"

void Delay(unsigned int t) {
	unsigned int i;
	for (i = 0; i < t; i++)
		;
}

int main(void) {
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	//Включаем Таймер 2
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

	GPIO_InitTypeDef PORT;
	// Настроим ноги со светодиодами на выход
	PORT.GPIO_Pin = (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);
	//Будем использовать альтернативный режим а не обычный GPIO
	PORT.GPIO_Mode = GPIO_Mode_AF_PP;
	PORT.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_Init(GPIOA, &PORT);
	//Разрешаем таймеру использовать ноги PA1,PA2,PA3 для ШИМа
	TIM2->CCER |=
			(TIM_CCER_CC1E | TIM_CCER_CC2E | TIM_CCER_CC3E | TIM_CCER_CC4E);
	// Для всех трех каналов задаем инверсный ШИМ.
	TIM2->CCMR1 |= (TIM_CCMR1_OC2M_0 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2);
	TIM2->CCMR2 |= (TIM_CCMR2_OC3M_0 | TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3M_2
			| TIM_CCMR2_OC4M_0 | TIM_CCMR2_OC4M_1 | TIM_CCMR2_OC4M_2);
	//Запускаем таймер!
	TIM2->CR1 |= TIM_CR1_CEN;
	while (1) {
		TIM2->CCR1 = 20000;
		TIM2->CCR3 = 20000;
		Delay(10000);
		TIM2->CCR1 = 20000;
		Delay(10000);
		TIM2->CCR4 = 20000;
		TIM2->CCR1 = 20000;
		Delay(10000);
		TIM2->CCR4 = 20000;
		Delay(10000);
		TIM2->CCR2 = 20000;
		TIM2->CCR4 = 20000;
		Delay(10000);
		TIM2->CCR2 = 20000;
		Delay(10000);
		TIM2->CCR3 = 20000;
		TIM2->CCR2 = 20000;
		Delay(10000);
		TIM2->CCR3 = 20000;
	}
}

Проблема в том что когда прошиваю контроллер вторым кодом, мотор пищит но не вращается. Мне кажется что у меня неверно генерируется ШИМ. Но как определить без осцилографа какой он в первом варианте а какой во втором?

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


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

Когда в первом пишите в порт единичку на пин 3

GPIO_Write(GPIOC,GPIO_Pin_3);

то все остальные ноги GPIO_Pin_1,5,7 при этом автоматически зануляются, т.к. в этой команде в них записывется ноль.

Во втором вариатне при записи

TIM2->CCR1 = 20000;

все другие регисты ШИМа не изменяются ! То есть один раз записали туда 20000 и всё, эта величина остаётся без изменения навсегда.

Во втором варианте при изменении ШИМА остальные регистры надо каждый раз занулять вручную.

 

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


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

если пищит, значит частота переключения фаз слишком высокая. Разбирайтесь с математикой настройки таймера

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


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

Использовал следующий код.

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"

void Delay(unsigned int t) {
	unsigned int i;
	for (i = 0; i < t; i++)
		;
}

int main(void) {
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	//Включаем Таймер 2
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

	GPIO_InitTypeDef PORT;
	// Настроим ноги со светодиодами на выход
	PORT.GPIO_Pin = (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);
	//Будем использовать альтернативный режим а не обычный GPIO
	PORT.GPIO_Mode = GPIO_Mode_AF_PP;
	PORT.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_Init(GPIOA, &PORT);
	//Разрешаем таймеру использовать ноги PA1,PA2,PA3 для ШИМа
	TIM2->CCER |=
			(TIM_CCER_CC1E | TIM_CCER_CC2E | TIM_CCER_CC3E | TIM_CCER_CC4E);
	// Для всех трех каналов задаем инверсный ШИМ.
	TIM2->CCMR1 |= (TIM_CCMR1_OC2M_0 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2);
	TIM2->CCMR2 |= (TIM_CCMR2_OC3M_0 | TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3M_2
			| TIM_CCMR2_OC4M_0 | TIM_CCMR2_OC4M_1 | TIM_CCMR2_OC4M_2);
	//Запускаем таймер!
	TIM2->CR1 |= TIM_CR1_CEN;
	while (1) {

		TIM2->CCR1 = 60000;
		TIM2->CCR2 = 0;
		TIM2->CCR3 = 60000;
		TIM2->CCR4 = 0;
		Delay(60000);
		TIM2->CCR1 = 60000;
		TIM2->CCR2 = 0;
		TIM2->CCR3 = 0;
		TIM2->CCR4 = 0;
		Delay(60000);
		TIM2->CCR1 = 60000;
		TIM2->CCR2 = 0;
		TIM2->CCR3 = 0;
		TIM2->CCR4 = 60000;
		Delay(60000);
		TIM2->CCR1 = 0;
		TIM2->CCR2 = 0;
		TIM2->CCR3 = 0;
		TIM2->CCR4 = 60000;
		Delay(60000);
		TIM2->CCR1 = 0;
		TIM2->CCR2 = 60000;
		TIM2->CCR3 = 0;
		TIM2->CCR4 = 60000;
		Delay(60000);
		TIM2->CCR1 = 0;
		TIM2->CCR2 = 60000;
		TIM2->CCR3 = 0;
		TIM2->CCR4 = 0;
		Delay(60000);
		TIM2->CCR1 = 0;
		TIM2->CCR2 = 60000;
		TIM2->CCR3 = 60000;
		TIM2->CCR4 = 0;
		Delay(60000);
		TIM2->CCR1 = 0;
		TIM2->CCR2 = 0;
		TIM2->CCR3 = 60000;
		TIM2->CCR4 = 0;
	}
}

Вот что получилось:

Подскажите что я не так делаю. В каком направление двигаться дальше? Спасибо.

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


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

Найдите миллионы труднодоступных

электронных компонентов

Yurkin2015    313

В том примере из Интернета, что Вы скопировали, используются три ноги PA1, PA2 и PA3. У Вас же используются четыре ноги. Надо ещё добавить инициализацию ШИМа для PA0 в регистр TIM2->CCMR1 .

И, потом, в примере используется инверсный ШИМ, т.е. при выполнении команды "TIM2->CCR1 = 0;" на выходе будет полное напряжение, а не нулевое. Вам же нужно как раз наоборот? Если так, то надо изменить на прямой ШИМ.

Получится, типа, так:

TIM2->CCMR1 |= TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2;

TIM2->CCMR2 |= TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3M_2 | TIM_CCMR2_OC4M_1 | TIM_CCMR2_OC4M_2;

 

Изменено пользователем Yurkin2015

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


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

Ваша публикация должна быть проверена модератором

Гость
Вы не авторизованы. Если у вас есть аккаунт, пожалуйста, войдите.
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Восстановить форматирование

  Разрешено не более 75 смайлов.

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

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

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

Загрузка...