Например TDA7294

Форум РадиоКот • Просмотр темы - stm32f103: 2 вопроса о ADC и Timers
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Вт апр 16, 2024 21:07:33

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: stm32f103: 2 вопроса о ADC и Timers
СообщениеДобавлено: Вс мар 11, 2018 19:33:23 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Вс июн 21, 2009 10:55:16
Сообщений: 38
Откуда: Москва
Рейтинг сообщения: 0
Доброго дня, прошу помощи в двух проблемах.
1. Есть 4 канала ADC, которые через DMA записываются в ADCBuffer. НО, корректно работают только 4,5 и 6. 3 канал показывает около 1/2 питания и не реагирует на изменение напряжения на входе.

Код:
uint16_t ADCBuffer[] = {0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}; // DMA Buffer

void adc_Init(void){
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // Включаем GPIOA
        RCC_ADCCLKConfig (RCC_PCLK2_Div6);
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 , ENABLE); // Включаем ADC1
   RCC_AHBPeriphClockCmd (RCC_AHBPeriph_DMA1  , ENABLE); // Включаем DMA1
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO , ENABLE); // Включаем AFIO
   //   DMA Config
   DMA_InitStructure.DMA_BufferSize = 4;
   DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
   DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
   DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADCBuffer;
   DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
   DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
   DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
   DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;
   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
   DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
   DMA_InitStructure.DMA_Priority = DMA_Priority_High;
   DMA_Init(DMA1_Channel1, &DMA_InitStructure);
   DMA_Cmd(DMA1_Channel1, ENABLE);   
   GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AIN;
   GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 |GPIO_Pin_6;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(GPIOA, &GPIO_InitStructure);
   //ADC Config
   ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
   ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
   ADC_InitStructure.ADC_ScanConvMode = ENABLE; 
   ADC_InitStructure.ADC_NbrOfChannel = 4;
   ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
   ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
   ADC_Init(ADC1, &ADC_InitStructure);
   ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 1, ADC_SampleTime_239Cycles5);
   ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 2, ADC_SampleTime_239Cycles5);
   ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 3, ADC_SampleTime_239Cycles5);
   ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 4, ADC_SampleTime_239Cycles5);
   ADC_Cmd (ADC1, ENABLE);
   ADC_DMACmd(ADC1, ENABLE);
   ADC_ResetCalibration(ADC1);
      while(ADC_GetResetCalibrationStatus(ADC1));
   ADC_StartCalibration(ADC1);
      while(ADC_GetCalibrationStatus(ADC1));
   ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}


2. Есть таймер TIM3 на ноге PB4. Его задача определять спад фронта и считать их количество. Но хотя бы реагировать на спад.

Код:
void Tacho_IC_TIM3_CH1_Init(void){
    /* Таймер TIM3, канал 1 */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO , ENABLE); // Включаем AFIO
   
  Timers_GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  Timers_GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
   Timers_GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &Timers_GPIO_InitStructure);

  TIM_TimeBaseInitStructure.TIM_Prescaler = 1 - 1;
   TIM_TimeBaseInitStructure.TIM_Period = 0xFFFF;
   TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
   TIM_TimeBaseInitStructure.TIM_Prescaler = TIM_CKD_DIV1;
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
   
   TIM_ICInitTypeDef TIM_ICInitStructure;
  TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;
  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
  TIM_ICInitStructure.TIM_ICFilter = 0;
  TIM_ICInit(TIM3, &TIM_ICInitStructure);
   // Включение прерывания от TIM3
   NVIC_EnableIRQ(TIM3_IRQn);

   TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE);
  /* Включаем таймер */
  TIM_Cmd(TIM3, ENABLE);

}


И его обработчик прерывания:

Код:
void TIM3_IRQHandler(void)
{
  if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)
  {
    TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);
      counter++;
  }
}



Но в это прерывание он не попадает. На ноге PB4 всегда +3.2в через подтяжку 10к. Дрыгаю её, замыкая на массу. Реакции МК нет.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f103: 2 вопроса о ADC и Timers
СообщениеДобавлено: Вс мар 11, 2018 21:45:13 
Мучитель микросхем
Аватар пользователя

Карма: 6
Рейтинг сообщений: 87
Зарегистрирован: Вс янв 09, 2011 23:05:37
Сообщений: 450
Откуда: СССР
Рейтинг сообщения: 0
Чтоб PB4 заработал нужно

Код:
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE);


Если я ничего не перепутал... Или GPIO_PartialRemap_TIM3

_________________
Иван Сусанин - первый полупроводник :solder:


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 21


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y