-
Сообщения
-
Для одного из своих проектов понадобился управляемый от логики преобразователь цифровых импульсов в треугольное напряжение, "касающееся" нижним "углом" потенциала общей шины (нуля). Прежде, чем что-то ваять, отсимулировал несколько схем в Мультисиме. Первой - управляемый сдвоенный генератор тока на транзисторах. Не понравился, т.к. даже при использовании считающихся комплементарными 2N3903/2N3905, для получения симметричного треугольника, токозадающие резисторы в их эмиттерах пришлось применять с номиналом, отличающимся в три раза. Да и уровни выходного сигнала регулировались паршиво. Возможно, я чего-то недоучёл, но не стал "насиловать" эту схему дальше. Следующей отсимулированной схемой стал интегратор на ОУ. И с этой схемой оказалось не всё в порядке. Собственно, сама схема приведена ниже: На "осциллограмме" видно, что уровень выходного сигнала (при номинале потенциометра, задающего "среднюю точку" для ОУ = 74%) снижается от плюса к минусу питающего напряжения. В принципе, так оно и должно быть, поскольку интегратор по определению интегрирует входной сигнал до насыщения в плюс или минус. В известных схемах автогенератора на компараторе + интеграторе (думаю, что их схемы заскочившим в эту тему профессионалам известны, потому и не приводятся) выходные уровни фиксируются срабатыванием компаратора. Но у меня преобразователь управляться будет от внешнего 3-фазного генератора импульсов. Ниже приводятся еще две "осциллограммы" при 73% "нолеустанавливающего" резистора: снижение к нулевой линии наступает быстрее и 75%: Нуля сигнал вообще не достигает. Такое поведение интегратора с наибольшей вероятностью обусловлено входными токами утечки ОУ, но для реальной работы никак не подходит. Прошу подсказать, какие могут быть возможные пути решения данной проблемы. А с конкретикой я и сам разберусь.
-
By -=FISHER=- · Posted
Да, я так в итоге и решил сделать)) жаль что сразу не догадался -
У меня наоборот. САУ-М6 есть, а ардуины пока-что нет. Я про неё вообще не думал пока не посоветовали. Реле для ардуины - тоже нету, поэтому советовался. Короче - реле надо брать гальванически развязаное. Питать телефонозарядкой - можно. Для двигателя - любой контактор на нужную мощность. Спасибо!
-
наличие пяти разрядного индикатора никакого отношения к точности не имеет... на плате отсутствует внешний АЦП , а внутренний для СТМ32 12разрядов с погрешностью в идеале +/-3..5МЗР , 3.3V/2^12=0.8mV * 5 = 4mv такшта это такой же паказометр как и выше.
-
-
Similar Content
-
By admin
В видео поговорим об энергоэффективности микроконтроллеров. Сравним потребление в режима сна arduino, blue pill с STM32F103 и представителя новой линейки энергоэффективных микроконтроллеров от st — STM32L552.
Подробную информацию об линейке L5 можно найти тут: https://www.compel.ru/lib/143383
Пи тест часть 1: https://youtu.be/ozu1IUjH1_Q
Пи тест часть 2: https://youtu.be/uLOWYE-JJpA
-
By Стальной
Доброго времени суток!
Неделю не могу запустить DCMI на STM32F407VET6.
Работаю через HAL, инициализация кубом. К МК подключена камера OV7670. Камера дает картинку 640х480, и такое изображение мне негде хранить. Поэтому через фичу CROP хочу вырезать картинку 160х128 из центра под имеющийся экран.
Ниже примерный код, без настройки камеры. Камера тактируется от 16 МГц MCO. Сигналы поступают на выводы МК, посмотрел осциллографом. У камеры есть некоторые настройки, которые тут в коде не показал, так как они влияют только на представление данных, но не на алгоритм захвата данных.
/* USER CODE BEGIN PV */ uint16_t DCMI_data[20480] = {0}; //128*160=20480 words uint32_t ptr; /* USER CODE END PV */ //тут еще код куба, пропущу его int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_DMA_Init(); MX_DCMI_Init(); /* USER CODE BEGIN 2 */ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET); //снять ресет с матрицы ptr = (uint32_t)(&DCMI_data[0]); HAL_Delay( 500 ); //начать резать с 512 клока строки (256 пиксель), начать резать с 160 строки //захватить 256 клоков (128 пикселей), захватить 160 строк HAL_DCMI_ConfigCrop(&hdcmi, 512, 160, 256, 160); HAL_DCMI_EnableCrop(&hdcmi); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_SNAPSHOT, ptr, 10240); //однократный захват, 10240 тетрад, 20480 слов, 160*128=40960 пикселей HAL_Delay(1500); } /* USER CODE END 3 */ } В результате в буфере ничего не появляется, DMA туда ничего не кладёт, проверил. Если не вызывать функцию EnableCrop, но какие-то данные появляются, но на экран их корректно отобразить не получается. Также пытался в камере обрезку включить, а не в МК - снова нет данных. Пробовал разные частоты тактирования матрицы давать - без разницы. Отладчиком увидел, что бит EN в регистре конфигурации потока DMA не снимается, как будто DMA не получал запросов на транзакции. Помогите, пожалуйста, разобраться.
Проект на яндексДиске
-
By Карен Григорян
Здравствуйте, товарищи форумчане!
У меня вот такая проблемка: есть такая схема:
По сути тут stm32 на который подаётся некоторое постоянное напряжение, а именно на вход PA1. МК получает его, приводит в цифровую форму (разрядность АЦП равна восьми) и выводит их при помощи восьми GPIO выводов, а именно PB0-PB7. Эти выводы соединены со схемой ЦАП, которая преобразует значение, полученное от stm32 обратно в аналоговую форму и выводит в пробнике R2(1).
Проблема в том результат выводится не верный. Точнее говоря не всегда верный. Когда я подаю 1В, то на выходе получаю 0,99В, что верно. Но когда, например, подаю 300мВ, то получаю 1.8В, что совсем не верно. Код прошивки предельно прост:
while (1)
{
HAL_ADC_Start_IT(&hadc1);
HAL_Delay(10);
}
Код колбека прерывания:
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
if(hadc->Instance == ADC1) //check if the interrupt comes from ACD1
{
int adc = HAL_ADC_GetValue(&hadc1);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,(adc>>0)&1);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,(adc>>1)&1);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,(adc>>2)&1);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,(adc>>3)&1);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,(adc>>4)&1);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,(adc>>5)&1);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,(adc>>6)&1);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,(adc>>7)&1);
}
}
На всякий случай вот настройка АЦП в stm32:
Вот пример неправильного вычисления:
-
By Vladimir Rubtsov
Здраствуйте) Подскажите мне балбесу что я делаю не так. Хочу сделать чтобы при нажатии кнопки (PB13) срабатывал светодиод (PE1), но не работает, я как понял что я не правильно инициализирую режим работы порта кнопки, должен быть режим Input mode, но я не пойму как это сделать. У меня просто горит светодиод, но при нажатии кнопки ничего не происходит. Плата у меня stm32h743zi. Подскажите пожалуйста что я делаю не так, все сайты прочекал, но так ничего и не нашел. p.s. Пробовал через HAL писать тоже самое, там естественно все работает, но я хочу понять как работать с кнопкой без HAL.
#include "stm32h7xx.h" void GPIO_Init(void); int main(void) { GPIO_Init(); if((GPIOC->IDR & GPIO_IDR_ID13) != 0) { GPIOE->BSRR |= GPIO_BSRR_BR1; }else{ GPIOE->BSRR |= GPIO_BSRR_BS1; } } void GPIO_Init () { RCC->AHB4ENR |= RCC_AHB4ENR_GPIOEEN; RCC->AHB4ENR |= RCC_AHB4ENR_GPIOCEN; GPIOE->MODER = GPIO_MODER_MODE1_0; GPIOC->MODER &= ~GPIO_MODER_MODE13; }
-
By Денисов Никита
Здравствуйте. Решил я таки попробовать перебраться с Arduino AVR на STM32 и для начала решил полностью скопировать Arduino проект, но появилась проблема. Код который на AVR занимал 7кбайт и свободно вмещался на Atmega8, на STM32 занимает 26кбайт. В проекте используется 2 канала ацп + прерывания по DMA, дисплей 1602 по i2c и 4 GPIO. Конечно это занимает только 42% памяти STM32F103C8T, но для такого проекта она избыточна и я хотел использовать STM32F030F4P, но там только 16 кб памяти и прошивка не влезает. Что я не так делаю? Может нужно какую-то оптимизацию включить или что-то подобное(выбран уровень оптимизации for size)? Или у меня просто код никчёмный? Но там так мало написано, что сомневаюсь что я мог где-то накосячить
-