Как сделать синус в с

Обновлено: 30.06.2024

У многих учеников возникают проблемы с этой темой, в основном, из-за непонимания общего смысла тригонометрии. В этой статье я постараюсь помочь вам разобраться зачем нужна тригонометрия и расскажу про лайфхак, чтобы не учить значения синуса и косинуса.

К моменту начала изучения тригонометрии Вы, скорее всего, уже знаете: определение прямоугольного треугольника и окружности — этого вполне достаточно для понимания темы.

*прошу заметить, что некоторые формулировки могут не соответствовать действительности - это сделано для того, чтобы вы лучше запомнили основы. Точные понятия и определения расскажет ваш учитель математики.

Что такое синус и косинус?

Изначально не было никакой окружности. Изучая треугольники, древние ученые выражали углы через соотношение сторон. То-есть синусы и косинусы появились раньше градусной меры углов.

Поскольку угол может быть найден через разные соотношения сторон, решили дать им названия: синус и косинус.

Синус - это отношение стороны треугольника, лежащей напротив данного угла, к гипотенузе (большей стороне).

Косинус - это отношение прилежащей стороны к гипотенузе.

Думаю не ошибусь, если скажу, что теорема Пифагора - самая полезная теорема в геометрии. Давайте применим её для данного треугольника:

В одном из ранних уроков мы узнали, что при помощи ШИМ можно изменять скважность сигнала. Тем самым регулировали яркость свечения светодиода. Однако есть более интересный способ, использования широтно-импульсной модуляции.

pwm sin6

Итак… Если пропустить генерируемый сигнал через фильтр низких частот, то получится постоянное напряжение.

Так как скважность изменяется от 0 до 0xFF(255), значит у нас будет 255 уровней постоянного напряжения. Проще говоря, есть диапазон напряжения, допустим от 0 до 5В, этот диапазон разбивается на 255 значений. С шагом 5/255=0,0196В можно выставить любое напряжение.

Используя в определенном порядке эти значения, можно получить практически любую форму сигнала. Например, увеличивая заполнение от 0 до 255, а потом уменьшая от 255 до 0 получим пилообразный сигнал.

Теперь перейдем к конкретной цели: получить синусоиду с частотой 50Гц с помощью микроконтроллера Atmega8. Глобальная задача — выставлять через определенные промежутки времени напряжение на выходе ШИМ, по синусоидальному закону.

Разберемся с первой частью задачи. Для того, получить определенные промежутки времени воспользуемся таймером. Допустим таймер настроен на частоту 8МГц, т.е. он будет тикать 8000000 раз в секунду. Синусоида колеблется 50 раз в секунду, значит на один период может приходиться 8000000/50=160000 тиков максимум. Раз у нас 256 уровней напряжения, то и максимальное разрешение синусоиды будет равняться 256.

Что же такое разрешение синуса? В данном случае это количество точек за период по которым построена синусоида. Для примера я построил в Excel, то как будет выглядеть синусоида для разного разрешения.

Для синуса с разрешением 4:

pwm sin1

Для синуса с разрешением 8 точек:

pwm sin3

Для синуса с разрешением 16 точек:

pwm sin2

Теперь объединяем все сказанное ранее, 160000 тиков делим на разрешение 128 получаем 1250 — через столько тиков должно сработать прерывание, чтобы выставить следующий уровень напряжения. Значение 1250 нужно пихать в регистр сравнения OCR1A

Вторая часть глобальной задачи — как построить синусоиду. Вспомним математику :D… Синус изменяется от -1 до 1. ШИМом сгенерить отрицательное напряжение не получится. Поэтому нужно сместить график над осью Х — sin(x)+1. Теперь он будет изменяться от 0 до 2, тоже не вариант, т.к. у нас 256 значений напряжения, поэтому умножим на 127, чтобы максимальным было значение 256. В итоге откопал такую формулу:

excel_pwm

128 — разрешение синуса, х — номер точки по (от 0 до 128). Сосчитал в Excel, получился массив sin[] из 128 значений, которые по очереди подставляются в OCR2.

Файл прошивки и протеуса

71 комментарий: Урок 11. Получение синусоидального сигнала при помощи ШИМ

Здравствуйте admin on. Схему сразу же собрал, запустил начал пенять значения чтоб посмотреть что будет. С разрешением при замене ни чего не получилось. ICR1 менял по формуле тем самым повысил частоту аж до 32 кГц, но при этом пропала генерация на других ножках. Значение SET_FREQ = 410 тоже пересчитывал подставлял. сейчас значения которые ставил сказать не могу пишу с работы.

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

вы используете таймер 2, а он считает до 255 и обнуляется(в режиме фаст пвм), а нам надо 1250тиков, что то не клеится
и зачем записывать значение OCR1AH=0x04; OCR1AL=0xE2; ?
или я что то не понял?

чёто я вообще запутался в вашем коде, OCR2 это регистр сравнения второго таймера, а мы используем первый таймер
первый таймер вы вообще не настроили(до скольки он будет считать и тд)

Инверторы используются в случаях когда невозможно получить напряжение переменного тока (AC) из сети. Инверторы предназначены для преобразования напряжения постоянного тока (DC) в напряжение переменного тока (AC) и разделяются на два типа: чистые синусоидальные инверторы (Pure Sine Wave Inverters) и модифицированные прямоугольные инверторы (Modified Square Wave Inverters). Чистые синусоидальные инверторы достаточно дорого стоят, а модифицированные прямоугольные инверторы стоят существенно дешевле.

В этой статье мы рассмотрим создание чистого синусоидального инвертора (pure sine wave inverter) на основе платы Arduino.

Внешний вид чистого синусоидального инвертора на Arduino

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

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

Что такое синусоидальная ШИМ (SPWM)

SPWM расшифровывается как Sinusoidal Pulse Width Modulation и переводится как синусоидальная ШИМ (широтно-импульсная модуляция). Ранее мы ее уже рассматривали в генераторе синусоидальных и прямоугольных импульсов на Arduino.

Как мы знаем, в ШИМ мы можем изменять ее скважность (коэффициент занятости, duty cycle), то есть соотношение периодов активности (on-time) и неактивности (off-time). Таким образом, изменяя скважность ШИМ, мы изменяем среднее напряжение импульса. Это наглядно показано на следующей картинке.

Принцип ШИМ (широтно-импульсной модуляции)

Как видно из представленной картинки, при скважности (коэффициенте заполнения) 100% мы получаем среднее выходное напряжение 5V, при скважности 50% получаем среднее выходное напряжение 2.5V, а при скважности 25% - еще в 2 раза меньше.

Синусоидальное напряжение представляет собой аналоговое напряжение, которое изменяет свою амплитуду с течением времени, поэтому мы можем воспроизвести "поведение" синусоидальной волны при помощи непрерывного изменения скважности ШИМ волны (сигнала), что показано на следующем рисунке.

Принцип формирования синусоидальной волны при помощи непрерывного изменения скважности ШИМ сигнала

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

Используемый входной сигнал будет заряжать и разряжать конденсатор в соответствии с входным сигналом и нагрузкой. Мы будем использовать SPWM сигнал (синусоидальный ШИМ сигнал) высокой частоты, он будет иметь сначала очень маленькую скважность 1%, этот 1% будет заряжать конденсатор совсем чуть-чуть, сигнал со скважностью 5% будет заряжать конденсатор немного больше, скважность 10% будет заряжать конденсатор еще больше и постепенно мы достигнем скважности 100%, а после этого мы будем уменьшать скважность до 1%. С помощью этого процесса будет сформирована очень гладкая кривая, очень похожая на синусоидальную волну. Таким образом, обеспечивая правильные значения скважности на входе, мы получим хорошую синусоидальную волну на выходе.

Как работает инвертор на основе SPWM сигнала

Схема подобного инвертора показана на следующем рисунке.

Схема инвертора на основе SPWM сигнала

Как вы видите, мы использовали в схеме два MOSFET транзистора N-типа и полумост для управления трансформатором. Для уменьшения нежелательных шумов и защиты MOSFET транзисторов мы использовали два диода 1N5819, включенных параллельно MOSFET транзисторам. Для уменьшения возможных нежелательных импульсов, формируемых в секции управления, мы использовали резисторы сопротивлением 4.7 Ом, включенных параллельно диодам 1N4148. И, наконец, транзисторы BD139 и BD 140 включены по двухтактной схеме для управления затворами MOSFET транзисторов потому что MOSFET транзисторы имеют очень большое емкостное сопротивление затвора и требуют как минимум напряжения 10V на своем затворе чтобы работать корректно.

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

Протекание тока в прямом направлении в инверторе

В следующем цикле ток течет уже в обратном направлении и, следовательно, магнитный поток возникает в этом же самом направлении, поэтому направление магнитного потока в сердечнике трансформатора также изменяется (по сравнению с предыдущим рассмотренным случаем).

Протекание тока в обратном направлении в инверторе

То есть теперь мы знаем, что направление магнитного потока в трансформаторе изменяется. Таким образом, включая и выключая оба MOSFET транзистора (они инвертированы по отношению друг к другу) и осуществляя эти переключения 50 раз в секунду, мы будем формировать изменяющееся магнитное поле в сердечнике трансформатора, следовательно, будет изменяться направление тока во вторичной обмотке трансформатора в соответствии с законом Фараде. В этом и заключается основной принцип работы инвертора.

Теперь на следующем рисунке рассмотрим полную схему чистого синусоидального инвертора на основе платы Arduino.

Схема чистого синусоидального инвертора на основе платы Arduino

Как вы видите из представленной схемы, переключение циклов работы выше представленной схемы инвертора будет осуществляться с помощью двух цифровых контактов платы Arduino.

Конструкция проекта

В демонстрационных целях мы собрали схему нашего инвертора на стрипборде (Veroboard). На выходе трансформатора схемы будет протекать огромный ток, поэтому в этом месте коннекторы (соединители) необходимо использовать как можно толще.

Внешний вид чистого синусоидального инвертора на Arduino

Необходимые компоненты

Полный список компонентов, необходимых для сборки нашего инвертора, представлен в следующей таблице.

№ п/п Название Тип компонента Количество Где купить
1 Atmega328P микроконтроллер 1
2 IRFZ44N Mosfet транзистор 2 купить на AliExpress
3 BD139 транзистор 2 купить на AliExpress
4 BD140 транзистор 2 купить на AliExpress
5 22pF конденсатор 2 купить на AliExpress
6 10K,1% резистор 1 купить на AliExpress
7 16MHz кварцевый генератор 1 купить на AliExpress
8 0.1uF конденсатор 3 купить на AliExpress
9 4.7R резистор 2 купить на AliExpress
10 1N4148 диод 2 купить на AliExpress
11 LM7805 регулятор напряжения 1 купить на AliExpress
12 200uF,16V конденсатор 1 купить на AliExpress
13 47uF, 16V конденсатор 1 купить на AliExpress
14 2.2uF,400V конденсатор 1 купить на AliExpress

Внешний вид этих компонентов показан на следующем рисунке.

Внешний вид компонентов для сборки инвертора

Объяснение программы для Arduino

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.

Прежде чем переходить непосредственно к программе давайте вспомним основы формирования необходимого нам сигнала. Как выглядит изменяющийся во времени ШИМ сигнал мы изучили в первой части нашей статьи, здесь же стоит проблема как сформировать подобный сигнал с помощью платы Arduino.

Для формирования изменяющего во времени ШИМ сигнала мы будем использовать 16-битный timer1 с коэффициентом деления предделителя равным 1, что обеспечит нам время 1600/16000000 = 0.1ms на каждую единицу счета таймера (более подробно о таймерах Arduino можно прочитать в этой статье). То есть в нашем случае половина цикла нужной нам синусоидальной волны будет соответствовать 100 единицам счета таймера. Другими словами, мы можем разделить полный цикл нашей синусоидальной волны на 200 частей.

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

Функция SIN в Excel используется для вычисления синуса угла, заданного в радианах, и возвращает соответствующее значение.

Функция SINH в Excel возвращает значение гиперболического синуса заданного вещественного числа.

Функция COS в Excel вычисляет косинус угла, заданного в радианах, и возвращает соответствующее значение.

Функция COSH возвращает значение гиперболического косинуса заданного вещественного числа.

Примеры использования функций SIN, SINH, COS и COSH в Excel

Пример 1. Путешественник движется вверх на гору с уклоном в 17°. Скорость движения постоянная и составляет 4 км/ч. Определить, на какой высоте относительно начальной точке отсчета он окажется спустя 3 часа.

Пример 1.

Для решения используем формулу:

  • B2*B3 – произведение скорости на время пути, результатом которого является пройденное расстояние (гипотенуза прямоугольного треугольника);
  • SIN(РАДИАНЫ(B1)) – синус угла уклона, выраженного в радианах с помощью функции РАДИАНЫ.

В результате расчетов мы получили величину малого катета прямоугольного треугольника, который характеризует высоту подъема путешественника.

Таблица синусов и косинусов в Excel

Пример 2. Ранее в учебных заведениях широко использовались справочники тригонометрических функций. Как можно создать свой простой справочник с помощью Excel для косинусов углов от 0 до 90?

Заполним столбцы значениями углов в градусах:

Пример 2.

Для заполнения используем функцию COS как формулу массива. Пример заполнения первого столбца:

Вычислим значения для всех значений углов. Полученный результат:

COS РАДИАНЫ.

Примечание: известно, что cos(90°)=0, однако функция РАДИАНЫ(90) определяет значение радианов угла с некоторой погрешностью, поэтому для угла 90° было получено отличное от нуля значение.

Аналогичным способом создадим таблицу синусов в Excel:

создадим таблицу синусов.

Построение графика функций SINH и COSH в Excel

Пример 3. Построить графики функций sinh(x) и cosh(x) для одинаковых значений независимой переменной и сравнить их.

Пример 3.

Формула для нахождения синусов гиперболических:

нахождение синусов гиперболических.

Формула для нахождения косинусов гиперболических:

.

Таблица полученных значений:

COSH.

графики функций.

Как видно, графики совпадают на промежутке (0;+∞), а в области отрицательных значений x части графиков являются зеркальными отражениями друг друга.

Особенности использования тригонометрических функций в Excel

Синтаксис функции SIN:

Синтаксис функции SINH:

Синтаксис функции COS:

Синтаксис функции COSH:

Каждая из приведенных выше функций принимает единственный аргумент число, который характеризует угол, заданный в радианах (для SIN и COS) или любое значение из диапазона вещественных чисел, для которого требуется определить гиперболические синус или косинус (для SINH и COSH соответственно).

Читайте также: