Форум РадиоКот https://radiokot.ru/forum/ |
|
Внешний АЦП AD7091R https://radiokot.ru/forum/viewtopic.php?f=61&t=150570 |
Страница 1 из 2 |
Автор: | Бубоник [ Чт дек 07, 2017 12:59:52 ] |
Заголовок сообщения: | Re: Внешний АЦП AD7091R |
Код: #define AD7091_CONFIG 0x14C0 Откуда взяли значение 0x14C0?
|
Автор: | Бубоник [ Пт дек 08, 2017 14:23:00 ] |
Заголовок сообщения: | Re: Внешний АЦП AD7091R |
А где у вас записываются данные в конфигурационный регистр? |
Автор: | Aviator_93 [ Пт дек 08, 2017 16:36:31 ] |
Заголовок сообщения: | Re: Внешний АЦП AD7091R |
Бубоник писал(а): А где у вас записываются данные в конфигурационный регистр? Вот, в коде инициализации: Код: void AD7091_Init() { uint16_t result = 0x00; AD7091_Init_GPIO(); for(int i = 0; i < 0x42; i++) { GPIO_WriteBit(GPIOD, GPIO_Pin_14, Bit_RESET); GPIO_WriteBit(GPIOD, GPIO_Pin_14, Bit_SET); } AD7091_WtiteData(CONVERT_OFF, AD7091_CONFIG); AD7091_WtiteData(CONVERT_OFF, CH0_LO); AD7091_WtiteData(CONVERT_OFF, CH0_HI); AD7091_WtiteData(CONVERT_OFF, CH0_HY); AD7091_WtiteData(CONVERT_OFF, CH1_LO); AD7091_WtiteData(CONVERT_OFF, CH1_HI); AD7091_WtiteData(CONVERT_OFF, CH1_HY); result = AD7091_ReadData(0x800); result = AD7091_ReadData(0x1000); result = AD7091_ReadData(0x2000); result = AD7091_ReadData(0x2800); result = AD7091_ReadData(0x3000); result = AD7091_ReadData(0x3800); result = AD7091_ReadData(0x4000); result = AD7091_ReadData(0x4800); } Функцией AD7091_WtiteData(), самая первая запись |
Автор: | Бубоник [ Пт дек 08, 2017 19:21:19 ] |
Заголовок сообщения: | Re: Внешний АЦП AD7091R |
Если вот эта строка, Код: AD7091_WtiteData(CONVERT_OFF, AD7091_CONFIG); то желательно отправлять 0x16C0, так как в инициализации указанно про soft reset.Добавлено after 1 hour 33 minutes 41 second: И еще кое что. Код: result = AD7091_ReadData(0x800); Здесь случаем не должно ли быть значение 0x801?.
|
Автор: | Starichok51 [ Вс дек 10, 2017 06:59:58 ] |
Заголовок сообщения: | Re: Внешний АЦП AD7091R |
при подаче питание уже произошел reset. повторно его делать не надо. |
Автор: | Aviator_93 [ Вс дек 10, 2017 19:59:35 ] |
Заголовок сообщения: | Re: Внешний АЦП AD7091R |
Хоть убейте, не работает и все... |
Автор: | Бубоник [ Вс дек 10, 2017 20:21:35 ] |
Заголовок сообщения: | Re: Внешний АЦП AD7091R |
А какие он данные присылает после команды 0x800? |
Автор: | Aviator_93 [ Вт дек 12, 2017 17:34:44 ] | ||
Заголовок сообщения: | Re: Внешний АЦП AD7091R | ||
Бубоник писал(а): А какие он данные присылает после команды 0x800? Для начала, решил никаких данных не писать, а просто прочитать значения регистров. В таблице 10, есть колонка Default, вроде, это значения по дефолту, которые должны быть там... Вот что получилось: Код: //Channel result = AD7091_ReadData(0x800); //0 //Configuration result = AD7091_ReadData(0x1000); //192 //Channel 0 low limit result = AD7091_ReadData(0x2000); //0 //Channel 0 high limit result = AD7091_ReadData(0x2800); //4095 //Channel 0 hysteresis result = AD7091_ReadData(0x3000); //511 //Channel 1 low limit result = AD7091_ReadData(0x3800); //0 //Channel 1 high limit result = AD7091_ReadData(0x4000); //4095 //Channel 1 hysteresis result = AD7091_ReadData(0x4800); //511 Все совпадает со значениями по дефолту, кроме двух параметров: Channel 0 high limit и Channel 1 high limit... По дефолту должны быть значение 0x1FF, а он почему то отправляет 0xFFF... Дальше, записываем данные. По сути, я обновляю значение, только одного регистра, а именно: Configuration. А все остальные значения, дублирую по дефолту... Код: //---------- //Configuration AD7091_WtiteData(CONVERT_ON, 0x16C0); //Channel 0 low limit AD7091_WtiteData(CONVERT_ON, 0x2400); //Channel 0 high limit AD7091_WtiteData(CONVERT_ON, 0x2DFF); //Channel 0 hysteresis AD7091_WtiteData(CONVERT_ON, 0x35FF); //Channel 1 low limit AD7091_WtiteData(CONVERT_ON, 0x3C00); //Channel 1 high limit AD7091_WtiteData(CONVERT_ON, 0x45FF); //Channel 1 hysteresis AD7091_WtiteData(CONVERT_ON, 0x4DFF); //---------- //Channel result = AD7091_ReadData(0x800); //0 //Configuration result = AD7091_ReadData(0x1000); //192 //Channel 0 low limit result = AD7091_ReadData(0x2000); //0 //Channel 0 high limit result = AD7091_ReadData(0x2800); //4095 //Channel 0 hysteresis result = AD7091_ReadData(0x3000); //511 //Channel 1 low limit result = AD7091_ReadData(0x3800); //0 //Channel 1 high limit result = AD7091_ReadData(0x4000); //4095 //Channel 1 hysteresis result = AD7091_ReadData(0x4800); //511 //---------- И ничего не поменялось... Если я в Configuration записываю значение 0x16C0, то он в ответ на чтение присылает 192, а если записываю 0x16C3 - то 195
|
Автор: | Бубоник [ Вт дек 12, 2017 22:37:16 ] |
Заголовок сообщения: | Re: Внешний АЦП AD7091R |
Хотя с другой стороны посмотреть 4095 это и есть максимальное значение 12 АЦП. Вот он и присылает 0xFFF. Цитата: Если я в Configuration записываю значение 0x16C0, то он в ответ на чтение присылает 192 Если я правильно понял документацию флаг soft reset сбрасывается автоматически, вот он и возвращает значение 192. Пробуйте считывать данные, посмотрите что он будет выдавать.
|
Автор: | Бубоник [ Пт дек 15, 2017 17:06:51 ] |
Заголовок сообщения: | Re: Внешний АЦП AD7091R |
Че то он многовато присылает 8192. Spi протокол точно правильно работает? |
Автор: | Бубоник [ Сб дек 16, 2017 16:49:14 ] |
Заголовок сообщения: | Re: Внешний АЦП AD7091R |
Исходник можно в студию? |
Автор: | Aviator_93 [ Вс дек 17, 2017 22:58:07 ] |
Заголовок сообщения: | Re: Внешний АЦП AD7091R |
Бубоник писал(а): Исходник можно в студию? Код: #define AD7091_CONFIG 0x1600
#define CH0_LO 0x2400 #define CH0_HI 0x2DFF #define CH0_HY 0x35FF #define CH1_LO 0x3C00 #define CH1_HI 0x45FF #define CH1_HY 0x4DFF #define CONVERT_OFF 0x0000 #define CONVERT_ON 0x0001 uint16_t AD7091_WtiteData(int convert, uint16_t data) { uint16_t result = 0x0; if(convert == CONVERT_ON) { GPIO_WriteBit(GPIOD, GPIO_Pin_14, Bit_RESET); GPIO_WriteBit(GPIOD, GPIO_Pin_14, Bit_SET); } while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET); GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_RESET); SPI_I2S_SendData16(SPI1, data); while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); result = SPI_I2S_ReceiveData16(SPI1); GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_SET); return result; } uint16_t AD7091_ReadData(uint16_t data) { uint16_t result = 0x0; AD7091_WtiteData(CONVERT_ON, data); result = AD7091_WtiteData(CONVERT_OFF, 0x00); return result; } void AD7091_Init() { uint16_t result = 0x00; AD7091_Init_GPIO(); for(int i = 0; i < 0x42; i++) { GPIO_WriteBit(GPIOD, GPIO_Pin_14, Bit_RESET); GPIO_WriteBit(GPIOD, GPIO_Pin_14, Bit_SET); } AD7091_WtiteData(CONVERT_ON, AD7091_CONFIG); AD7091_WtiteData(CONVERT_ON, CH0_LO); AD7091_WtiteData(CONVERT_ON, CH0_HI); AD7091_WtiteData(CONVERT_ON, CH0_HY); AD7091_WtiteData(CONVERT_ON, CH1_LO); AD7091_WtiteData(CONVERT_ON, CH1_HI); AD7091_WtiteData(CONVERT_ON, CH1_HY); result = AD7091_ReadData(0x800); result = AD7091_ReadData(0x1000); result = AD7091_ReadData(0x2000); result = AD7091_ReadData(0x2800); result = AD7091_ReadData(0x3000); result = AD7091_ReadData(0x3800); result = AD7091_ReadData(0x4000); result = AD7091_ReadData(0x4800); } uint16_t AD7091_GetData() { uint16_t adc[4] = {0}; uint16_t result = 0x00, chn = 0x00; adc[0] = AD7091_WtiteData(CONVERT_ON, 0xC01); adc[1] = AD7091_WtiteData(CONVERT_ON, 0xC02); adc[2] = AD7091_WtiteData(CONVERT_ON, 0x000); adc[3] = AD7091_WtiteData(CONVERT_ON, 0x000); chn = adc[0] >> 13; result = adc[0] & 0xFFF; return result; } |
Автор: | Бубоник [ Чт дек 21, 2017 09:54:56 ] |
Заголовок сообщения: | Re: Внешний АЦП AD7091R |
Почему у вас на запись данных аналоговые входа включены а на чтение данных выключены? |
Автор: | Aviator_93 [ Чт дек 21, 2017 16:19:49 ] |
Заголовок сообщения: | Re: Внешний АЦП AD7091R |
Бубоник писал(а): Почему у вас на запись данных аналоговые входа включены а на чтение данных выключены? Что-то, я не очень понял понял о чем идет речь... Как вы определили, что на запись они включены, а на чтение они выключены? |
Автор: | Бубоник [ Чт дек 21, 2017 17:44:13 ] |
Заголовок сообщения: | Re: Внешний АЦП AD7091R |
Код: adc[0] = AD7091_WtiteData(CONVERT_ON, 0xC01); Вот здесь вы записываете данные в регистр аналоговых входов и тем самым включаете их.adc[1] = AD7091_WtiteData(CONVERT_ON, 0xC02); Код: result = AD7091_ReadData(0x800); А здесь вы пытаетесь считать данные с аналоговых входов, но они выключены.
result = AD7091_ReadData(0x1000); |
Автор: | Aviator_93 [ Чт дек 21, 2017 18:58:25 ] |
Заголовок сообщения: | Re: Внешний АЦП AD7091R |
Бубоник писал(а): Код: adc[0] = AD7091_WtiteData(CONVERT_ON, 0xC01); Вот здесь вы записываете данные в регистр аналоговых входов и тем самым включаете их.adc[1] = AD7091_WtiteData(CONVERT_ON, 0xC02); Код: result = AD7091_ReadData(0x800); А здесь вы пытаетесь считать данные с аналоговых входов, но они выключены.result = AD7091_ReadData(0x1000); Вы имеете, ввиду, что нет строба по линии CONVERT, когда производится чтение регистра? |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |