Программирование STM8

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Программирование STM8

Сообщение oleg110592 »

ugashet писал(а):по измерению длительности внешнего импульса, прерывание по захвату

попробуйте с SPL (в примерах есть папка "TIM1_Input_Capture"), если заработает - можно будет сделать проект без SPL.
vash_sa
Открыл глаза
Сообщения: 50
Зарегистрирован: Чт сен 04, 2014 13:22:44

Re: Программирование STM8

Сообщение vash_sa »

Спасибо за очень содержательное обсуждение. Как говорится, в споре рождается истина. А начинающим, таким как я, эта информация очень полезна.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: Программирование STM8

Сообщение a5021 »

Alexeyslav писал(а):... который следует со скоростью 2048Кбит/сек. Иначе нужный звук не закодировать!

Не понял, о чем речь. Кто следует со скоростью 2мбит? Какой звук требует для кодирования 2мбит?

У вас какая-то каша в голове с этими битами и байтами.

Вы можете как-то развернуть эту вашу мысль? В представленном виде она больше похожа на голословное обвинение.

Частота ШИМа должна быть равна частоте, с которой происходила дискретизация (оцифровка), т.е. для нашего случая -- это 8 килогерц. Длительность импульса должна меняться каждый период. В этом случае восстановление исходного сигнала будет происходить с максимально-возможной для данного способа достоверностью. Все эти 62.5кгц и прочие немыслимые частоты, которые, якобы, удобнее фильтровать, исключительно от непонимания механизма использования ШИМа в качестве ЦАПа.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Программирование STM8

Сообщение oleg110592 »

По шиму и звуку через него.
У Microchip есть аппнота AN643, похожая задача там решается:
Speech regeneration is accomplished by using a Capture/Compare/PWM (CCP) module of the PIC18F67J10. The PWM module is configured for a
period of 16 kHz. This allows each sample of the speech signal to be output for two PWM periods for an oscillator frequency of 32 MHz.
...
A PWM duty cycle with close to 10 bits of resolution may be used with a period of 16 kHz. The upper 9 bits of each speech sample are used to set the
PWM duty cycle (CCPR1L = sample<15:9>, CCP1CON<5:4> = sample<8:7>). This PWM speech signal is passed through a 4th order Butterworth low-pass filter with a corner frequency of 4 kHz. The low-pass filter converts the PWM into an analog voltage level. Finally, the analog voltage level is amplified by a National Semiconductor LM4853 before entering the speaker.
Every 125 μs (8 kHz), one ADPCM code must be converted into a speech sample for output to the PWM. This frame of 125 μs relates to 1000 instruction cycles for an internal 8 MHz oscillator with PLL enabled for a frequency of 32 MHz (125 nS). The ADPCM decode routine, Flash program memory reads, conversion of binary to ASCII and writes to the PWM must be accomplished within 1000 instruction cycles.
• Hardware used:
- CCP1 configured for PWM (9-bit duty cycle, 32 kHz period speech output)
- Timer2 to set the 8.0 kHz output sample rate
- 59527 bytes of program memory to store compressed voice data files

Здесь частота шима одна (по возможности максимальна), звук в шим подается каждые 125мкс.
Kinder_Surprise
Открыл глаза
Сообщения: 49
Зарегистрирован: Вс июн 07, 2015 20:45:22

Re: Программирование STM8

Сообщение Kinder_Surprise »

Для STM8 и STM32 можно безболезнено поднять частоту сэмплирования. На ресурсах это никак не отразится. Зато заметно упростится выходной фильтр. Гурманы ещё могут заюзать между сэмплами промежуточные значения, что будет равносильно цифровому фильтру.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: Программирование STM8

Сообщение a5021 »

oleg110592 писал(а):Здесь частота шима одна (по возможности максимальна)

Поясните мысль, почему она должна быть "по возможности максимальна" ?

Kinder_Surprise писал(а):Для STM8 и STM32 можно безболезнено поднять частоту сэмплирования

STM32 сюда примешивать не надо, а вот насчет "безболезненно поднять" я бы не был столь оптимистичен. Семплирование ведется тем же камнем в то же самое время.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Программирование STM8

Сообщение oleg110592 »

говорилось уже - частота шим максимальна=проще фильтрация.
Тут например вообще фильтра нет:
http://elm-chan.org/works/sd8p/report.html
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: Программирование STM8

Сообщение a5021 »

oleg110592 писал(а):Тут например вообще фильтра нет:
http://elm-chan.org/works/sd8p/report.html

Невнимательно читаете: "When connect the audio outputs to the amplifier, the high frequency component must be filtered out with LPF." Кроме того, там предусматривается воспроизведение 48кгц семплов.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Программирование STM8

Сообщение oleg110592 »

Все схемки прямо на динамик. http://elm-chan.org/works/sd8p/rc/sd8p_mo.png
When connect the audio outputs to the amplifier

Для усилителя фильтр по любому нужен.
Кроме того, там предусматривается воспроизведение 8кгц семплов. Частота шима остается высокой всегда.
Kinder_Surprise
Открыл глаза
Сообщения: 49
Зарегистрирован: Вс июн 07, 2015 20:45:22

Re: Программирование STM8

Сообщение Kinder_Surprise »

a5021 писал(а):STM32 сюда примешивать не надо, а вот насчет "безболезненно поднять" я бы не был столь оптимистичен. Семплирование ведется тем же камнем в то же самое время.

Без разницы. Просто нужно изучить таймера. 8000 легко задирается до 2048000, при неизменном количестве прерываний. Сигнал на выходе будет тот же, но фильтрация упростится.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: Программирование STM8

Сообщение a5021 »

Куда-куда у вас там что-то задирается? Объяснитесь более членораздельно. 8000 это 8кгц? Вы собираетесь их "задрать" до 2048 кгц?
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

Re: Программирование STM8

Сообщение Alexeyslav »

Что тут непонятного? Мы имеем с АЦП выход 8бит на 8Ксемплов/сек илого поток у нас получается 8*8К = 64Кбит/сек
Этот поток поступает на ШИМ и разворачивается в поток 256*8К = 1 бит * 2048Ксемплов, нам же 8 бит надо развернуть? А значит период сигнала ШИМ будет иметь ширину в 256 тактов. От математики не спрячешься.
2048К - это необходимая частота тактирования ШИМ, чтобы мы могли получить поток 8Ксемплов при 8 битах.

Вернемся к нашим баранам 8K семплам. Как выглядит воспроизведение тишины на таком ШИМ-е? Тишина, это условный ноль - имеет код 127, на выходе ШИМ имеем меандр частотой 8кГц который прекрасно воспроизводится нашим динамиком.
Ладно, ставим обычный RC(или LC)-фильтр с частотой среза 4кГц. тут математика нам говорит что составляющая частота в 8кГц будет подавлена всего на 6дб, это примерно в 2-3 раза. Не густо, динамик наш все еще будет пищать!
Нужно городить для этого фильтр хотябы 3-го порядка и выше - это будет ослабление на 18дб, или примерно в 10 раз - в принципе жить можно но противный писк с динамика будет донимать. Но тут еще проблема в чем, простой пассивный фильтр 3-го порядка будет сильно просаживать и полезный сигнал.
В итоге что имеем, сэкономили на частоте и пустили ШИМ на 8кГц, чтобы избавится от основной частоты ШИМ нам нужна усложненная схемотехника и прочие проблемы.
А теперь финт ушами - берем частоту ШИМ 16кГц - всего в 2 раза больше, это совсем понты ведь.
Применяя фильтр 1-го порядка имеем подавление несущей уже 12дб, а с фильтром 3-го порядка и вовсе 36дБ. Но даже этого мало, писк будет слышно как комариный...
Но если взять частоту семплирования в 32кгц, то уже простыми фильтрами легко свести основную частоту ШИМ до уровня шума. Всего лишь фильтром 3-го порядка, на парочке операционников. Но можно и не делать этого - 32кГц даже если и усилится ты их не услышишь, да и динамик уже начнет выступать в роли пассивного фильтра НЧ для этой частоты т.е. еще плюс 6дб а может и все 12дб.
Kinder_Surprise
Открыл глаза
Сообщения: 49
Зарегистрирован: Вс июн 07, 2015 20:45:22

Re: Программирование STM8

Сообщение Kinder_Surprise »

Alexeyslav писал(а):Что тут непонятного? Мы имеем с АЦП выход 8бит на 8Ксемплов/сек илого поток у нас получается 8*8К = 64Кбит/сек
Этот поток поступает на ШИМ и разворачивается в поток 256*8К = 1 бит * 2048Ксемплов, нам же 8 бит надо развернуть? А значит период сигнала ШИМ будет иметь ширину в 256 тактов. От математики не спрячешься.
2048К - это необходимая частота тактирования ШИМ, чтобы мы могли получить поток 8Ксемплов при 8 битах.

Совершенно верно! 2048К отфильтруется играючись, при отсутствии дополнительных затрат по железу и софту.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: Программирование STM8

Сообщение a5021 »

Что за ерунда? Какие еще фильтрующиеся 2048к, если это частота тактирования таймера? Вашу фразу "просто нужно изучить таймера" нужно понимать, как адресованную самому себе?

Alexeyslav писал(а):Что тут непонятного? Мы имеем с АЦП выход 8бит на 8Ксемплов/сек илого поток у нас получается 8*8К = 64Кбит/сек

Еще раз повторюсь, биты с байтами не путайте. Битовые скорости принято считать при последовательной передаче. Я последовательной передачи не вижу с момента подачи аналогового сигнала на вход, до момента выхода его же на динамик.

Этот поток поступает на ШИМ и разворачивается в поток 256*8К = 1 бит * 2048Ксемплов, нам же 8 бит надо развернуть?

Никак однобитный преобразователь нашелся? А ведь еще вчера за подобное вы совсем плохо обо мне отзывались.

А значит период сигнала ШИМ будет иметь ширину в 256 тактов.

Период имеет размерность в единицах времени. Фактически, засунув свой байт в регистр сравнения, вы осуществили преобразование информации из цифрового вида в другую форму. С этого момента больше никаких ни битов, ни байтов не существует. Сначала возникает импульс дискретной длительности, который потом на интеграторе превращается в напряжение, опять же, определенной величины.

2048К - это необходимая частота тактирования ШИМ, чтобы мы могли получить поток 8Ксемплов при 8 битах.

Опять двадцать пять. Вы этими 2048к уже некоторых запутали так, что они их фильтровать собрались. Давайте я вам такой же шим чисто аналоговым способом создам. Как там биты будем считать?

Но если взять частоту семплирования в 32кгц

Повышая частоты, повышаются накладные расходы на вызов прерываний. Вход в прерывание и выход из него, суммарно обходятся в ~20 (не помню до единиц точно) тактов процессора. Для 8кгц это оборачивается в 1% всего процессорного времени. Это время, в течении которого полезных действий не производится с точки зрения алгоритма. Для 32к потери составят уже 4%. Это только вход и выход. Еще в самом прерывание наверняка отыщется сигналинг и прочий сервис, который сожрет еще фиг знает сколько. Не самое лучшее расходование производительности для и так не особо мощного камня. Я, например, изначально без особого оптимизма смотрю на возможность выполнения задачи посредством стм8. Это при жесткой экономии ресурсов. Когда же предлагают растянуть гармонь пошире, только потому, что так фильтровать удобнее, оптимизма во мне становится еще меньше.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Программирование STM8

Сообщение oleg110592 »

чтоб не было накладных расходов на вызов прерываний, есть способ, называется ресемплинг ("8000 легко задирается до 2048000"(c)).
Лет десять назад тут обсуждалось, еще для PIC микроконтроллеров: http://www.microchip.ru/phorum/read.php ... 66&t=39566
Это несет накладные расходы по дополнительной загрузке микроконтроллера.
В принципе для нашей задачи это не нужно - при частоте шима 62.5Кгц и частоте семплирования 8КГц будет хороший звук. Высокая частота шима не требует ни каких затрат микроконтроллерного времени. Единственное что понадобится - это два таймера (этого добра у стм8 хватает). За счет высокой частоты шима меньше накладных расходов на фильтрацию (повторяюсь).
Напомню - цель у человека, затронувшего этот вопрос, отнюдь не создание высококачественного усилителя класса D на микроконтроллере, а просто научится. Чем то мы уже помогли, раз спасибо сказал.
Kinder_Surprise
Открыл глаза
Сообщения: 49
Зарегистрирован: Вс июн 07, 2015 20:45:22

Re: Программирование STM8

Сообщение Kinder_Surprise »

Всё уже украдено до нас! Просто не все это знают и что-то там пишут, пишут. А второй таймер зачем? ШИМить ШИМ? Типа цифровой регулятор громкости? IgorV такое проделывал.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Программирование STM8

Сообщение oleg110592 »

тут у нас далеко идущие планы :) - семплы, сохраненные в буфере, нужно будет еще выпихивать в эзернет. Таймеры - на одном чисто шим, второй отсчитывает интервалы для семплирования 125мкс (8КГц). Можно и на одном сделать - так проще для понимания.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: Программирование STM8

Сообщение a5021 »

На одном не проще. Я про второй таймер сообразил без всяких статей 2005-го года. Просто жалко было под такую фигню его отдавать. Теперь же вижу, что 8кгц таймер будет основным диспетчером всего. Он будет запускать цифровку и подбирать результаты, отправлять байты в сеть и кормить таймер, заправляющий шимом. Не понятно, правда, что с приемом делать. Прием, скорее всего, будет асинхронным.
Kinder_Surprise
Открыл глаза
Сообщения: 49
Зарегистрирован: Вс июн 07, 2015 20:45:22

Re: Программирование STM8

Сообщение Kinder_Surprise »

oleg110592 писал(а):Можно и на одном сделать

На одном самое оптимально будет, там второй и даром не впёрся. ШИМить и запускать ADC можно и в одном прерывании, по переполнению. Даже при частоте ШИМа 2048К. Забирать результат ADC в другом прерывании, от ADC. Итого на всё - 2-3% времени.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: Программирование STM8

Сообщение a5021 »

Сюрприз, вы не хотите все-таки таймеры подучить? Какой шим на два мегагерца, а ?
Ответить

Вернуться в «Разные вопросы по МК»