Функция analogWrite()

arduino-logo

Описание функции analogWrite

Генерирует прямоугольные импульсы с постоянной частотой и указанной шириной импульса.

В таблице 1 указаны пины для некоторых плат, которые поддерживают широтно-импульсную модуляцию.

ПлатаКонтакты платы, поддерживающие ШИМЧастота ШИМ
Uno, Nano, Mini3, 5, 6, 9, 10, 11490 Гц (пин 5 и 6: 980 Гц)
Mega2 — 13, 44 — 46490 Гц (пины 4 и 13: 980 Гц)
Leonardo, Micro, Yún3, 5, 6, 9, 10, 11, 13490 Гц (пины 3 и 11: 980 Гц)
Uno WiFi Rev.23, 5, 6, 9, 10976 Гц
MKR boards *0 — 8, 10, A3 (18), A4 (19)732 Гц
MKR1000 WiFi *0 — 8, 10, 11, A3 (18), A4 (19)732 Гц
Zero3 — 13, A0 (14), A1 (15)732 Гц
Due2-131000 Гц
Таблица 1. Пины, поддерживающие ШИМ

Синтаксис

analogWrite(pin, value) 

Параметры

  • pin — номер ввода/выводы.
  • value — значение от 0 до 255, которое задает ширину одного импульса. Если установить 0, то сигнал будет отсутствовать, 255 — сигнал будет присутствовать постоянно (как постоянное напряжение).

Что возвращает

Ничего

Пример использования функции analogWrite

Код, в котором будет считываться значение с потенциометра (диапазон от 0 до 1023) с помощью АЦП, преобразовываться в диапазон от 0 до 255 и выдавать ШИМ-волну на полевой транзистор, управляющий DC двигателем.

#define MOTOR 5             // Пин с поддержкой ШИМ для управления мотором
#define POT   A0            // Аналоговый пин, на который "посажен" потенциометр

void setup() {
  pinMode(MOTOR, OUTPUT);   // Настройка ввода/вывода на выход
  pinMode(POT, INPUT);      // Настройка аналогового ввода/вывода на вход
}

void loop() {
  uint16_t analogValue = analogRead(POT);             // Получаем значение c потенциометра
  analogValue = map(analogValue, 0, 1023, 0, 255);    // Масштабировать значение из дипазона от 0 до 1023 в дипазон от 0 до 255
  analogWrite(MOTOR, analogValue);                    // Задаем ширину импульса
}
Управление двигателем постоянного тока ШИМ-сигналом с Ардуино

Код функции analogWrite

(hardware/arduino/avr/cores/arduino/wiring_analog.c 1.8.10)

void analogWrite(uint8_t pin, int val)
{
	// We need to make sure the PWM output is enabled for those pins
	// that support it, as we turn it off when digitally reading or
	// writing with them.  Also, make sure the pin is in output mode
	// for consistenty with Wiring, which doesn't require a pinMode
	// call for the analog output pins.
	pinMode(pin, OUTPUT);
	if (val == 0)
	{
		digitalWrite(pin, LOW);
	}
	else if (val == 255)
	{
		digitalWrite(pin, HIGH);
	}
	else
	{
		switch(digitalPinToTimer(pin))
		{
			// XXX fix needed for atmega8
			#if defined(TCCR0) && defined(COM00) && !defined(__AVR_ATmega8__)
			case TIMER0A:
				// connect pwm to pin on timer 0
				sbi(TCCR0, COM00);
				OCR0 = val; // set pwm duty
				break;
			#endif

			#if defined(TCCR0A) && defined(COM0A1)
			case TIMER0A:
				// connect pwm to pin on timer 0, channel A
				sbi(TCCR0A, COM0A1);
				OCR0A = val; // set pwm duty
				break;
			#endif

			#if defined(TCCR0A) && defined(COM0B1)
			case TIMER0B:
				// connect pwm to pin on timer 0, channel B
				sbi(TCCR0A, COM0B1);
				OCR0B = val; // set pwm duty
				break;
			#endif

			#if defined(TCCR1A) && defined(COM1A1)
			case TIMER1A:
				// connect pwm to pin on timer 1, channel A
				sbi(TCCR1A, COM1A1);
				OCR1A = val; // set pwm duty
				break;
			#endif

			#if defined(TCCR1A) && defined(COM1B1)
			case TIMER1B:
				// connect pwm to pin on timer 1, channel B
				sbi(TCCR1A, COM1B1);
				OCR1B = val; // set pwm duty
				break;
			#endif

			#if defined(TCCR1A) && defined(COM1C1)
			case TIMER1C:
				// connect pwm to pin on timer 1, channel B
				sbi(TCCR1A, COM1C1);
				OCR1C = val; // set pwm duty
				break;
			#endif

			#if defined(TCCR2) && defined(COM21)
			case TIMER2:
				// connect pwm to pin on timer 2
				sbi(TCCR2, COM21);
				OCR2 = val; // set pwm duty
				break;
			#endif

			#if defined(TCCR2A) && defined(COM2A1)
			case TIMER2A:
				// connect pwm to pin on timer 2, channel A
				sbi(TCCR2A, COM2A1);
				OCR2A = val; // set pwm duty
				break;
			#endif

			#if defined(TCCR2A) && defined(COM2B1)
			case TIMER2B:
				// connect pwm to pin on timer 2, channel B
				sbi(TCCR2A, COM2B1);
				OCR2B = val; // set pwm duty
				break;
			#endif

			#if defined(TCCR3A) && defined(COM3A1)
			case TIMER3A:
				// connect pwm to pin on timer 3, channel A
				sbi(TCCR3A, COM3A1);
				OCR3A = val; // set pwm duty
				break;
			#endif

			#if defined(TCCR3A) && defined(COM3B1)
			case TIMER3B:
				// connect pwm to pin on timer 3, channel B
				sbi(TCCR3A, COM3B1);
				OCR3B = val; // set pwm duty
				break;
			#endif

			#if defined(TCCR3A) && defined(COM3C1)
			case TIMER3C:
				// connect pwm to pin on timer 3, channel C
				sbi(TCCR3A, COM3C1);
				OCR3C = val; // set pwm duty
				break;
			#endif

			#if defined(TCCR4A)
			case TIMER4A:
				//connect pwm to pin on timer 4, channel A
				sbi(TCCR4A, COM4A1);
				#if defined(COM4A0)		// only used on 32U4
				cbi(TCCR4A, COM4A0);
				#endif
				OCR4A = val;	// set pwm duty
				break;
			#endif
			
			#if defined(TCCR4A) && defined(COM4B1)
			case TIMER4B:
				// connect pwm to pin on timer 4, channel B
				sbi(TCCR4A, COM4B1);
				OCR4B = val; // set pwm duty
				break;
			#endif

			#if defined(TCCR4A) && defined(COM4C1)
			case TIMER4C:
				// connect pwm to pin on timer 4, channel C
				sbi(TCCR4A, COM4C1);
				OCR4C = val; // set pwm duty
				break;
			#endif
				
			#if defined(TCCR4C) && defined(COM4D1)
			case TIMER4D:				
				// connect pwm to pin on timer 4, channel D
				sbi(TCCR4C, COM4D1);
				#if defined(COM4D0)		// only used on 32U4
				cbi(TCCR4C, COM4D0);
				#endif
				OCR4D = val;	// set pwm duty
				break;
			#endif

							
			#if defined(TCCR5A) && defined(COM5A1)
			case TIMER5A:
				// connect pwm to pin on timer 5, channel A
				sbi(TCCR5A, COM5A1);
				OCR5A = val; // set pwm duty
				break;
			#endif

			#if defined(TCCR5A) && defined(COM5B1)
			case TIMER5B:
				// connect pwm to pin on timer 5, channel B
				sbi(TCCR5A, COM5B1);
				OCR5B = val; // set pwm duty
				break;
			#endif

			#if defined(TCCR5A) && defined(COM5C1)
			case TIMER5C:
				// connect pwm to pin on timer 5, channel C
				sbi(TCCR5A, COM5C1);
				OCR5C = val; // set pwm duty
				break;
			#endif

			case NOT_ON_TIMER:
			default:
				if (val < 128) {
					digitalWrite(pin, LOW);
				} else {
					digitalWrite(pin, HIGH);
				}
		}
	}
}

Загрузки

Где купить

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии