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

Не работает ШИМ


DrobyshevAlex

Рекомендуемые сообщения

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

1 час назад, MasterElectric сказал:

Вот мой вариант под DHT-22

Отлично! Как раз повод выучить DMA.

Только что решил что вроде все понятно, как меня сбила эта запись в настройке 2 канала DMA

DMA1_Channel2->CCR = DMA_CCR2_PL | DMA_CCR2_MSIZE_0 | DMA_CCR2_PSIZE_1 | DMA_CCR2_MINC | DMA_CCR2_CIRC | DMA_CCR2_DIR;

Я не имею сейчас под рукой IDE и не могу глянуть значения макросов, но видимо DMA_CCR2_PSIZE_1 это 1 бит для PSIZE то есть 0b10 = 32 bit.

  DMA1_Channel2->CCR = 0;
  // указатель на начала памяти МК где будем читать
  DMA1_Channel2->CMAR = (uint32_t) &DHT22_TimDelayBuff[0];
  // указатель на перефирию куда будем писать
  DMA1_Channel2->CPAR = (uint32_t) &TIM2->CCR1;
  // сколько элементов массива
  DMA1_Channel2->CNDTR = sizeof(DHT22_TimDelayBuff)/sizeof(*DHT22_TimDelayBuff);

  DMA1_Channel2->CCR = DMA_CCR2_PL | DMA_CCR2_MSIZE_0 | DMA_CCR2_PSIZE_1 | DMA_CCR2_MINC | DMA_CCR2_CIRC | DMA_CCR2_DIR;

И вот тут непонятно, MSIZE настроено на 16 бит что логично так как у нас массив uint16 а вот PSIZE на 32 бита но периферия настроена на CCR1 который 16 бит.

Почему 32?

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

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

В данном случае это не важно, старшие 16 дополняться нулями. Можно и на 16 настроить доступ по документации возможен и 16 битный к данному регистру.

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

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

И еще вопрос, в обработчике прерывания 7 канала

uint64_t tData = 0;
uint8_t *tDataBuff = (uint8_t*)&tData;
uint32_t *b;
b = BITBAND_RAMADR((uint32_t)&tData, 0);
for(a = 0; a < 40; a++) if((DHT22_DataBuff[a + 2] - DHT22_DataBuff[a + 1]) > 10) b[39 - a] = 1; else b[39 - a] = 0;
 

Я правильно понимаю что это то же что

uint64_t tData = 0;
for(a = 0; a < 40; a++)
  tData |= ((DHT22_DataBuff[a + 2] - DHT22_DataBuff[a + 1]) > 10) << a;

? То есть это из массива в биты переводим значения?

Изменено пользователем DrobyshevAlex
Ссылка на комментарий
Поделиться на другие сайты

Таймер настроен таким образом что он переполняется уже после пересылки всех 40 бит датчиком. После переполнения имеем 42 захваченных таймером фронтов они у нас в массиве DHT22_DataBuff, те тут значения таймера в момент захвата, и в зависимости от разности соседних фронтов мы вычисляем единица передавалась или ноль. Ну и данные вывернуты наизнанку в датчике те там MSB, а МК у нас little endian так что пришлось выворачивать. Совсем не одно и тоже. А смысл правильный перевод в биты.

Изменено пользователем MasterElectric
Ссылка на комментарий
Поделиться на другие сайты

43 минуты назад, MasterElectric сказал:

Совсем не одно и тоже

Ну может я чего ен понял, но вроде код аналогичный. Но сейчас это не важно :D

Пытаюсь вывести данные с DHT11 на дисплей но почему то прерывание 7 канала никогда не срабатывает...

Прочел что питание для DHT11 нужно минимум 3.5В если я от 5 запитаю не сгорит СТМ? то есть масса будет общая но питание от разных источников.

Алгоритм вроде бы тот же по таймингам.

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

  TIM2->PSC = 719;  // настраиваем на период 10 мкс и переполнение на 100мс
  TIM2->ARR = 49999;

там возможно опечатка? Вроде бы на 500 мс тут или я ошибаюсь? 72000000 / 720 = 100000 / 50000 = 2 раза в сек

не могу понять почему не работает прерывания 7го канала не пойму как отдебажить датчик)

Видимо перепишу пока без ДМА для теста.

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

PA0 - нельзя, нужны толерантные к 5 вольтам пины использовать.

возможно нет ответа, прерывание сработает как соберет 40 бит от датчика. TIM2 висит на APB1 = 36МГц

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

Вообщем переписал код на просто дерганье портом, вроде бы все работает. То етсь я получаю набор 0 и 1 так что чекусум всегда совпадает.

Но какие то данные странные там :D Температура 13326, то етсь судя по описанию это 1332.6 градусов :o

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

18 часов назад, MasterElectric сказал:

Ну и данные вывернуты наизнанку в датчике те там MSB, а МК у нас little endian так что пришлось выворачивать.

 

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

21 час назад, MasterElectric сказал:

Ну и данные вывернуты наизнанку в датчике те там MSB, а МК у нас little endian так что пришлось выворачивать.

вывернулся пока через структуры, выходит датчик рабочий, но прерывания от DMA пока не сделал

#ifndef WITH_DMA

typedef struct {
	uint8_t crc;
	uint8_t TD;
	uint8_t TI;
	uint8_t HD;
	uint8_t HI;
} temp_s;

#define DHT_SIZE 5
#define DHT_MAX_US 200

uint8_t DHTGetUs(uint8_t state){
	uint16_t cnt = 0;
	while (GPIO_ReadInputDataBit(DHT_GPIO, DHT_PIN) == state && (cnt++ < DHT_MAX_US)){
		delay_us(1);
	}

	return cnt;
}

uint8_t DHTRecv(temp_s *data){
  uint64_t *buf = data;
  uint8_t cnt, i;

  DHT_SET_OUT();
  GPIO_WriteBit(DHT_GPIO, DHT_PIN, Bit_SET);
  delay_ms(100);
  GPIO_WriteBit(DHT_GPIO, DHT_PIN, Bit_RESET);
  delay_ms(30);
  GPIO_WriteBit(DHT_GPIO, DHT_PIN, Bit_SET);
  DHT_SET_IN();

  DHTGetUs(1);
  if (DHTGetUs(0) < 5) return ERROR;
  if (DHTGetUs(1) < 5) return ERROR;

  *buf = 0;
  for(i=0; i < (DHT_SIZE << 3); i++){
	  cnt = DHTGetUs(0);
	  *buf |= (uint64_t)(DHTGetUs(1) > cnt) << (39-i);
  }

  DHT_SET_OUT();
  GPIO_WriteBit(DHT_GPIO, DHT_PIN, Bit_SET);

  if (data->crc != data->HD + data->HI + data->TD + data->TI) return ERROR;

  return SUCCESS;
}
#endif


int main(void)
{
	initGPIO();
	SetSysClockTo72();
	initDimmer();
	InitializeLCD();
	ClearLCDScreen();

	PrintStr("Init...");

#ifdef WITH_DMA
	TIM4_Init();
	NVIC_EnableIRQ(TIM2_IRQn);
	NVIC_EnableIRQ(DMA1_Channel7_IRQn);
#else
	temp_s data;
#endif

	char buf[20];

	while(1) {
#ifndef WITH_DMA
    	if (DHTRecv(&data) == SUCCESS) {
    		ClearLCDScreen();
			snprintf(buf, 20, "Temp: %d.%d", data.TI, data.TD);
			PrintStr(buf);
			Cursor(1, 0);
			snprintf(buf, 20, "H: %d.%d", data.HI, data.HD);
			PrintStr(buf);
    	} else {
    		ClearLCDScreen();
    		PrintStr("DHT Error");
    	}
#endif
    	delay_ms(1000);
    }
}

 

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

13 часа назад, MasterElectric сказал:

печаль в том, что датчик медленный и пока ты его опрашиваешь мк ничего больше не делает.

я это знаю, и я написал это что бы проверить работает ли датчик вообще, и от скольки вольт) Например от 3 вольт с платы стм он не запустился а от 3х вольт с макетной платы запустился, и от 5 работает.

Просто, как я писал ранее, прерывание DMA не срабатывало. Сейчас когда я уверен, что он работает и работает на PB6 толерантной к 5В, я хочу сделать на 4 таймере на первом канале. Сегодня буду пытаться ближе к вечеру.

А вообще, это инкубатор, и ему в принципе нечего делать кроме как опрашивать датчик и в зависимости от этого регулировать температуру :) Но тут дело в том, что я все равно хочу DMA изучить)

 

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

В 09.01.2019 в 20:29, MasterElectric сказал:

печаль в том, что датчик медленный и пока ты его опрашиваешь мк ничего больше не делает

Спасибо за помощь) Все получилось с DMA. Правда некоторые момент не понятны остались.

Например если взять канал 1 ДМА то на нем есть TIM4_CH1 а на 7 TIM4_UP и вот тут не понятно почему если поставить так

TIMx->DIER = TIM_DIER_UDE | TIM_DIER_CC1IE | TIM_DIER_CC2DE;

То ШИМ не работает, не читает с ДМА а если перенести на 7 канал то работает.

stm32_dma2.png

Точнее не понятно что вообще значит TIMx_UP

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

В 09.01.2019 в 18:40, DrobyshevAlex сказал:

uint64_t *buf = data;

там если кто то захочет взять код :D то поаккуратней это для быстрого теста было)

ибо структура имеет другой размер, лучше uint8 заюзать или отдельно uint64 + memcpy что бы не побить память)

 

 

Изменено пользователем DrobyshevAlex
Ссылка на комментарий
Поделиться на другие сайты

  • 1 год спустя...
07.01.2019 в 11:27, DrobyshevAlex сказал:

Я уже 50 уроков прочел, во всех одно и то же и должно работать, в комментах пишут работает. Но не работает у меня! Я уе таймер перенес на другой канал на другую ногу. На первой был всегда 0 на второй всегда 3.5В.

Ни в коем случае, никогда не тратье на меня свое время! И сами не тратье время других своими ответами :)

У меня на HAL в первый день покупки платы всё заработало.....ну что.А потом я сел за мануалы и пилю( у меня это просто хобби, так что я не спешу).Вот теперь я потихоньку начинаю понимать, что как работает. Мне даже не интересно теперь читать статьи если там есть HAL. Когда вижу регистры душа......поёт. В STM32 HAL не сидит(это образно). Там всё регистры. И что там сложного в регистрах для некоторых, до сих пор не пойму.

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

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

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

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

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

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

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

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...