Настроить АЦП ST STM32F100xB
04.03.2016, 19:29
|
|
|
Прохожий
Регистрация: 04.03.2016
Сообщений: 1
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Настроить АЦП ST STM32F100xB
Помогите разобраться почему преобразование АЦП не выполняется второй раз?
|
PHP код:
|
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
char k, n, r, g, b;
uint32_t DataConv1, DataConv2, DataConv3, DataConv4;
void vFreeRTOSInitAll()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitTypeDef PORT_init_struct;
PORT_init_struct.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
PORT_init_struct.GPIO_Speed = GPIO_Speed_10MHz;
PORT_init_struct.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOC, &PORT_init_struct);
ADC_InitTypeDef ADC_init_struct;
RCC_ADCCLKConfig(RCC_PCLK2_Div4); //Устанавливаем предделитель тактовой АЦП.
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);//Включаем тактирование.
// ADC1 configuration
ADC_init_struct.ADC_Mode = ADC_Mode_Independent;//Не в Dual Mode
ADC_init_struct.ADC_ScanConvMode = ENABLE;//Сканирование включим.
ADC_init_struct.ADC_ContinuousConvMode = DISABLE;//Одиночное преобразование.
ADC_init_struct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//Тригер выключим
ADC_init_struct.ADC_DataAlign = ADC_DataAlign_Right;//Выравнивание по правому краю.
ADC_init_struct.ADC_NbrOfChannel = 4;//Число каналов.
ADC_Init(ADC1, &ADC_init_struct);//Инициализируем.
ADC_InjectedSequencerLengthConfig(ADC1, 4);
//Сопоставляем каналы регистрам. За регистры отвечает 3-й параметр. Параллельно настраиваем порты.
ADC_InjectedChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_71Cycles5);
ADC_InjectedChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_71Cycles5);
ADC_InjectedChannelConfig(ADC1, ADC_Channel_12, 3, ADC_SampleTime_71Cycles5);
ADC_InjectedChannelConfig(ADC1, ADC_Channel_13, 4, ADC_SampleTime_71Cycles5);
//Выключаем тригер.
ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_None);
// Enable automatic injected conversion start after regular one
ADC_AutoInjectedConvCmd(ADC1, ENABLE);//Это похоже запускает инжекторный канал вместе с регулярным. Т.е. в будущем будем запускать регулярный канал, а снимать с инжекторных. Хотя по поводу данной функции я могу ошибаться.
//Включили прерывания с инжекторного канала по окончании преобразования.
ADC_ITConfig(ADC1, ADC_IT_JEOC, ENABLE);
//Включили прерывания АЦП.
// NVIC_EnableIRQ(18);
//Включили АЦП
ADC_Cmd(ADC1, ENABLE);
/*Теперь надо сделать калибровку. В этом я тоже не разбирался. Так что тут приведена стандартная процедура.*/
// Enable ADC1 reset calibration register
ADC_ResetCalibration(ADC1);
// Check the end of ADC1 reset calibration register
while(ADC_GetResetCalibrationStatus(ADC1));
// Start ADC1 calibration
ADC_StartCalibration(ADC1);
// Check the end of ADC1 calibration
while(ADC_GetCalibrationStatus(ADC1));
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
/*void ADC1_2_IRQHandler(void)//ADC interrupt
{
ADC1-›SR&=~ADC_SR_JEOC;
DataConv1 = ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_1);
DataConv2 = ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_2);
DataConv3 = ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_3);
DataConv4 = ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_4);
//ADC_Data_TX = EN;
}
*/
void vBlinkTask (void *pvParameters)
{
while(1)
{
ADC1-›SR&=~ADC_SR_JEOC;
DataConv1 = ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_1);
DataConv2 = ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_2);
DataConv3 = ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_3);
DataConv4 = ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_4);
}
}
int main()
{
vFreeRTOSInitAll();
xTaskCreate(vBlinkTask, "BlinkTask", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);
vTaskStartScheduler();
}
void vApplicationMallocFailedHook( void )
{
for( ;; );
}
void vApplicationStackOverflowHook( TaskHandle_t pxTask, char *pcTaskName )
{
( void ) pcTaskName;
( void ) pxTask;
for( ;; );
}
void vApplicationIdleHook( void )
{
volatile size_t xFreeStackSpace;
xFreeStackSpace = xPortGetFreeHeapSize();
}
|
|
|
|
|
04.03.2016, 19:50
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 12.02.2013
Адрес: На болотах
Сообщений: 1,163
Сказал спасибо: 46
Сказали Спасибо 315 раз(а) в 244 сообщении(ях)
|
Re: Настроить АЦП ST STM32F100xB
ADC_ContinuousConvMode = DISABLE;
И калибровку кажется надо выполнять до включения ADC.
|
|
|
|
06.03.2016, 03:06
|
|
|
Гражданин KAZUS.RUN
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
|
Re: Настроить АЦП ST STM32F100xB
‹лажа удалена.›
Последний раз редактировалось Hives; 06.03.2016 в 21:32.
Причина: !
|
|
|
|
06.03.2016, 05:15
|
|
|
Гуру портала
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 11,134
Сказал спасибо: 202
Сказали Спасибо 3,285 раз(а) в 2,151 сообщении(ях)
|
Re: Настроить АЦП ST STM32F100xB
опять спл! мля у меня это вмещается в 12 строчек кода
__________________
кагмаподэ магмаподэ
|
|
|
|
06.03.2016, 18:09
|
|
|
Гражданин KAZUS.RUN
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
|
Re: Настроить АЦП ST STM32F100xB
Не порть малину. Может он индус и ему за объем платят?
|
|
|
|
06.03.2016, 19:30
|
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 9,979
Сказал спасибо: 928
Сказали Спасибо 2,261 раз(а) в 1,557 сообщении(ях)
|
Re: Настроить АЦП ST STM32F100xB
Сообщение от Hives
|
|
После включения. Этот идиотский косяк, который "писатели о STM32" копировали друг у друга, поправили в 15 (!) версии референса.
|
А теперь смотрим сюда .
|
Код:
|
A.7.1 ADC Calibration code example
/* (1) Ensure that ADEN = 0 */
/* (2) Clear ADEN */
/* (3) Launch the calibration by setting ADCAL */
/* (4) Wait until ADCAL=0 */
if ((ADC1-›CR & ADC_CR_ADEN) != 0) /* (1) */
{
ADC1-›CR &= (uint32_t)(~ADC_CR_ADEN); /* (2) */
}
ADC1-›CR |= ADC_CR_ADCAL; /* (3) */
while ((ADC1-›CR & ADC_CR_ADCAL) != 0) /* (4) */
{
/* For robust implementation, add here time-out management */
} |
__________________
Осторожно , злой кот
|
|
|
|
06.03.2016, 21:30
|
|
|
Гражданин KAZUS.RUN
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
|
Re: Настроить АЦП ST STM32F100xB
dosikus Да, вы правы. Не тот чип глянул.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 15:01.
|
|