Jump to content

MechanicV

Members
  • Posts

    51
  • Joined

  • Last visited

Everything posted by MechanicV

  1. Вроде сконфил DMA под АЦП но при попытки запуска потока DMA устанавливает флаг ошибки передачи потока Прерывание тоже от DMA не проходит. sbit LCD_RS at GPIOB_ODR.B4; sbit LCD_EN at GPIOB_ODR.B5; sbit LCD_D4 at GPIOB_ODR.B6; sbit LCD_D5 at GPIOB_ODR.B7; sbit LCD_D6 at GPIOB_ODR.B8; sbit LCD_D7 at GPIOB_ODR.B9; int adc_res_0[11], adc_res_1[11]; char txt[11]; short i=0, t=0, k=0; void main() { RCC_APB2ENR.B8=1; // ADC1EN: синхронизация АЦП1 включена RCC_AHB1ENR.B0=1; // GPIOAEN: часы порта IO включаются RCC_AHB1ENR.B22=1; // DMA2EN: часы DMA2 включены GPIOA_MODER.B4=1; // : Режим вывода общего назначения порт PA2 GPIOA_MODER.B5=0; GPIOA_OTYPER.B2=0; // GPIOA_OSPEEDR.B4=1; GPIOA_OSPEEDR.B5=1; GPIOA_MODER.B0=1; // Аналоговый режим порт PA0 GPIOA_MODER.B1=1; GPIOA_OSPEEDR.B0=1; GPIOA_OSPEEDR.B1=1; GPIOA_MODER.B2=1; // Аналоговый режим порт PA1 GPIOA_MODER.B3=1; GPIOA_OSPEEDR.B2=1; GPIOA_OSPEEDR.B3=1; EN_bit =0; // Если поток включен, отключите его, сбросив бит EN в регистр DMA_SxCR DMA2_LIFCR=1; // Все потоковые выделенные биты, очищены DMA2_HIFCR=1; DMA2_S0PAR=(int)&ADC1_DR; // адрес регистра периферийного порта в регистре DMA_SxPAR DMA2_S0M0AR=(int)&adc_res_0; // адрес памяти в регистре DMA_SxMA0R DMA2_S0NDTR =10; CHSEL0_bit =0; // канал DMA2 канал0 (запрос) с помощью CHSEL [2: 0] в регистре DMA_SxCR CHSEL1_bit =0; CHSEL2_bit =0; PL0_bit =1; // приоритет потока наивысший PL1_bit =1; MSIZE0_bit =1; // Размер данных памяти 16 бита MSIZE1_bit =0; PSIZE0_DMA2_S0CR_bit =1; // Размер периферийных данных 16 бит PSIZE1_DMA2_S0CR_bit =0; MINC_bit =1; // Указатель адреса памяти увеличивается после каждой передачи данных //(приращение выполняется в соответствии с MSIZE) DIR0_bit =0; //Направление передачи данных Эти биты устанавливаются и сбрасываются программно. DIR1_bit =0; // : Периферийное в память //PFCTRL_bit =1; // EnableInterrupts(); NVIC_IntEnable(IVT_INT_DMA2_Stream0); // разрешение прерывания при завершении передачи TCIE_DMA2_S0CR_bit =1; // разрешение прерывания при завершении передачи DMA_bit =1; // режим прямого доступа к памяти АЦП SMPx_x0_ADC1_SMPR2_bit =1; SMPx_x1_ADC1_SMPR2_bit =0; SMPx_x2_ADC1_SMPR2_bit =0; ADCPRE0_bit =1; // ADCPRE1_bit =0; ADON_bit =1; //вкл модуля АЦП SWSTART_bit =1; //старт преобразования АЦП EN_bit =1; //запуск потока DMA Lcd_Init(); Lcd_Cmd(_LCD_CURSOR_OFF); Lcd_Cmd(_LCD_CLEAR); while(1) { if(TCIF0_bit ) // Флаг прерывания завершения передачи потока { t=11; } else if(HTIF0_bit ) // Флаг прерывания половинной передачи потока { t=22; } else if(TEIF0_bit ) // Флаг прерывания ошибки передачи потока { t=33; } else if(DMEIF0_bit ) // Флаг прерывания из-за ошибки прямого режима потока { t=44; } WordToStr(t, txt); Lcd_Out(1, 1, txt); } } void DMA_INT_2() iv IVT_INT_DMA2_Stream0 ics ICS_AUTO // прерывания при завершении передачи { CTEIF0_bit =1; ADC1_SQR3.B0=i; EN_bit =1; SWSTART_bit =1; i++; }
  2. MechanicV

    STM32

    Делюсь для LCD1620 lcd.rar
  3. Ладно думаю пойму позже. Всем СПС.
  4. А у вас не осталось за ведомо оригинального STM32F4xx какого нибудь для экперемента?
  5. Так ведь если что то писать дальше что нибудь то выходит остальной код будет обрабатываться с частотой 1.5 МГц? ЧТо то это совсем мало. Просто хочу понять это норма для такого МК?
  6. Ладно спрошу по другому вот настрою я тактовый генератор на 100 МГц затактирую из периферии только PORTA и буду изменять состояние всего регистра GPIOA->ODR=~GPIOA->ODR как на коде ниже порты настрою на GPIO_SPEED_FREQ_HIGHT int main() { while(1) { GPIOA->ODR=~GPIOA->ODR; } } какую я частоту получу на портах A?
  7. менял на GPIO_SPEED_FREQ_HIGHT ногодрыг так и остаётся 1.5 МГц.
  8. @BARS_ понял выходит что на выходе порта PA0 я получаю всего 1.56 МГц это нормально? кстати менял на HIGH вообще не чего не меняется.
  9. Причём здесь DMA когда я читаю напрямую из регистров не дожидаясь окончания преобразования? Везде 100МГц кроме APB1.
  10. Всем здрасти. Накидал код обработки двух каналов АЦП одного регулярного одного инжекторного. Решил посмотреть сколько тиков мне останется после чтения из регистров АЦП данные тиков вывожу на вывод PA0 и вижу что осталось на остальные нужды всего 1,563 МГц из 100 МГц тактового генератора. Почему так мало? МК подделка? АЦП настроен в автоматическом перезапуски. /* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : main.c * @brief : Main program body ****************************************************************************** * @attention * * Copyright (c) 2022 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "main.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "hd44780.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ ADC_HandleTypeDef hadc1; TIM_HandleTypeDef htim4; /* USER CODE BEGIN PV */ /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_ADC1_Init(void); static void MX_TIM4_Init(void); /* USER CODE BEGIN PFP */ uint16_t cout_adc_r=0, cout_adc_i=0; char txt[20]; /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ /** * @brief The application entry point. * @retval int */ 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_ADC1_Init(); MX_TIM4_Init(); /* USER CODE BEGIN 2 */ HAL_ADC_Start(&hadc1); HAL_ADCEx_InjectedStart(&hadc1); lcd_init(); lcd_clear(); //lcd_out_txt(0,0,"HALLO"); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { cout_adc_r=ADC1->DR; cout_adc_i=ADC1->JDR1; GPIOA->ODR=~GPIOA->ODR; /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } /** * @brief System Clock Configuration * @retval None */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** Configure the main internal regulator output voltage */ __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 12; RCC_OscInitStruct.PLL.PLLN = 96; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = 4; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** Initializes the CPU, AHB and APB buses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3) != HAL_OK) { Error_Handler(); } } /** * @brief ADC1 Initialization Function * @param None * @retval None */ static void MX_ADC1_Init(void) { /* USER CODE BEGIN ADC1_Init 0 */ /* USER CODE END ADC1_Init 0 */ ADC_ChannelConfTypeDef sConfig = {0}; ADC_InjectionConfTypeDef sConfigInjected = {0}; /* USER CODE BEGIN ADC1_Init 1 */ /* USER CODE END ADC1_Init 1 */ /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion) */ hadc1.Instance = ADC1; hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; hadc1.Init.Resolution = ADC_RESOLUTION_12B; hadc1.Init.ScanConvMode = ENABLE; hadc1.Init.ContinuousConvMode = ENABLE; hadc1.Init.DiscontinuousConvMode = DISABLE; hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc1.Init.NbrOfConversion = 1; hadc1.Init.DMAContinuousRequests = DISABLE; hadc1.Init.EOCSelection = ADC_EOC_SEQ_CONV; if (HAL_ADC_Init(&hadc1) != HAL_OK) { Error_Handler(); } /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time. */ sConfig.Channel = ADC_CHANNEL_1; sConfig.Rank = 1; sConfig.SamplingTime = ADC_SAMPLETIME_144CYCLES; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } /** Configures for the selected ADC injected channel its corresponding rank in the sequencer and its sample time */ sConfigInjected.InjectedChannel = ADC_CHANNEL_2; sConfigInjected.InjectedRank = 1; sConfigInjected.InjectedNbrOfConversion = 1; sConfigInjected.InjectedSamplingTime = ADC_SAMPLETIME_144CYCLES; sConfigInjected.ExternalTrigInjecConvEdge = ADC_EXTERNALTRIGINJECCONVEDGE_NONE; sConfigInjected.ExternalTrigInjecConv = ADC_INJECTED_SOFTWARE_START; sConfigInjected.AutoInjectedConv = ENABLE; sConfigInjected.InjectedDiscontinuousConvMode = DISABLE; sConfigInjected.InjectedOffset = 0; if (HAL_ADCEx_InjectedConfigChannel(&hadc1, &sConfigInjected) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN ADC1_Init 2 */ /* USER CODE END ADC1_Init 2 */ } /** * @brief TIM4 Initialization Function * @param None * @retval None */ static void MX_TIM4_Init(void) { /* USER CODE BEGIN TIM4_Init 0 */ /* USER CODE END TIM4_Init 0 */ TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; /* USER CODE BEGIN TIM4_Init 1 */ /* USER CODE END TIM4_Init 1 */ htim4.Instance = TIM4; htim4.Init.Prescaler = 0; htim4.Init.CounterMode = TIM_COUNTERMODE_UP; htim4.Init.Period = 65535; htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim4) != HAL_OK) { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN TIM4_Init 2 */ /* USER CODE END TIM4_Init 2 */ } /** * @brief GPIO Initialization Function * @param None * @retval None */ static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOH_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6 |GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9, GPIO_PIN_RESET); /*Configure GPIO pin : PA0 */ GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /*Configure GPIO pins : PB3 PB4 PB5 PB6 PB7 PB8 PB9 */ GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6 |GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); } /* USER CODE BEGIN 4 */ /* USER CODE END 4 */ /** * @brief This function is executed in case of error occurrence. * @retval None */ void Error_Handler(void) { /* USER CODE BEGIN Error_Handler_Debug */ /* User can add his own implementation to report the HAL error return state */ __disable_irq(); while (1) { } /* USER CODE END Error_Handler_Debug */ } #ifdef USE_FULL_ASSERT /** * @brief Reports the name of the source file and the source line number * where the assert_param error has occurred. * @param file: pointer to the source file name * @param line: assert_param error line source number * @retval None */ void assert_failed(uint8_t *file, uint32_t line) { /* USER CODE BEGIN 6 */ /* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* USER CODE END 6 */ } #endif /* USE_FULL_ASSERT */
  11. Епцтедей у дураков мысли сходятся. Сейчас делаю диплом и тоже дежурку на трансе 50 Гц и GDT и ТТ всё похоже.
  12. @Гость_Григорий_Т. ты то сюда чего лезешь один уй не фига не понимаешь в этой теме.
  13. Вы такие тупые советы не слушайте. А почему на два может на 1000000000000000000000 нужно умножить. У вас скорей всего дело в управлении и транзюки открываются на встречу друг другу получается высокий сквозной ток.
  14. Всем привет. Есть такой вопрос. Почему выход 3.3 Вольта собирают в комповых БП отдельной схемой преобразователя? Почему бы не включить эти 3.3 Вольта в дроссель групповой стабилизации ну соответственно так же добавить отдельную обмотку и отдельный выпрямитель для линии 3,3 Вольта.
  15. Интересный подход а шунты то я и проморгал. Ну и как работает такой способ? Так то вроде всё не плохо с этой IR2153 позволяет в короткие сроки экстренно построить питальник малых габаритов и получить кучу выходных напряжений НО вот этот нагрев сердечника, почему греется?
  16. Это та зачем ляпить? В самой IR2153 уже стоят транзисторы для разряда затворов.
  17. А думаешь если задействуешь USART то что то изменится? Всё равно придётся слать данные и получать в прерывании и это же прерывание будет мешать я уже пробовал у хвалёных STM на 100 МГц сил не хватает.
  18. Не соглашусь, хотя бы фирма сделала себе рекламу с лёгким стартом в мир stm32. Это отступление от темы. Если сравнивать с PIC18 и его USART то там всё просто когда буфер приёма полон то тогда прерывание и не каких компромисов, поэтому очень легко и надёжно контролировать массив данных.
  19. HAL для USART не очень полезен. https://istarik.ru/blog/stm32/120.html Вообще как то странно организованно нужно с начало определить сколько будет принято байт и ждать пока они все прилетят только тогда будет прерывание но если не дойдут байты то прерывание не будет.
  20. Это естественно что шим контролеру силу не стоит приближать речь о длинных проводниках от силы до транса и от транса до диодного моста.
  21. Проводил иксперемент подключал трансформатор к полумосту через метровые провода, нагружал выход до 500 Ватт, козу вешал и не чего. Осциллограммы по выходу как были что при включении трансформатора в плотную к полумосту что через метровые провода. Тоже тут писак начитался всяких мол топологию плат нужно прям супер пупер такую только гении смогут, а потом вообще на многодыре стал питальники паять.
  22. Да не ограничена 2000 КВт но вот амплитуда тока первичной обмотки у моста ниже а у полумоста выше в два раза. Правда на что это влияет я не знаю.
  23. Что бы важности придать да бюджет жрать. Потом пусть другие разгребают.
  24. Ну вот, а выдавали себя за очередного бесполезного пиз... Промышленный? От трёх фаз питается?
×
×
  • Create New...