DDS генератор на AD9833
- yura860
- Вымогатель припоя
- Сообщения: 699
- Зарегистрирован: Вс сен 08, 2013 21:36:22
- Откуда: 27.200 Мгц
Re: DDS генератор на AD9833
Доброго времени суток, многоувожаемые КОТы. Прикупил я плату dds генератора ad9833 , есть arduino uno. И как я не бился с ентой arduino немогу собрать код (скетч) каму как нравиться. Есть готовые для nano, но почемуто даже при установке в программе nano, а не uno, программа ардуинская выдаёт ашибку. Как быть подскажите пожалуста, а то я что то не вьеду никак, а генератор для приёмника на 7.2мгц надо.
Пока сам себя не пнёшь с места не сдвинешься
- yura860
- Вымогатель припоя
- Сообщения: 699
- Зарегистрирован: Вс сен 08, 2013 21:36:22
- Откуда: 27.200 Мгц
Re: DDS генератор на AD9833
Вот код который непроходит проверку в ардуиновской проге, может кто знает что не так?
- Вложения
-
- скетч_.txt
- (3.69 КБ) 658 скачиваний
Пока сам себя не пнёшь с места не сдвинешься
Re: DDS генератор на AD9833
Всем здравствуйте! Есть проблема с микросхемой AD9833. Программирую ее с помощью STM32F030K6t6. Проверьте пожалуйста код, может найдете какие то ошибки. А то уже месяц как не могу ее пустить. Спасибо!
Код отправки по SPI:
SPI_Config();
AD9833_reset();
delay(400);
GPIO_ResetBits(GPIOA,GPIO_Pin_3);
delay(800);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET){}
SPI_I2S_SendData(0x21);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
SPI_I2S_SendData(0x00);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
GPIO_SetBits(GPIOA,GPIO_Pin_3);
GPIO_ResetBits(GPIOA,GPIO_Pin_3);
delay(800);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET){}
SPI_I2S_SendData(0x4f);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
SPI_I2S_SendData(0x34);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
GPIO_SetBits(GPIOA,GPIO_Pin_3);
GPIO_ResetBits(GPIOA,GPIO_Pin_3);
delay(800);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET){}
SPI_I2S_SendData(0x40);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
SPI_I2S_SendData(0x00);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
GPIO_SetBits(GPIOA,GPIO_Pin_3);
GPIO_ResetBits(GPIOA,GPIO_Pin_3);
delay(800);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET){}
SPI_I2S_SendData(0xc0);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
SPI_I2S_SendData(0x00);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
GPIO_SetBits(GPIOA,GPIO_Pin_3);
GPIO_ResetBits(GPIOA,GPIO_Pin_3);
delay(800);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET){}
SPI_I2S_SendData(0x20);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
SPI_I2S_SendData(0x00);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
GPIO_SetBits(GPIOA,GPIO_Pin_3);
while(1)
{
}
Инициализация SPI:
static void SPI_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOB, GPIO_Pin_3, GPIO_AF_0);
GPIO_PinAFConfig(GPIOB, GPIO_Pin_5, GPIO_AF_0);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;
/* SPI SCK pin configuration */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* SPI MOSi pin configuration */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* SPI configuration ----------*/
SPI_I2S_DeInit(SPI1);
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_NSSInternalSoftwareConfig(SPI1, SPI_NSSInternalSoft_Reset);
SPI_Init(SPI1, &SPI_InitStructure);
SPI_Cmd(SPI1, ENABLE);
}
Подпрограмма отправки данных:
void SPI_I2S_SendData(uint16_t Data)
{
SPI1->DR = (uint16_t)Data;
}
Кто может, скиньте ее обвязку, может там ошибка. Спасибо большое!!
Код отправки по SPI:
SPI_Config();
AD9833_reset();
delay(400);
GPIO_ResetBits(GPIOA,GPIO_Pin_3);
delay(800);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET){}
SPI_I2S_SendData(0x21);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
SPI_I2S_SendData(0x00);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
GPIO_SetBits(GPIOA,GPIO_Pin_3);
GPIO_ResetBits(GPIOA,GPIO_Pin_3);
delay(800);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET){}
SPI_I2S_SendData(0x4f);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
SPI_I2S_SendData(0x34);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
GPIO_SetBits(GPIOA,GPIO_Pin_3);
GPIO_ResetBits(GPIOA,GPIO_Pin_3);
delay(800);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET){}
SPI_I2S_SendData(0x40);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
SPI_I2S_SendData(0x00);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
GPIO_SetBits(GPIOA,GPIO_Pin_3);
GPIO_ResetBits(GPIOA,GPIO_Pin_3);
delay(800);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET){}
SPI_I2S_SendData(0xc0);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
SPI_I2S_SendData(0x00);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
GPIO_SetBits(GPIOA,GPIO_Pin_3);
GPIO_ResetBits(GPIOA,GPIO_Pin_3);
delay(800);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET){}
SPI_I2S_SendData(0x20);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
SPI_I2S_SendData(0x00);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
GPIO_SetBits(GPIOA,GPIO_Pin_3);
while(1)
{
}
Инициализация SPI:
static void SPI_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOB, GPIO_Pin_3, GPIO_AF_0);
GPIO_PinAFConfig(GPIOB, GPIO_Pin_5, GPIO_AF_0);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;
/* SPI SCK pin configuration */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* SPI MOSi pin configuration */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* SPI configuration ----------*/
SPI_I2S_DeInit(SPI1);
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_NSSInternalSoftwareConfig(SPI1, SPI_NSSInternalSoft_Reset);
SPI_Init(SPI1, &SPI_InitStructure);
SPI_Cmd(SPI1, ENABLE);
}
Подпрограмма отправки данных:
void SPI_I2S_SendData(uint16_t Data)
{
SPI1->DR = (uint16_t)Data;
}
Кто может, скиньте ее обвязку, может там ошибка. Спасибо большое!!
-
from_brest
- Родился
- Сообщения: 6
- Зарегистрирован: Чт май 17, 2012 21:12:33
Re: DDS генератор на AD9833
Всем привет. Хочу собрать на AD9833 и atmega функциональный генератор с возможностью цифровой/программной регулировки амплитуды выходного сигнала. В обсуждаемом устройстве это все реализовано, единственно, мне не нужно два отдельных выхода, а хотелось бы один выход на котором в зависимости режима выводились синус/треугольник/меандр. Так же чтобы границы амплитуды меандра были от 0 до 2в.
Не подскажите можно ли это реализовать на основе представленной схемы, и какие модификации нужно внести?
Не подскажите можно ли это реализовать на основе представленной схемы, и какие модификации нужно внести?
Re: DDS генератор на AD9833
в режимах sine, triangle и square d строка частоты отображается в виде X.XXX. Hz, т.е. нет последних 3 цифр. Откатился на предыдущую версию, там всё нормально.
Таки да, есть такая ошибка, спасибо dm73, он настоял в проверке кода. Исправления внизу.В режиме OUT D не отображаются десятые и сотые напряжения на выходе, на их месте стоит буква V (вер.22), в версии 2.0 все нормально, но нет PWM
- Вложения
-
- мой проект DDS генератор на AD9833_22.zip
- исправленная версия AD9833_v22
- (42.04 КБ) 1044 скачивания
-
pdv1965
- Потрогал лапой паяльник
- Сообщения: 359
- Зарегистрирован: Пт ноя 26, 2010 09:59:12
- Откуда: Мариуполь Украина
Re: DDS генератор на AD9833
Добрый день.
На последней прошивке вообще ничего не работает (экран не светится, на ножках процессора тишина)
На последней прошивке вообще ничего не работает (экран не светится, на ножках процессора тишина)
Re: DDS генератор на AD9833
А на других прошивках работало? Я прошил 2 прибора последней прошивкой - все работает
-
pdv1965
- Потрогал лапой паяльник
- Сообщения: 359
- Зарегистрирован: Пт ноя 26, 2010 09:59:12
- Откуда: Мариуполь Украина
Re: DDS генератор на AD9833
На старой прошивка работает.
Re: DDS генератор на AD9833
[uquote="grott",url="/forum/viewtopic.php?p=3123493#p3123493"][quote]Таки да, есть такая ошибка, спасибо dm73, он настоял в проверке кода. Исправления внизу.[/uquote]
В последней прошивке в режиме PWM теперь присутствуют все знаки частоты, но выше 10 кГц все равно выставить не получается.
Добавлено after 1 hour 44 minutes 55 seconds:
И еще можно ввести регулировку контрастности дисплея, а то при значении 70 малый угол обзора получается (для себя подобрал 60 - идеально). Спасибо!
В последней прошивке в режиме PWM теперь присутствуют все знаки частоты, но выше 10 кГц все равно выставить не получается.
Добавлено after 1 hour 44 minutes 55 seconds:
И еще можно ввести регулировку контрастности дисплея, а то при значении 70 малый угол обзора получается (для себя подобрал 60 - идеально). Спасибо!
Re: DDS генератор на AD9833
10 кГц в режиме PWM - это максимум, что можно было выжать (ну почти), не трогая основной алгоритм, ведь этот режим дописывался позже. Надо было, чтобы не возникали вопросы, всё-таки убрать незначащие нули. Контрастность и яркость дисплея регулируется из меню настройки, в которое можно войти долгим нажатием на кнопку.
-
pdv1965
- Потрогал лапой паяльник
- Сообщения: 359
- Зарегистрирован: Пт ноя 26, 2010 09:59:12
- Откуда: Мариуполь Украина
Re: DDS генератор на AD9833
Добрый вечер. Залил я последнюю прошивку (было русское название в пути поэтому не хотела заливаться). Захожу в меню настройки , выставляю контрастность и яркость, выхожу, выключаю питание. Включаю а все настройки пришли к начальным. Он что не запоминает уровни? Спасибо.
Re: DDS генератор на AD9833
Сохранение настроек в данной конструкции происходит по прерыванию от аналогового компаратора после выключения питания за счёт медленного разряда накопленной ёмкости входного конденсатора на входе по питанию. Поэтому С7 номиналом 1000мкФ нельзя занижать, проверьте его.
-
pdv1965
- Потрогал лапой паяльник
- Сообщения: 359
- Зарегистрирован: Пт ноя 26, 2010 09:59:12
- Откуда: Мариуполь Украина
Re: DDS генератор на AD9833
Ха я собрал только то что касается процессора а остальное еще не паял. Спасибо .
-
pdv1965
- Потрогал лапой паяльник
- Сообщения: 359
- Зарегистрирован: Пт ноя 26, 2010 09:59:12
- Откуда: Мариуполь Украина
Re: DDS генератор на AD9833
Дособирал. Прошивка последняя. Меандр есть а синуса и треугольника нет (на AD 9833 уже нет). Синус появился а вот через ключ не проходит.
-
pdv1965
- Потрогал лапой паяльник
- Сообщения: 359
- Зарегистрирован: Пт ноя 26, 2010 09:59:12
- Откуда: Мариуполь Украина
Re: DDS генератор на AD9833
Соплю убрал. Все заработало. Спасибо автору.
Re: DDS генератор на AD9833
Нормально так получилось,ох морда очень знакома.
Как аппарат по работе?
Как аппарат по работе?
-
pdv1965
- Потрогал лапой паяльник
- Сообщения: 359
- Зарегистрирован: Пт ноя 26, 2010 09:59:12
- Откуда: Мариуполь Украина
Re: DDS генератор на AD9833
Делал ради того чтобы он был. Пользуюсь редко. Меню немного замороченное(если редко пользоваться) Морда аля Леонид Иванович
-
leo476
- Первый раз сказал Мяу!
- Сообщения: 24
- Зарегистрирован: Ср ноя 27, 2013 20:56:03
- Откуда: Екатеринбург
Re: DDS генератор на AD9833
Уважаемый grott.
Заинтересовал ваш проект. Хочу его собрать, но мобильную версию с питанием от аккумулятора.
В связи с этим есть к вам ,большая просьба доработать прошивку согласно приложенной схеме, если вас не затруднит и есть возможность.
Доработки:
1.Вывести на дисплей индикатор степени зарядки аккумулятора.
2.Включение длительным нажатием кнопки S1.
3.Выключение длительным нажатием кнопки S1.
4.При разрядке аккумулятора до 3.0 вольт отключать прибор и не давать его включать, пока напряжение на аккумуляторе не увеличится (защита от переразряда).
Схему питания от аккумулятора позаимствовал из проекта viewtopic.php?f=59&t=134144 V3.0
Заинтересовал ваш проект. Хочу его собрать, но мобильную версию с питанием от аккумулятора.
В связи с этим есть к вам ,большая просьба доработать прошивку согласно приложенной схеме, если вас не затруднит и есть возможность.
Доработки:
1.Вывести на дисплей индикатор степени зарядки аккумулятора.
2.Включение длительным нажатием кнопки S1.
3.Выключение длительным нажатием кнопки S1.
4.При разрядке аккумулятора до 3.0 вольт отключать прибор и не давать его включать, пока напряжение на аккумуляторе не увеличится (защита от переразряда).
Схему питания от аккумулятора позаимствовал из проекта viewtopic.php?f=59&t=134144 V3.0
- Вложения
-
- DDS_4.zip
- (27.02 КБ) 671 скачивание
Re: DDS генератор на AD9833
Собрал прибор, настройка не потребовалась, заработал сразу. Спасибо автору за подробные пояснения.
Очень простое и удобное управление, но у меня получилось бяка с энкодером, плюс в лево, минус в право.
Было бы здорово иметь пунктик в меню для выбора направления под разные энкодеры.
Очень простое и удобное управление, но у меня получилось бяка с энкодером, плюс в лево, минус в право.
Было бы здорово иметь пунктик в меню для выбора направления под разные энкодеры.