Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 01.08.2013, 10:30  
Flopix
Гражданин KAZUS.RU
 
Регистрация: 31.12.2010
Сообщений: 837
Сказал спасибо: 371
Сказали Спасибо 153 раз(а) в 113 сообщении(ях)
Flopix на пути к лучшему
По умолчанию Конфигурация SPI_I2S prescaler register STM32F40xx

Колупаю пример Audio_playback_and_record идущий с STM32F4Discovery и заметил что частота воспроизведения файлов заметно отличается от 44100 в меньшую сторону. Как физически замерить реальную частоту не придумал.

Вот что генерирует утилита STM32F4xx_Clock_Configuration_V1.1.0.xls

PHP код:
  *-----------------------------------------------------------------------------
  *        
I2S input clock(Hz)                    | 86000000
  
*                                               |
  *        
To achieve the following I2S config:   |
  *         - 
Master clock output (MCKO): OFF     |
  *         - 
Frame wide                16bit   |
  *         - 
Audio sampling freq (KHz) : 44,1    |
  *         - 
Error %                   : 0,0967  |
  *         - 
Prescaler Odd factor (ODD): 0       |
  *         - 
Linear prescaler (DIV)    : 2       |
  *----------------------------------------------------------------------------- 
Не пойму как тут получается частота 44100 да еще и с погрешностью 0,0967.

Согласно даташита если ODD = 0 то real divider value is = I2SDIV *2

86000000/256/(2*2) = 83984,375

Нужно еще делить на 2 канала или на 2 байта так как ширина потока данных 16 бит?
Ну и все равно погрешность получается достаточно большой 44100/41992,1875*100-100 = 5,02%.




А вот как рассчитывается значения делителя в функции I2S_Init

PHP код:
    tmp = (uint16_t)(((((i2sclk 256) * 10) / I2S_InitStruct-›I2S_AudioFreq)) + 5);
/* Remove the flatting point */
    
tmp tmp 10
/* Check the parity of the divider */
    
i2sodd = (uint16_t)(tmp & (uint16_t)0x0001);
   
    
/* Compute the i2sdiv prescaler */
    
i2sdiv = (uint16_t)((tmp i2sodd) / 2);
   
    
/* Get the Mask for the Odd bit (SPI_I2SPR[8]) register */
    
i2sodd = (uint16_t) (i2sodd ‹‹ 8); 
Тут рассчет понятный за исключением того что такое 5 в первой формуле??
В результате получаются те же
i2sdiv = 2
i2sodd = 0

В чем я не прав? Как мне подобрать наименьшую погрешность частоты на выходе учитывая что МК тактируется от внешнего кварца 8МГц?
Реклама:
Flopix вне форума  
Непрочитано 01.08.2013, 11:47  
niXto
Почётный гражданин KAZUS.RU
 
Аватар для niXto
 
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
niXto на пути к лучшему
По умолчанию Re: Конфигурация SPI_I2S prescaler register STM32F40xx


Последний раз редактировалось niXto; 01.08.2013 в 19:04.
niXto вне форума  
Сказали "Спасибо" niXto
Flopix (01.08.2013)
Непрочитано 01.08.2013, 12:55  
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
dosikus на пути к лучшему
По умолчанию Re: Конфигурация SPI_I2S prescaler register STM32F40xx

niXto, Отредактируй пожалуйста скриншот.
Не у всех мониторы 20" ...
__________________
Осторожно , злой кот
dosikus вне форума  
Непрочитано 01.08.2013, 14:19  
Flopix
Гражданин KAZUS.RU
 
Регистрация: 31.12.2010
Сообщений: 837
Сказал спасибо: 371
Сказали Спасибо 153 раз(а) в 113 сообщении(ях)
Flopix на пути к лучшему
По умолчанию Re: Конфигурация SPI_I2S prescaler register STM32F40xx

PHP код:
  *-----------------------------------------------------------------------------
  *        
I2S input clock(Hz)                    | 86000000
  
*                                               |
  *        
To achieve the following I2S config:   |
  *         - 
Master clock output (MCKO): OFF     |
  *         - 
Frame wide                16bit   |
  *         - 
Audio sampling freq (KHz) : 44,1    |
  *         - 
Error %                   : 0,0967  |
  *         - 
Prescaler Odd factor (ODD): 0       |
  *         - 
Linear prescaler (DIV)    : 2       |
  *----------------------------------------------------------------------------- 
- Master clock output (MCKO): OFF

When the master clock is disabled (MCKOE bit cleared):

FS = I2SxCLK / [(16*2)*((2*I2SDIV)+ODD))] when the channel frame is 16-bit wide

FS = 86000000 / [(16*2)*((2*2)+0))] = 86000000/128 = 671875

Что то я вообще запутался в расчетах
Flopix вне форума  
Непрочитано 01.08.2013, 15:00  
Flopix
Гражданин KAZUS.RU
 
Регистрация: 31.12.2010
Сообщений: 837
Сказал спасибо: 371
Сказали Спасибо 153 раз(а) в 113 сообщении(ях)
Flopix на пути к лучшему
По умолчанию Re: Конфигурация SPI_I2S prescaler register STM32F40xx

С такими настройками играет синхронно

PHP код:
  *-----------------------------------------------------------------------------
  *        
I2S input clock(Hz)                    | 45166700
  
*                                               |
  *        
To achieve the following I2S config:   |
  *         - 
Master clock output (MCKO): ON      |
  *         - 
Frame wide                16bit   |
  *         - 
Audio sampling freq (KHz) : 44.1    |
  *         - 
Error %                   : 0.0183  |
  *         - 
Prescaler Odd factor (ODD): 0       |
  *         - 
Linear prescaler (DIV)    : 2       |
  *----------------------------------------------------------------------------- 

When the master clock is generated (MCKOE in the SPI_I2SPR register is set):
FS = I2SxCLK / [(16*2)*((2*I2SDIV)+ODD)* 8 )] when the channel frame is 16-bit wide


FS = 45166700 / [(16*2)*((2*2)+0)* 8 )] = 45166700 / 1024 = 44108.10546875

Тут все сходится.

В первом варианте файл system_stm32f4xx.c возможно был сгенерирован с ошибками из за разделителя в виде запятой в системных настройках ОС.

Последний раз редактировалось Flopix; 01.08.2013 в 15:04.
Flopix вне форума  
Непрочитано 01.08.2013, 15:00  
niXto
Почётный гражданин KAZUS.RU
 
Аватар для niXto
 
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
niXto на пути к лучшему
По умолчанию Re: Конфигурация SPI_I2S prescaler register STM32F40xx

На 16 попробуйте разделить

dosikus, вечером с компа
niXto вне форума  
Непрочитано 01.08.2013, 15:09  
Flopix
Гражданин KAZUS.RU
 
Регистрация: 31.12.2010
Сообщений: 837
Сказал спасибо: 371
Сказали Спасибо 153 раз(а) в 113 сообщении(ях)
Flopix на пути к лучшему
По умолчанию Re: Конфигурация SPI_I2S prescaler register STM32F40xx

Следующие настройки идут с аудио примером от ST:

PHP код:
  *-----------------------------------------------------------------------------
  *        
I2S input clock(Hz)                    | 86000000
  
*                                               |
  *        
To achieve the following I2S config:   |
  *         - 
Master clock output (MCKO): ON      |
  *         - 
Frame wide                16bit   |
  *         - 
Audio sampling freq (KHz) : 48      |
  *         - 
Error %                   : 0.0186  |
  *         - 
Prescaler Odd factor (ODD): 0       |
  *         - 
Linear prescaler (DIV)    : 2       |
  *----------------------------------------------------------------------------- 
When the master clock is generated (MCKOE in the SPI_I2SPR register is set):
FS = I2SxCLK / [(16*2)*((2*I2SDIV)+ODD)* 8 )] when the channel frame is 16-bit wide

FS = I2SxCLK / [(16*2)*((2*2)+0)* 8 )] = 86000000 / 1024 = 83984.375

И где тут их Audio sampling freq (KHz) : 48 ??
Flopix вне форума  
Непрочитано 01.08.2013, 17:39  
Alecsej
Вид на жительство
 
Регистрация: 10.08.2005
Сообщений: 385
Сказал спасибо: 0
Сказали Спасибо 161 раз(а) в 140 сообщении(ях)
Alecsej на пути к лучшему
По умолчанию Re: Конфигурация SPI_I2S prescaler register STM32F40xx

Сообщение от Flopix Посмотреть сообщение
А вот как рассчитывается значения делителя в функции I2S_Init
PHP код:
tmp = (uint16_t)(((((i2sclk / 256) * 10) / I2S_InitStruct-›I2S_AudioFreq)) + 5);
/* Remove the flatting point */
tmp = tmp / 10;
/* Check the parity of the divider */
i2sodd = (uint16_t)(tmp & (uint16_t)0x0001);
/* Compute the i2sdiv prescaler */
i2sdiv = (uint16_t)((tmp - i2sodd) / 2);
/* Get the Mask for the Odd bit (SPI_I2SPR[8]) register */
i2sodd = (uint16_t) (i2sodd ‹‹ ;
Тут рассчет понятный за исключением того что такое 5 в первой формуле??
В результате получаются те же
i2sdiv = 2
i2sodd = 0
(86000000 / 256) *10 /44100 + 5 = 81
81/10 = 8
i2sdiv = 4
i2sodd = 0
Alecsej вне форума  
Непрочитано 01.08.2013, 18:03  
Alecsej
Вид на жительство
 
Регистрация: 10.08.2005
Сообщений: 385
Сказал спасибо: 0
Сказали Спасибо 161 раз(а) в 140 сообщении(ях)
Alecsej на пути к лучшему
По умолчанию Re: Конфигурация SPI_I2S prescaler register STM32F40xx

Сообщение от dosikus Посмотреть сообщение
niXto, Отредактируй пожалуйста скриншот.
Не у всех мониторы 20" ...
На 24 тоже нормально смотрится ...
Alecsej вне форума  
Непрочитано 01.08.2013, 18:12  
Alecsej
Вид на жительство
 
Регистрация: 10.08.2005
Сообщений: 385
Сказал спасибо: 0
Сказали Спасибо 161 раз(а) в 140 сообщении(ях)
Alecsej на пути к лучшему
По умолчанию Re: Конфигурация SPI_I2S prescaler register STM32F40xx

Цитата:
When the master clock is generated (MCKOE in the SPI_I2SPR register is set):
FS = I2SxCLK / [(16*2)*((2*I2SDIV)+ODD)* 8 )] when the channel frame is 16-bit wide

FS = I2SxCLK / [(16*2)*((2*2)+0)* 8 )] = 86000000 / 1024 = 83984.375

И где тут их Audio sampling freq (KHz) : 48 ??
86000000 / [(16*2)*((2*3)+1)*8] = 86000000 / 1792 = 47991.07
Alecsej вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оптимизация в AVR GCC alberio Микроконтроллеры, АЦП, память и т.д 45 02.03.2018 12:38
Как изменить адрес подпрограммы обработки прерывания? Godzilla82 Микроконтроллеры, АЦП, память и т.д 21 23.08.2010 09:52
Структура приложения? Djakovskij Микроконтроллеры, АЦП, память и т.д 13 17.04.2010 02:45
Помогите с ЦАП AD7708/AD7718 или их аналогами ST_Senya Микроконтроллеры, АЦП, память и т.д 9 30.11.2009 19:03


Часовой пояс GMT +4, время: 01:02.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot