Управление 4pin-вентилятором ШИМ 25 Khz
- Войдите на сайт для отправки комментариев
Чт, 16/03/2017 - 09:30
Возникла необходимость регулировки оборотов 4-х пинового вентилятора с помощью ардуино.
По даташиту http://www.formfactors.org/developer/specs/4_Wire_PWM_Spec.pdf
требуется ШИМ с частотой от 21 до 28 кГц.
Нашел пример получения 25 кГц https://forum.arduino.cc/index.php?topic=415167.0
Загрузил скетч :
01 | #include <Wire.h> |
02 |
03 | word VentPin = 3; |
04 |
05 | void setup () { |
06 | Wire.begin(); |
07 | pinMode(VentPin, OUTPUT); |
08 | pwm25kHzBegin(); |
09 | } |
10 |
11 | void loop () { |
12 |
13 | pwmDuty(19); // 25% (range = 0-79 = 1.25-100%) |
14 | delay(5000); |
15 | pwmDuty(39); // 50% (range = 0-79 = 1.25-100%) |
16 | delay (5000); |
17 | pwmDuty(59); // 75% (range = 0-79 = 1.25-100%) |
18 | delay (5000); |
19 | pwmDuty(79); // 100% (range = 0-79 = 1.25-100%) |
20 | delay (5000); |
21 | } |
22 |
23 | void pwm25kHzBegin() { |
24 | TCCR2A = 0; // TC2 Control Register A |
25 | TCCR2B = 0; // TC2 Control Register B |
26 | TIMSK2 = 0; // TC2 Interrupt Mask Register |
27 | TIFR2 = 0; // TC2 Interrupt Flag Register |
28 | TCCR2A |= (1 << COM2B1) | (1 << WGM21) | (1 << WGM20); // OC2B cleared/set on match when up/down counting, fast PWM |
29 | TCCR2B |= (1 << WGM22) | (1 << CS21); // prescaler 8 |
30 | OCR2A = 79; // TOP overflow value (Hz) |
31 | OCR2B = 0; |
32 | } |
33 |
34 | void pwmDuty( byte ocrb) { |
35 | OCR2B = ocrb; // PWM Width (duty) |
36 | } |
Работает, но получена ли требуемая частота в реале, проверить не могу - к сожалению, не имею доступа к соответствующей измерительной аппаратуре.
Если счастливые обладатели осциллографа помогут - буду благодарен.
А кто мешает запустить в том же скетче частотомер? Соедините два пина и экспериментируйте, пока 25к не побежит.
Спасибо за идею, Волшебник!
Загрузил на вторую ардуинку скетч, взятый с этого форума, законнектил платки.
На скрине результат - искомые 25 кГц.
01
volatile unsigned
int
int_tic=0;
02
volatile unsigned
long
tic;
03
04
void
setup
(){
05
Serial
.begin(9600);
06
pinMode (5,INPUT);
// вход сигнала T1 (only для atmega328)
07
TCCR2A=1<<WGM21;
//CTC mode
08
TIMSK2=1<<OCIE2A; OCR2A=124 ;
//прерывание каждые 8мс
09
TCCR2B=(1<<CS22)|(1<<CS21)|(1<<CS20);
//делитель 1024
10
TCCR1A=0; TIMSK1 = 1<<TOIE1;
//прерывание по переполнению
11
TCCR1B = (1<<CS10)|(1<<CS11)|(1<<CS12);
//тактировани от входа Т1
12
}
13
14
ISR (TIMER1_OVF_vect){ int_tic++; }
15
16
ISR (TIMER2_COMPA_vect){
17
static
byte
n=1;
18
if
(n==125){
19
tic= ((uint32_t)int_tic<<16) | TCNT1;
//сложить что натикало
20
int_tic=0;
21
TCNT1 = 0; n=0;
22
}
23
n++;
24
}
25
26
void
loop
(){
27
delay(500);
28
Serial
.println(tic);
29
}
30
31
//частотомер от dimax