STM32FDISCOVERY + ЦАП

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Открыл глаза
Сообщения: 71
Зарегистрирован: Чт окт 28, 2010 11:20:39

Сообщение bishop-strip »

Здравствуйте!
Приобрел плату STM32F4DISCOVERY, на ней есть ножка PA4, которая может выполнять функции ЦАПа (DAC2).
как мне вывести из нее требуемое напряжение:
Спойлерvoid DAC_Configuration(void)
{
/* Включаем порт А */
RCC_APB2PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
/* Включаем ЦАП */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
/* Настраиваем ногу ЦАПа */
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);

DAC_InitTypeDef DAC_InitStructure;
DAC_InitStructure.DAC_Trigger = DAC_Trigger_Software;
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable;
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
DAC_Init(DAC_Channel_2, &DAC_InitStructure);
DAC_Cmd(DAC_Channel_2, ENABLE);


//DAC->CR |= DAC_CR_EN2;
}

u16 setDAC(u16 value)
{
DAC_SetChannel1Data(DAC_Align_12b_R, value);
}
Это мой код, но он требуемого результата не дает.
Как мне получить требуемое напряжение?
Заранее спасибо!
Реклама
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1433
Зарегистрирован: Вс дек 02, 2012 03:13:48
Откуда: Калининград

Сообщение balmer »

GPIOA GPIO_Pin_4 - это ADC12_IN4.
А у тебя в коде DAC_Channel_2, а надо DAC_Channel_4.

Так -же возможно, что частота очень большая.
Надо RCC_ADCCLKConfig(RCC_PCLK2_Div4);//48/4 = 12 MHz - это если на 48 MHz у тебя чип работает.
Реклама
Открыл глаза
Сообщения: 71
Зарегистрирован: Чт окт 28, 2010 11:20:39

Сообщение bishop-strip »

Спасибо за ответ!
Я решил задачу, во первых проблема была в том, что порт PA4 это ЦАП1, а не ЦАП2:)
Во вторых, выкладываю рабочий код(у меня он точно работает) для ЦАПа на ножке PA4 на плате STM32F4DISCOVERY:
Спойлерvoid DAC_Configuration(void)
{
/* Включаем порт А */
RCC_APB2PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
/* Включаем ЦАП */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);

/* Настраиваем ногу ЦАПа */
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);

DAC->CR &= ~DAC_CR_EN1; // выкл. ЦАП 1
DAC->CR &= ~DAC_CR_BOFF1; // вкл. буффер
DAC->DHR12L1 = 0x10; // загрузка данных в ЦАП1
DAC->DHR12R1 = 0x10; // загрузка данных в ЦАП1
DAC->CR |= DAC_CR_TSEL1_0; //Режим программный
DAC->CR |= DAC_CR_TSEL1_1; //
DAC->CR |= DAC_CR_TSEL1_2; //
DAC->CR &= ~DAC_CR_TEN1; //В регистре DOR будет информация о выдаваемом напряжении
DAC->CR |= DAC_CR_EN1; // вкл. ЦАП 1*/
}

u16 setDAC(u16 value)
{
DAC->DHR12R1 = value; // загрузка данных в ЦАП1
}
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 31
Зарегистрирован: Вт авг 27, 2013 10:51:04
Откуда: Донецк, Украина

Сообщение evilbob »

Подскажите, а разве РА4 надо настраивать на вход? Мне казалось, что мы считываем напряжение после ЦАП, то есть нога должна работать как выход? И еще один вопрос, для чего две строчки используются:
DAC->DHR12L1 = 0x10; // загрузка данных в ЦАП1
DAC->DHR12R1 = 0x10; // загрузка данных в ЦАП1
первая заносит данные в регистр хранения данных с левым выравниванием, а вторая - с правым выравниванием данных, собственно вопрос - зачем две если можно использовать одну, DAC->DHR12R1? Или я что-то путаю, поправте пожалуйста
Реклама
Эиком - электронные компоненты и радиодетали
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1433
Зарегистрирован: Вс дек 02, 2012 03:13:48
Откуда: Калининград

Сообщение balmer »

evilbob писал(а):Подскажите, а разве РА4 надо настраивать на вход?
Если вы про мой ответ, то посыпаю голову пеплом и каюсь в невнимательности. Умудрился перепутать ЦАП и АЦП. Естественно на выход надо то, что выдает сигнал.
Реклама
Держит паяльник хвостом
Аватара пользователя
Сообщения: 993
Зарегистрирован: Пн сен 18, 2006 11:16:05
Откуда: Тула

Сообщение Neekeetos »

balmer писал(а):
evilbob писал(а):Подскажите, а разве РА4 надо настраивать на вход?
Если вы про мой ответ, то посыпаю голову пеплом и каюсь в невнимательности. Умудрился перепутать ЦАП и АЦП. Естественно на выход надо то, что выдает сигнал.
Выхода цапа надо настраивать в режим аналогового входа, изначально верно все настраивается с одним но -

Код: Выделить всё

/* Включаем порт А */
RCC_APB2PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
А должно быть по идее

Код: Выделить всё

/* Включаем порт А */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
Повезло что порт по умолчанию как раз и настроен на вход, поэтому заработало
Информация по RLC mini находится >тут<
Контактная информация:
Реклама
Ответить

Вернуться в «ARM»