LEVENVORF
Участник-
Постов
18 -
Зарегистрирован
-
Посещение
Репутация
0 ОбычныйИнформация о LEVENVORF
-
Звание
Участник
- День рождения 01.01.1989
Информация
-
Город
Array
-
У high-density чипов при активации Read Out Protect автоматически защищаются от записи адреса 0x08000000 - 0x08001000 (4 кб). У меня в этом диапазоне лежала прошивка и обновить ее так и не удалось, потому что похоже единственный способ разлочить эту область памяти это отключить Read Out Protect (из-за этого запуститься процедура полного стирания флэша). И все бы хорошо, но для завершения разлочивания необходимо после стирания выполнить PowerOnReset. И тут появляется проблема: откуда стартовать программе обновления прошивки??? Флэш чистый, ОЗУ тоже... Дергать ножками BOOT тоже не могу... Проблема по-прежнему актуальна. Очень хотелось бы найти решение
-
DMA и таймер в режиме захвата
LEVENVORF ответил LEVENVORF тема в ARM, 32bit
Проблема решилась! Вся проблема в том, что значения буфера смотрел в Debug'e. И судя по всему входя в режим отладки переферия останавливается неодновременно. Т.е. NVIC, скорее всего, останавливался первым, тем самым переставал сбрасываться счетчик, а DMA c таймером продолжали работать. Частично заполняя буффер некорректными данными. Большое всем спасибо за помощь!!! -
DMA и таймер в режиме захвата
LEVENVORF ответил LEVENVORF тема в ARM, 32bit
В моем виде, когда инициализация таймера стоит перед инициализацией EXTI, глюки по DMA ТОЧНО ТАКИЕ ЖЕ, как и в том варианте, который предложили Вы. Первое измерение в моем варианте действительно может быть неверным. Но как только на PB6 придет импульс, произойдет захват, передача по DMA и инициализация EXTI. Так что все остальные циклы измерения должны быть верными. -
DMA и таймер в режиме захвата
LEVENVORF ответил LEVENVORF тема в ARM, 32bit
Все равно не работает. EXTI прерывание просто перезапускает таймер, так что захват по СС1 все равно произойдет. Т.е. ложным может быть только первое срабатывание, а у меня неверное значение не только первое )))) -
DMA и таймер в режиме захвата
LEVENVORF ответил LEVENVORF тема в ARM, 32bit
unsigned short CCR1_val[500]; void Tim_Capture_Init(void) { RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM4, DISABLE); DMA_InitTypeDef DMA_InitStructure; DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&TIM4->CCR1; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&CCR1_val; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = 500; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, &DMA_InitStructure); TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; TIM_TimeBaseStructure.TIM_Prescaler = 13; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_Period = 0xFFFF; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); TIM_PrescalerConfig(TIM4, 13, TIM_PSCReloadMode_Immediate); TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM_ICInitStructure.TIM_ICFilter = 0; TIM_ICInit(TIM4, &TIM_ICInitStructure); /* TIM1 Update DMA Request enable */ TIM_DMACmd(TIM4, TIM_DMA_CC1, ENABLE); TIM_Cmd(TIM4, ENABLE); DMA_Cmd(DMA1_Channel1, ENABLE); while (!DMA_GetFlagStatus(DMA1_FLAG_TC1)); } void EXTI_init(void) { EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource8); /* Configure EXTI0 line */ EXTI_InitStructure.EXTI_Line = EXTI_Line8; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); /* Enable and set EXTI0 Interrupt to the lowest priority */ NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = Priority_EXTI; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } void EXTI9_5_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line8) != RESET) { TIM_GenerateEvent(TIM4, TIM_EventSource_Update); EXTI_ClearITPendingBit(EXTI_Line8); } } void main(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE); RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, DISABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_Init(GPIOC, &GPIO_InitStructure); Tim_Capture_Init(); EXTI_init(); while(1); } -
DMA и таймер в режиме захвата
LEVENVORF опубликовал тема в ARM, 32bit
Необходимо измерить смещение фазы между двумя сигналами. Использую STM32F103RC6T. Первый сигнал заведен на PC8, и настроено внешнее прерывание по этому входу, второй сигнал заведен на PB6 (TIM4_CH1). Алгоритм работы следующий: по переднему, восходящему фронту на PC8 срабатывает прерывание, в котором перезапускается таймер 4. По переднему восходящему фронту на PB6 происходит захват значение счетчика, по этому событию происходит передача по DMA значения из регистра ССR1 в буфер. Проблема в следующем: часть буфера заполняется некорректными значениями. Закономерности не выявил т.е. могут быть ошибки в начале, потом правильные данные, потом опять ошибки, а может быть наоборот. Пробовал по СС1 генерить не DMA запрос, а прерывание, и в нем вычитавать значение CCR1, тогда все работает, и значения корректные. Измеряемые сигналы пока беру с образцового генератора. Код приведен ниже: unsigned short CCR1_val[500]; void Tim_Capture_Init(void) { RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM4, DISABLE); DMA_InitTypeDef DMA_InitStructure; DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&TIM4->CCR1; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&CCR1_val; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = 500; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, &DMA_InitStructure); TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; TIM_TimeBaseStructure.TIM_Prescaler = 13; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_Period = 0xFFFF; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); TIM_PrescalerConfig(TIM4, 13, TIM_PSCReloadMode_Immediate); TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM_ICInitStructure.TIM_ICFilter = 0; TIM_ICInit(TIM4, &TIM_ICInitStructure); /* TIM1 Update DMA Request enable */ TIM_DMACmd(TIM4, TIM_DMA_CC1, ENABLE); TIM_Cmd(TIM4, ENABLE); DMA_Cmd(DMA1_Channel1, ENABLE); while (!DMA_GetFlagStatus(DMA1_FLAG_TC1)); } void EXTI_init(void) { EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource8); /* Configure EXTI0 line */ EXTI_InitStructure.EXTI_Line = EXTI_Line8; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); /* Enable and set EXTI0 Interrupt to the lowest priority */ NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = Priority_EXTI; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } void EXTI9_5_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line8) != RESET) { TIM_GenerateEvent(TIM4, TIM_EventSource_Update); EXTI_ClearITPendingBit(EXTI_Line8); } } -
Регулятор давления
LEVENVORF ответил LEVENVORF тема в В помощь начинающему
Спасибо. Примерно это мне и надо! Можно взглянуть на алгоритм регулирования давления т.е. на алгоритм расчета оборотов двигателя от текущего давления в баке? -
Регулятор давления
LEVENVORF ответил LEVENVORF тема в В помощь начинающему
Как соблюдать скорость нарастания давления я примерно представляю. Настрою чтобы АЦП работал в режиме верхней и нижней границы, и каждую допустим секунду, буду инкрементировать эту величину на величину скорости нарастания. Меня больше интересует другое: как плавно выйти на требуемое давление? Т.е. подойти к необходимому мне пределу и не "перескочить" его? Может есть смысл использовать ПИД регулирование? Что мне для этого будет нужно? В ТАУ не очень силен :( -
Регулятор давления
LEVENVORF ответил LEVENVORF тема в В помощь начинающему
Нет. Зависимость не линейная -
Регулятор давления
LEVENVORF опубликовал тема в В помощь начинающему
Здравствуйте! Есть задача, не могу определиться с чего начать. Давление должно увеличится в системе от 0 до Х со скоростью У, путем изменения коэффициента заполнения (1...99) управляющего сигнала регулятора давления. Давление контролируется датчиком давления подключенным к АЦП STM32F103. Устройство будет использоваться на системах с разной производительностью насоса создающего давление, поэтому интересен бы был алгоритм с обучением или какой-то начальной юстировкой. Есть ли у кого-нибудь идеи как это реализовать? -
Спасибо. Очень красивый вариант. Почти точно такой предложили сотрудники на работе. Еще раз спасибо!!!!
-
компилируется и работает. компилируется и тоже работает. ОГРОМНОЕ СПАСИБО!!!
-
не компилируется. ругается на строку: a value of type "sub_profile*" cannot be assigned to an entity of type "unsigned short"
-
Откомпилировалось :rolleyes: , но работает неправильно :crying: temp2 приняло значение первых двух байт temp[0], а это не значение элемента структуры, а кусок (потому что temp2 типа short) адреса структуры.
-
temp2 = (temp[0])->type;