Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



CooCox CooIDE

Сообщений 31 страница 42 из 42

31

Я смотрю на экране LS020,вывожу 170 точек,с генератора подаю на АЦП меандр и регулирую частоту так,чтоб на экране поместился полный период сигнала
Сейчас "ADC_InitStructure.ADC_Resolution = ADC_Resolution_10b;",по таблице 6 MSPS,на деле на экране поместился период сигнала 17,5 кГц,то есть 57,1 мксек,всего 170 точек значит выборка=57,1/170=0,33 мксек или 1/0,33 мксек=3 MSPS

У меня кокос никак не хочет прошивать через ST-LINK,пробовал многое (менял порт на 2331,DLL-ку из ST-LINK Utiliti перекидывал-никак!

0

32

bulat943 написал(а):

У меня кокос никак не хочет прошивать через ST-LINK

Наверняка кокос сообщает об ошибке? Или нажимаете на кнопку прошивки и ничего не происходит?

В коде не нашел настройку канала АЦП. Примерно такую.

Код:
ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_1Cycles5);

0

33

Травлю новую плату,так как старую из-за перепаек запорол
Как спаяю продолжу

вход АЦП PORTA.0,PORTA.4
еще вычитал что скорость преобразования надо увеличить,CUBE MX не ставится-что-то пытается качать и потом ошибка...

0

34

bulat943 написал(а):

вход АЦП PORTA.0,PORTA.4

В коде настраивается только вывод PA0. При этом канал АЦП не настраивается. Только указан что 1, но не задан конкретный.

+1

35

Схема такая же
Исходник-

Код:
void initialization()
{
	Delay_Init();
Config_SPI_Pins_n_Display();
ls020_init();
    // Включаем тактирование DMA1, ADC12 и GPIOA
// https://microtechnics.ru/stm32f3-rabota-s-adc-i-dma/
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_ADC12, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

// Настраиваем пин 1,2,3 на работу в режиме аналогового входа
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;// | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_Init(GPIOA, &GPIO_InitStructure);

// Настройки DMA 1
DMA_DeInit(DMA1_Channel1);

// Данные будем брать из регистра данных ADC1
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(ADC1->DR);
// Переправлять данные будем в переменную ADC_Result
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC_Results_Buffer[0];
// Передача данных из периферии в память
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
// Размер буфера
DMA_InitStructure.DMA_BufferSize = DMA_BUFF_SIZE;
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_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1, &DMA_InitStructure);

// Включаем первый канал DMA1
DMA_Cmd(DMA1_Channel1, ENABLE);

// Настраиваем тактирование АЦП
RCC_ADCCLKConfig(RCC_ADC12PLLCLK_Div2);

ADC_StructInit(&ADC_InitStructure);

// Калибровка АЦП
ADC_VoltageRegulatorCmd(ADC1, ENABLE);
ADC_SelectCalibrationMode(ADC1, ADC_CalibrationMode_Single);
ADC_StartCalibration(ADC1);

// Настраиваем непрерывные преобразования
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_CommonInitStructure.ADC_Clock = ADC_Clock_AsynClkMode;
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
ADC_CommonInitStructure.ADC_DMAMode = ADC_DMAMode_OneShot;
ADC_CommonInitStructure.ADC_TwoSamplingDelay = 0;
ADC_CommonInit(ADC1, &ADC_CommonInitStructure);

// Включаем работу ДМА через АЦП
ADC_DMACmd(ADC1, ENABLE);
ADC_DMAConfig(ADC1, ADC_DMAMode_Circular);

while(ADC_GetCalibrationStatus(ADC1) != RESET );

// Продолжается настройка АЦП
ADC_InitStructure.ADC_ContinuousConvMode = ADC_ContinuousConvMode_Enable;
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_ExternalTrigConvEvent = ADC_ExternalTrigConvEvent_0;
ADC_InitStructure.ADC_ExternalTrigEventEdge = ADC_ExternalTrigEventEdge_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_OverrunMode = ADC_OverrunMode_Disable;
ADC_InitStructure.ADC_AutoInjMode = ADC_AutoInjec_Disable;
ADC_InitStructure.ADC_NbrOfRegChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);

// Включаем 2,3,4 канал первого модуля АЦП
//ADC_RegularChannelConfig(ADC1, 0, 1, ADC_SampleTime_1Cycles5);
ADC_RegularChannelConfig(ADC1, 4, 1, ADC_SampleTime_1Cycles5);
ADC_RegularChannelConfig(ADC1, 0, 2, ADC_SampleTime_1Cycles5);

// Наконец-то включаем АЦП
ADC_Cmd(ADC1, ENABLE);

while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_RDY));

ADC_StartConversion(ADC1);

//ADC_Result = ADC_GetConversionValue(ADC1);



}

/*******************************************************************/

int main(void)
{__enable_irq();
	int x,  y,sinc;
	initialization();
    //while(1){ADC_StartConversion(ADC1); }
    ADC_StartConversion(ADC1);
    while(1)
    {


    	// Замер - начало
    	ls020_fillrect(0, 0, 5, 5, Red);delay_ms(100);
    	DMA_Cmd(DMA1_Channel1, DISABLE);// Отключаем DMA канал
    	DMA1_Channel1->CNDTR  =  DMA_BUFF_SIZE;// Количество пересылаемых значений
    	DMA1->IFCR           |=  DMA_IFCR_CTCIF1;	// Сбрасываем флаг окончания обмена
    	ADC_DMAConfig(ADC1, ADC_DMAMode_Circular);
    	ADC_StartConversion(ADC1);
    	         DMA_Cmd(DMA1_Channel1, ENABLE);
    	        // ADC_Cmd(ADC1, ENABLE);
    	        //while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_RDY));//Включаем DMA
    	//ADC_DMACmd(ADC1, ENABLE);
    	//ADC_Cmd(ADC1, ENABLE);
    	//ls020_fillrect(0, 0, maxX, maxY, Green);delay_ms(100);
    	while(!(DMA1->ISR & DMA_ISR_TCIF1));//Ждем заполнения DMA
    	//DMA_Cmd(DMA1_Channel1, DISABLE);// Отключаем DMA канал
    	//for (x=0;x<DMA_BUFF_SIZE;x++) {ADC_Results_Buffer[x]=ADC_Results_Buffer[x]/32 ;ADC_Results_Buffer[x]=ADC_Results_Buffer[x]+2 ;}
    	sinc=0;x=DMA_BUFF_SIZE-180;
    	while(ADC_Results_Buffer[sinc+1] >= 100 && sinc < x) sinc++;
    	while(ADC_Results_Buffer[sinc+1] <100 && sinc <x) sinc++;
    	for (x=0;x<180;x++) {arr[x]=ADC_Results_Buffer[x+sinc]/32 ;arr[x]=arr[x]+2 ;}
    	ls020_fillrect(0, 0, maxX, maxY, 0x00);//delay_ms(100);
    	ls020_setka();


    	for (x=1;x<maxY-1;x++) {
    	        	y=0;//y=x+1;//смещение на 100 отсчетов
    	        	if (arr[y+x]>=arr[y+x+1])
    	        	{ls020_line( arr[y+x+1], x, arr[y+x],x, Green);}
    	        	else
    	        	{ ls020_line( arr[y+x], x, arr[y+x+1],x, Green); }
    	}

    	delay_ms(100);

    }

0

36

Застревает на строчке "while(!(DMA1->ISR & DMA_ISR_TCIF1));//Ждем заполнения DMA"

Спаял стм и дисплей LS020 с соответствующими связками (кварц и т д)

0

37

В коде запускается калибровка АЦП, после производится настройка и далее ожидание завершения калибровки.
Обычно калибровка производится после настройки АЦП.

bulat943 написал(а):

ADC_InitStructure.ADC_NbrOfRegChannel = 1;

bulat943 написал(а):

ADC_RegularChannelConfig(ADC1, 4, 1, ADC_SampleTime_1Cycles5);
ADC_RegularChannelConfig(ADC1, 0, 2, ADC_SampleTime_1Cycles5);

В поле ADC_NbrOfRegChannel должно быть число указывающее количество задействованных каналов. Оцифровка выполняется последовательно. То есть если включено 2 канала, достижимая скорость будет в 2 раза меньше. Для получения максимальной скорости нужно использовать разные АЦП.

bulat943 написал(а):

Застревает на строчке "while(!(DMA1->ISR & DMA_ISR_TCIF1));//Ждем заполнения DMA"

Отладчик так и не удалось запустить?

+1

38

Работает один канал,отладчик не получается-так же заливаю нех через STM-32 ST-Link utiliti
Насчет "Застревает на строчке "while(!(DMA1->ISR & DMA_ISR_TCIF1));//Ждем заполнения DMA""-посте сброса идет несколько измерений и потом застревает на этой строчке-ждет флага...

0

39

bulat943 написал(а):

отладчик не получается

О какой ошибке сообщает?

bulat943 написал(а):

посте сброса идет несколько измерений и потом застревает на этой строчке-ждет флага

Выполняет именно этот цикл, или переходит в прерывание-обработчик ошибки?
У DMA есть флаг ошибки. Его не помешает сбросить.

Код:
DMA1->IFCR = DMA_IFCR_CTCIF1 | DMA_IFCR_CTEIF1;  // Сбрасываем флаг окончания обмена

+1

40

Пётр написал(а):

У DMA есть флаг ошибки. Его не помешает сбросить

Поставил в код,пока работает норм
Спасибо за помощь!!!

0

41

И поправил строчку

Код:
// Настраиваем тактирование АЦП
RCC_ADCCLKConfig(RCC_ADC12PLLCLK_Div1);

Теперь все по даташиту-на 8 бит скорость 7,2 мегасемпла!

0

42

Удалось освоить параллельное считывание дух АЦП с той же скоростью 7,2 мегасемпла...

+1