Помогите с реализацией проекта

kirex
Offline
Зарегистрирован: 17.01.2017

Нужно сделать генератор импульсов на частоте 15-55 кГц (тоесть нарастающая, с шагом в 1 кГц за секунду) потом нужно замолкнуть на 1 минуту и цикл повторяется.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

прямое управление портом + моргаем без делай + счетчик переменная

kirex
Offline
Зарегистрирован: 17.01.2017

 

Изменение частоты необязательно с шагом в 1 кГц за секунду, главное плавно с 15 до 55 кГц в течении примерно 30-40сек., потом нужно замолкнуть на 1 минуту и цикл повторяется.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А что за спикер Вы прямо к пинам цеплять собрались?

kirex
Offline
Зарегистрирован: 17.01.2017

ЕвгенийП пишет:

А что за спикер Вы прямо к пинам цеплять собрались?

Высокочастотный пьезоизлучатель KEMO L10

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А, т.е. не прямо к пинам - здесь просто образно нарисовано, да?

kirex
Offline
Зарегистрирован: 17.01.2017

ЕвгенийП пишет:

А, т.е. не прямо к пинам - здесь просто образно нарисовано, да?

Прямо к пинам

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

kirex пишет:

Прямо к пинам

Да, ну, хозяин - барин, дело Ваше.

kirex
Offline
Зарегистрирован: 17.01.2017

ЕвгенийП пишет:

kirex пишет:

Прямо к пинам

Да, ну, хозяин - барин, дело Ваше.

А что не так?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да, всё так, я ничего.

Просто посмотрел на сайт производителя и вижу, что Rated voltage - 16 Vp-p, т.е. ему надо от +8 до -8 колебания (лучше бы синусоиду, чтобы не деградировал от прямоугольного сигнала).

Потребление почему-то не указано, но вот у изделия, состоящего из генератора сигнала и такого "динамика" потребление 150ма, значит динамик жрет не менее 120-130мА.

И где Вы ему всё это на пинах возьмёте?

kirex
Offline
Зарегистрирован: 17.01.2017

ЕвгенийП пишет:

Да, всё так, я ничего.

Просто посмотрел на сайт производителя и вижу, что Rated voltage - 16 Vp-p, т.е. ему надо от +8 до -8 колебания (лучше бы синусоиду, чтобы не деградировал от прямоугольного сигнала).

Потребление почему-то не указано, но вот у изделия, состоящего из генератора сигнала и такого "динамика" потребление 150ма, значит динамик жрет не менее 120-130мА.

И где Вы ему всё это на пинах возьмёте?

Да, но только тот генератор не на микроконтроллере. 

Я пробовал подавать на этот динамик сигналы от 1 до 5 кГц и потребление было максимум 9мА. 

В принципе можно через транзистор подцепить, это не проблема. Проблема в написании кода.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

kirex пишет:

Я пробовал подавать на этот динамик сигналы от 1 до 5 кГц и потребление было максимум 9мА. 

Что, 16Vp-p пробовали? Ну, смотрите сами, дело Ваше.

kirex пишет:

Проблема в написании кода.

Да, ладно плакать-то. Где Вы там проблему нашли? Нет никакой проблемы и не было никогда - обыкновенный ногодрыг с изменяемой частотой во вполне разумных пределах. Берёте пример "блинк без делэй", меняете в нём две строки и добавляете три новых - вот и весь Ваш код - говорить не о чем.

kirex
Offline
Зарегистрирован: 17.01.2017

ЕвгенийП пишет:

Что, 16Vp-p пробовали? Ну, смотрите сами, дело Ваше.

Да, ладно плакать-то. Где Вы там проблему нашли? Нет никакой проблемы и не было никогда - обыкновенный ногодрыг с изменяемой частотой во вполне разумных пределах. Берёте пример "блинк без делэй", меняете в нём две строки и добавляете три новых - вот и весь Ваш код - говорить не о чем.

Подавал сигнал с Тиньки, вот пример:

#define F_CPU 9600000UL  // 9.6 MHz
#include <util/delay.h>
#define pin 2

void setup() {                
  pinMode(pin, OUTPUT);    
}

void loop() {
  digitalWrite(pin, HIGH);   // turn the LED on (HIGH is the voltage level)
  delayMicroseconds(1);               // wait for a second
  digitalWrite(pin, LOW);    // turn the LED off by making the voltage LOW
  delayMicroseconds(1);               // wait for a second
}

Получилась частота 6,4кГц

А вы советуете всётаки через транзистор? 

По поводу того, что нет проблем с кодом. Я в програмировании полный ноль и для меня это пока проблема. 

Может поможете?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

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

kirex
Offline
Зарегистрирован: 17.01.2017

ЕвгенийП пишет:

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

Да  вы пока тоже ничем толком и не помогли. 

Даже по поводу спикера и транзистора вы ответили: "Хозяин барин". Это прям весомая помощь.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

kirex пишет:

Да  вы пока тоже ничем толком и не помогли. 

Правильно. Я же сказал, помогаю тому, кто деалет сам. Вы пока и не пытались ничего делать - потому и не помогаю.

kirex пишет:

Даже по поводу спикера и транзистора вы ответили: "Хозяин барин". Это прям весомая помощь.

А вот это, простите. Я Вам сказал, что ему требуется синусоидальное напржение 16В p-p (от -8 до +8),  и что потребление у него за 100мА. Вы же говорите, что подаёте ему от 0 до +5 прямоугольник и Вас всё устраивает. Ну, устраивает использовать динамик на 17% от его мощности, так устраивает. Чего Вы от меня ждали? Какой Вам ещё помощи надо? Думали, что я Вас свяжу и буду, прижигая живот горячим утюгом, заставлять делать по уму? И не подумаю. Информацию я Вам дал, а дальше - хозяин-барин. Решения за Вас принимать никто не будет - не в армии чай и не в детском саду.

 

kirex
Offline
Зарегистрирован: 17.01.2017

ЕвгенийП пишет:

kirex пишет:

Да  вы пока тоже ничем толком и не помогли. 

Правильно. Я же сказал, помогаю тому, кто деалет сам. Вы пока и не пытались ничего делать - потому и не помогаю.

kirex пишет:

Даже по поводу спикера и транзистора вы ответили: "Хозяин барин". Это прям весомая помощь.

А вот это, простите. Я Вам сказал, что ему требуется синусоидальное напржение 16В p-p (от -8 до +8),  и что потребление у него за 100мА. Вы же говорите, что подаёте ему от 0 до +5 прямоугольник и Вас всё устраивает. Ну, устраивает использовать динамик на 17% от его мощности, так устраивает. Чего Вы от меня ждали? Какой Вам ещё помощи надо? Думали, что я Вас свяжу и буду, прижигая живот горячим утюгом, заставлять делать по уму? И не подумаю. Информацию я Вам дал, а дальше - хозяин-барин. Решения за Вас принимать никто не будет - не в армии чай и не в детском саду.

Так скажите конкретно, что нужно. Если через транзистор, то какой?

kirex
Offline
Зарегистрирован: 17.01.2017

Вот так правильно будет?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

kirex пишет:

Так скажите конкретно, что нужно. Если через транзистор, то какой?

Господи, да делайте Вы как хотите. Я же уже дважны написал - ему нужен синус от -8 до +8 вольт. Вы можете это сделать через один транзистор? Хоть через какой-нибудь? Я - нет.

Если делать по уму, то нужен генератор синусоидального сигнала с амплитудой 8В, например, на копеечной микросхеме ICL8038. Нужна сама микросхема и несколько резисторов и один конденстаор обвязки (см. даташит). А ей в свою очередь нужно биполярное питание (-12 / +12 - такое есть на старых компьютерных БП, ну на худой конец сделать простейшее с вритаульной землей). такого тока генератор не выдержит, значит на выход надо либо мощный операционник, либо, на худой конец эмммитерный повторитель. Вот как-то так. Тогда он у Вас будет вопить на полную.

kirex
Offline
Зарегистрирован: 17.01.2017

ЕвгенийП пишет:

kirex пишет:

Так скажите конкретно, что нужно. Если через транзистор, то какой?

Господи, да делайте Вы как хотите. Я же уже дважны написал - ему нужен синус от -8 до +8 вольт. Вы можете это сделать через один транзистор? Хоть через какой-нибудь? Я - нет.

Если делать по уму, то нужен генератор синусоидального сигнала с амплитудой 8В, например, на копеечной микросхеме ICL8038. Нужна сама микросхема и несколько резисторов и один конденстаор обвязки (см. даташит). А ей в свою очередь нужно биполярное питание (-12 / +12 - такое есть на старых компьютерных БП, ну на худой конец сделать простейшее с вритаульной землей). такого тока генератор не выдержит, значит на выход надо либо мощный операционник, либо, на худой конец эмммитерный повторитель. Вот как-то так. Тогда он у Вас будет вопить на полную.

Не могу понять вашей реакции. 

Устройство будет питаться от двух Li-Ion акку, т.е. наряжение 7,4 В. Питание на контроллер пойдёт через стабилизатор 78l05. Само устройство нужно для отпугивания грызунов, собак и кошек. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

kirex пишет:

Не могу понять вашей реакции. 

Устройство будет питаться от двух Li-Ion акку, т.е. наряжение 7,4 В. Питание на контроллер пойдёт через стабилизатор 78l05. Само устройство нужно для отпугивания грызунов, собак и кошек. 

Да, нет у меня никакой реакции. делайте как Вам нравится. Вы взяли мощный динамик, которумо нужно 16 вольт для нормальной работы, но при этом "Устройство будет питаться от двух Li-Ion акку, т.е. наряжение 7,4 В". Ну, и ради Бога! Я же не имею ничего против, второй день говорю, "хозяин барин", делайте как Вам нравится. Если трети мощности Вашего динамика хватит, чтобы кого-то отпугнуть, то всё будет нормально работать, ну, а не хватит - переделаете - поставите повышайку, сделаете виртуальную землю и всё остальное. Вы спросили как делать, я ответил, но я же Вас не заставляю. делайте как Вам нравится.

kirex
Offline
Зарегистрирован: 17.01.2017

ЕвгенийП пишет:

kirex пишет:

Не могу понять вашей реакции. 

Устройство будет питаться от двух Li-Ion акку, т.е. наряжение 7,4 В. Питание на контроллер пойдёт через стабилизатор 78l05. Само устройство нужно для отпугивания грызунов, собак и кошек. 

Да, нет у меня никакой реакции. делайте как Вам нравится. Вы взяли мощный динамик, которумо нужно 16 вольт для нормальной работы, но при этом "Устройство будет питаться от двух Li-Ion акку, т.е. наряжение 7,4 В". Ну, и ради Бога! Я же не имею ничего против, второй день говорю, "хозяин барин", делайте как Вам нравится. Если трети мощности Вашего динамика хватит, чтобы кого-то отпугнуть, то всё будет нормально работать, ну, а не хватит - переделаете - поставите повышайку, сделаете виртуальную землю и всё остальное. Вы спросили как делать, я ответил, но я же Вас не заставляю. делайте как Вам нравится.

С этим понятно. Спасибо.

Тепер, что касается кода. Это всё на что меня пока хватило

#define F_CPU 9600000UL   
#include <avr/io.h>
#include <avr/interrupt.h>  
#include <util/delay.h> 
#define on PORTB |= 1<<PB0
#define off PORTB &= ~1<<PB0
#define ledon PORTB |= 1<<PB1
#define ledoff PORTB &= ~1<<PB1

int main(void) {
    DDRB  |= 1<<PB0;  // устанавливаем 0 вывод порта B (PB0) как выход 
    PORTB &= ~1<<PB0; // устанавливаем низкий уровень на выводе PB0
    DDRB  |= 1<<PB1;  // устанавливаем 0 вывод порта B (PB1) как выход 
    PORTB &= ~1<<PB1; // устанавливаем низкий уровень на выводе PB1
    
    while(1) {
      ledon;
      _delay_ms(500);
      ledoff;
      
        for(int i=0; i<30000; i++) {
            on;
            _delay_us(33);
            off;
            _delay_us(33);
        }
        for(int i=0; i<30000; i++) {
            on;
            _delay_us(31);
            off;
            _delay_us(31);
        }
        for(int i=0; i<30000; i++) {
            on;
            _delay_us(29);
            off;
            _delay_us(29);
        }
        for(int i=0; i<30000; i++) {
            on;
            _delay_us(27);
            off;
            _delay_us(27);
        }
        for(int i=0; i<30000; i++) {
            on;
            _delay_us(25);
            off;
            _delay_us(25);
        }
        for(int i=0; i<30000; i++) {
            on;
            _delay_us(23);
            off;
            _delay_us(23);
        }
        for(int i=0; i<30000; i++) {
            on;
            _delay_us(21);
            off;
            _delay_us(21);
        }
        for(int i=0; i<30000; i++) {
            on;
            _delay_us(19);
            off;
            _delay_us(19);
        }
        for(int i=0; i<30000; i++) {
            on;
            _delay_us(17);
            off;
            _delay_us(17);
        }
        for(int i=0; i<30000; i++) {
            on;
            _delay_us(15);
            off;
            _delay_us(15);
        }
        for(int i=0; i<30000; i++) {
            on;
            _delay_us(13);
            off;
            _delay_us(13);
        }
        for(int i=0; i<30000; i++) {
            on;
            _delay_us(11);
            off;
            _delay_us(11);
        }
        for(int i=0; i<30000; i++) {
            on;
            _delay_us(9);
            off;
            _delay_us(9);
        }
        _delay_ms(30000);
       }
}

Почему-то к концу цикла время каждой частоты сокращается. По задумке частота должна меняться примерно через 3 сек.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, так, как Вы написали так и работает. У Вас же количество повторов периода одинаковое - везде 30000, а период уменьшается.

Сами смотрите:

Строки 21-26 выполняются (33+33)х30000 микросекунд  (1,98 сек.). Ну, плюс там накладные расходы.

А строки 93-98 выполняются (9+9)х30000 микросекунд  (0,54 сек.)
 
Делайте разное количество повторов. Чем меньше период, тем больше повторов.
 
А вообще, зачем делать на задержках? У 13-ой ведь есть таймер. Так и делайте на нём, будет и точнее и беспроблемнее.
 
Например, сейчас у Вас в 99 строке написано _delay_ms(30000). Не знаю, что у Вас за макрос _delay_ms, но стандартная. которая в AVR студии, так работать не будет. У неё максимальное время - 262.14 ms / F_CPU in MHz. Какая у Вас тактовая частота? Вот поделите и узнаете максимальную задержку, которая возможна с _delay_ms.
kirex
Offline
Зарегистрирован: 17.01.2017

ЕвгенийП пишет:

Ну, так, как Вы написали так и работает. У Вас же количество повторов периода одинаковое - везде 30000, а период уменьшается.

Сами смотрите:

Строки 21-26 выполняются (33+33)х30000 микросекунд  (1,98 сек.). Ну, плюс там накладные расходы.

А строки 93-98 выполняются (9+9)х30000 микросекунд  (0,54 сек.)
 
Делайте разное количество повторов. Чем меньше период, тем больше повторов.
 
А вообще, зачем делать на задержках? У 13-ой ведь есть таймер. Так и делайте на нём, будет и точнее и беспроблемнее.
 
Например, сейчас у Вас в 99 строке написано _delay_ms(30000). Не знаю, что у Вас за макрос _delay_ms, но стандартная. которая в AVR студии, так работать не будет. У неё максимальное время - 262.14 ms / F_CPU in MHz. Какая у Вас тактовая частота? Вот поделите и узнаете максимальную задержку, которая возможна с _delay_ms.

Да это я понял, но если я ставлю количество повторов например 35000 или 60000, то команда выполняется бесконечно (я не дождался окончания). 

Например 

while(1) {
      
        for(int i=0; i<35000; i++) {
            on;
            _delay_us(9);
            off;
            _delay_us(9);
        }
       }

Как делать на таймере для меня пока вообще тёмный лес. 

Это типа так?

#define F_CPU 9600000UL   
#include <avr/io.h>   Attiny13a
#include <avr/interrupt.h>  
#include <util/delay.h> 
#define on PORTB |= 1<<PB0
#define off PORTB &= ~1<<PB0
#define ledon PORTB |= 1<<PB1
#define ledoff PORTB &= ~1<<PB1

int main(void) {
    DDRB  |= 1<<PB0;  // устанавливаем 0 вывод порта B (PB0) как выход 
    PORTB &= ~1<<PB0; // устанавливаем низкий уровень на выводе PB0
    DDRB  |= 1<<PB1;  // устанавливаем 0 вывод порта B (PB1) как выход 
    PORTB &= ~1<<PB1; // устанавливаем низкий уровень на выводе PB1
   
  while(1)
  {
    for(int f = 32; f < 9; f--) // 9 микросекунд это и будет частота в ~ 50 кГц, а 32 ~ 15,5 кГц
    { 
      long time = 1000000/2/f;
      for(long t = 0; t < time; t++) 
      {
        on;
        _delay_us(f);
        off; 
        _delay_us(f); 
      }
    }
    _delay_ms(5000);  // 5 сек пауза, для тестов
  }
}

Почемуто этот код не работает.

Чем можно заменить _delay_ms, мне нужна задержка примерно в 30-40сек.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

kirex пишет:

        for(int i=0; i<35000; i++) {

int не бывает ни 35000, ни, тем более, 60000. Максимальное значение int - 32767. Хотите больше, используйет unsigned - там до 65535 или long - там значительно больше.

Нет, на таймере совсем не "типа так". Поищите на тему "работа с таймерами в avr". Нужно найти статью, чтобы понять суть, а потом брать даташит тиньки и смотреть конкретику, т.к. в каждом контроллере это делается по-разному.

kirex
Offline
Зарегистрирован: 17.01.2017

ЕвгенийП пишет:

kirex пишет:

        for(int i=0; i<35000; i++) {

int не бывает ни 35000, ни, тем более, 60000. Максимальное значение int - 32767. Хотите больше, используйет unsigned - там до 65535 или long - там значительно больше.

Нет, на таймере совсем не "типа так". Поищите на тему "работа с таймерами в avr". Нужно найти статью, чтобы понять суть, а потом брать даташит тиньки и смотреть конкретику, т.к. в каждом контроллере это делается по-разному.

Пока остановился на этом:

#define F_CPU 9600000UL   
#include <avr/io.h>
#include <avr/interrupt.h>  
#include <util/delay.h> 
#define on PORTB |= 1<<PB0
#define off PORTB &= ~1<<PB0
#define ledon PORTB |= 1<<PB1
#define ledoff PORTB &= ~1<<PB1

int main(void) {
    DDRB  |= 1<<PB0;  // устанавливаем 0 вывод порта B (PB0) как выход 
    PORTB &= ~1<<PB0; // устанавливаем низкий уровень на выводе PB0
    DDRB  |= 1<<PB1;  // устанавливаем 0 вывод порта B (PB1) как выход 
    PORTB &= ~1<<PB1; // устанавливаем низкий уровень на выводе PB1
    
    while(1) {
      ledon;
      _delay_ms(500);
      ledoff;
      
        for(long i=0; i<31000; i++) {
            on;
            _delay_us(33);
            off;
            _delay_us(33);
        }
        for(long i=0; i<33000; i++) {
            on;
            _delay_us(31);
            off;
            _delay_us(31);
        }
        for(long i=0; i<36000; i++) {
            on;
            _delay_us(29);
            off;
            _delay_us(29);
        }
        for(long i=0; i<38000; i++) {
            on;
            _delay_us(27);
            off;
            _delay_us(27);
        }
        for(long i=0; i<42000; i++) {
            on;
            _delay_us(25);
            off;
            _delay_us(25);
        }
        for(long i=0; i<46000; i++) {
            on;
            _delay_us(23);
            off;
            _delay_us(23);
        }
        for(long i=0; i<50000; i++) {
            on;
            _delay_us(21);
            off;
            _delay_us(21);
        }
        for(long i=0; i<55000; i++) {
            on;
            _delay_us(19);
            off;
            _delay_us(19);
        }
        for(long i=0; i<62000; i++) {
            on;
            _delay_us(17);
            off;
            _delay_us(17);
        }
        for(long i=0; i<70000; i++) {
            on;
            _delay_us(15);
            off;
            _delay_us(15);
        }
        for(long i=0; i<80000; i++) {
            on;
            _delay_us(13);
            off;
            _delay_us(13);
        }
        for(long i=0; i<95000; i++) {
            on;
            _delay_us(11);
            off;
            _delay_us(11);
        }
        for(long i=0; i<115000; i++) {
            on;
            _delay_us(9);
            off;
            _delay_us(9);
        }
        _delay_ms(30000);
       }
}

Чем можно заменить _delay_ms, мне нужна задержка примерно в 30-40сек.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

C функцией tone() всё тоже самое в трёх строчках:

void loop() {
static uint16_t freq=15000;
tone(13,++freq);
delayMicroseconds(1500);
if (freq>55000) freq=15000; 
}

 

kirex
Offline
Зарегистрирован: 17.01.2017

dimax пишет:

C функцией tone() всё тоже самое в трёх строчках:

void loop() {
static uint16_t freq=15000;
tone(13,++freq);
delayMicroseconds(1500);
if (freq>55000) freq=15000; 
}

 

Почему-то выдаёт ошибку при компилировании

#define F_CPU 9600000UL   
#include <avr/io.h>
#include <avr/interrupt.h>  
#include <util/delay.h> 
#define on PORTB |= 1<<PB0
#define off PORTB &= ~1<<PB0
#define ledon PORTB |= 1<<PB1
#define ledoff PORTB &= ~1<<PB1

int main(void) {
    DDRB  |= 1<<PB0;  // устанавливаем 0 вывод порта B (PB0) как выход 
    PORTB &= ~1<<PB0; // устанавливаем низкий уровень на выводе PB0
    DDRB  |= 1<<PB1;  // устанавливаем 0 вывод порта B (PB1) как выход 
    PORTB &= ~1<<PB1; // устанавливаем низкий уровень на выводе PB1
    
void loop() {
static uint16_t freq=15000;
tone(13,++freq);
delayMicroseconds(1500);
if (freq>55000) freq=15000; 
  }
}

 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

kirex пишет:

Почему-то выдаёт ошибку при компилировании

В ошибке всё написано.

P.S. Вы в какой среде программируете?

kirex
Offline
Зарегистрирован: 17.01.2017

Jeka_M пишет:

kirex пишет:

Почему-то выдаёт ошибку при компилировании

В ошибке всё написано.

P.S. Вы в какой среде программируете?

Arduino

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Если Arduino IDE, то не нужно использовать функцию main(). Всё содержимое подставляется туда препроцессором автоматически. В Arduino IDE main() скрыта от пользователя.

kirex
Offline
Зарегистрирован: 17.01.2017

Выдаёт такую ошибку

Arduino: 1.8.1 (Windows 7), Плата:"ATtiny13 (ATtiny13a), 9.6 MHz"
 
In function 'void loop()':
 
sketch_jan21c:18: error: 'tone' was not declared in this scope
 
 tone(13, ++freq);
 
                ^
 
exit status 1
'tone' was not declared in this scope
 
Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Скетч?

kirex
Offline
Зарегистрирован: 17.01.2017

Jeka_M пишет:

Скетч?

#define F_CPU 9600000UL   
#include <avr/io.h>
#include <avr/interrupt.h>  
#include <util/delay.h> 
#define on PORTB |= 1<<PB0
#define off PORTB &= ~1<<PB0
#define ledon PORTB |= 1<<PB1
#define ledoff PORTB &= ~1<<PB1

void setup() {
    DDRB  |= 1<<PB0;  // устанавливаем 0 вывод порта B (PB0) как выход 
    PORTB &= ~1<<PB0; // устанавливаем низкий уровень на выводе PB0
    DDRB  |= 1<<PB1;  // устанавливаем 0 вывод порта B (PB1) как выход 
    PORTB &= ~1<<PB1; // устанавливаем низкий уровень на выводе PB1
    }
void loop() {
static uint16_t freq=15000;
tone(on, ++freq);
delayMicroseconds(1500);
if (freq>55000) freq=15000; 
  
}
        

 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Ага, видимо для Attiny13 не реализована эта функция (т.к. всего один аппаратный таймер, и он занят для другого). Проверил, у меня для Attiny13 тоже не компилируется. Если выбрать любую ардуину - всё компилируется.

kirex
Offline
Зарегистрирован: 17.01.2017

Jeka_M пишет:

Ага, видимо для Attiny13 не реализована эта функция. Проверил, у меня для Attiny13 тоже не компилируется. Если выбрать любую ардуину - всё компилируется.

Я так и думал

kirex
Offline
Зарегистрирован: 17.01.2017

Как лучше подключить пьезоизлучатель, так

buzzer3.png

или так 

pezoizluchatel4.png

Подойдёт ли транзистор BC550C ?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Вот накатал продвинутый вариант для тини13.  Таймер управляет генерируемой частотой в цикле while.  Благодаря применению алгоритма однобитного DDS синтеза удаётся очень плавно регулировать частоту (3288 градаций), правда расплата за это -повышенный джиттер. Когда частота достигает максимума  МК переводит системные клоки на делитель 256, и делает паузу 200мс, соответссно каждая мс длится 256 мс, итоговая задержка будет 200*256мс. Выход PB3.

#include <util/delay.h>
volatile uint16_t dds_shag= 1233; //15kHz
uint16_t akkum;
void setup() {
DDRB|=(1<<3);
TCCR0A=1<<WGM01; //CTC mode
OCR0A=170; TIMSK0=1<<OCIE0A; 
TCCR0B=(1<<CS02)|(1<<CS00); //делитель 1024
while(1){
  (akkum+=dds_shag)&(1<<15) ? PORTB|=1<<3 : PORTB&=~(1<<3);
  }
}

ISR (TIM0_COMPA_vect){ 
dds_shag++;
if (dds_shag>4521) { //если дошло до 55кГц, то
             dds_shag= 1233; //установить 15кГц
             PORTB&=~(1<<3); //отчистить порт
           CLKPR= 1<<CLKPCE; CLKPR = 8;  // CLK/256
         _delay_ms(200); 
        CLKPR= 1<<CLKPCE;  CLKPR = 0; 
     }
}
void loop(){}

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

kirex пишет:

Чем можно заменить _delay_ms, мне нужна задержка примерно в 30-40сек.

А что там обычного delay нет? Вызываете _delay_ms с допустимым параметром (посчитайте какой там у Вас допустим) в цикле столько раз, сколько надо, чтобы задержка была такой. какой Вам нужно.

kirex
Offline
Зарегистрирован: 17.01.2017

dimax пишет:

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

Двухтактная схема - это на двух транзисторах?

Что за пин-драйвер для мосфета ?

m-zzz
Offline
Зарегистрирован: 30.05.2015

А еще лучше драйвер нагрузки на основе H-моста, главное, чтобы он на запрошенных частотах мог работать.. Но это уже автору конструкции в даташитах лопатить надо..

kirex
Offline
Зарегистрирован: 17.01.2017

m-zzz пишет:

А еще лучше драйвер нагрузки на основе H-моста, главное, чтобы он на запрошенных частотах мог работать.. Но это уже автору конструкции в даташитах лопатить надо..

Это вот так

Как мне подключить в моей схеме?

m-zzz
Offline
Зарегистрирован: 30.05.2015

сигналы на R1 и R2 нужно подавать обязательно разные, если на одном ноль, на другом должна быть единица, и наоборот...

проще всего соединить их друг с другом через инвертирующий элемент.

kirex
Offline
Зарегистрирован: 17.01.2017

Какая из этих трёх схем лучше подойдёт

Или может можно вместо транзисторов использовать усилитель LM358N или LM393 ?

m-zzz
Offline
Зарегистрирован: 30.05.2015

Первую сделай.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

kirex пишет:

Двухтактная схема - это на двух транзисторах?  Что за пин-драйвер для мосфета ?

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

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

смотря какая пищалка. если пьезо то однотактная лучше с дросселем

kirex
Offline
Зарегистрирован: 17.01.2017

jeka_tm пишет:

смотря какая пищалка. если пьезо то однотактная лучше с дросселем

Пищалка пьезо, вот такая: https://www.kemo-electronic.de/en/Car/Speaker/L010-Piezo-Loudspeaker.php

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

1 вариант

резонансный генератор, частота сама подстраивается под излучатель

а такая схема в отпугивателе собак. тоже самое как в первой

а поводу драйвера полевика можно 555 таймер использовать

kirex
Offline
Зарегистрирован: 17.01.2017

jeka_tm пишет:

1 вариант

резонансный генератор, частота сама подстраивается под излучатель

а такая схема в отпугивателе собак. тоже самое как в первой

а поводу драйвера полевика можно 555 таймер использовать

А что полевик нужно обязательно через драйвер цеплять к МК ? 

Мне нужно чтобы мощности излучателя хватало в радиусе 3 метров, а так-же важно энергопотребление, чтоб батареи на дольше хватало.

kirex
Offline
Зарегистрирован: 17.01.2017

dimax пишет:

Вот накатал продвинутый вариант для тини13.  Таймер управляет генерируемой частотой в цикле while.  Благодаря применению алгоритма однобитного DDS синтеза удаётся очень плавно регулировать частоту (3288 градаций), правда расплата за это -повышенный джиттер. Когда частота достигает максимума  МК переводит системные клоки на делитель 256, и делает паузу 200мс, соответссно каждая мс длится 256 мс, итоговая задержка будет 200*256мс. Выход PB3.

#include <util/delay.h>
volatile uint16_t dds_shag= 1233; //15kHz
uint16_t akkum;
void setup() {
DDRB|=(1<<3);
TCCR0A=1<<WGM01; //CTC mode
OCR0A=170; TIMSK0=1<<OCIE0A; 
TCCR0B=(1<<CS02)|(1<<CS00); //делитель 1024
while(1){
  (akkum+=dds_shag)&(1<<15) ? PORTB|=1<<3 : PORTB&=~(1<<3);
  }
}

ISR (TIM0_COMPA_vect){ 
dds_shag++;
if (dds_shag>4521) { //если дошло до 55кГц, то
             dds_shag= 1233; //установить 15кГц
             PORTB&=~(1<<3); //отчистить порт
           CLKPR= 1<<CLKPCE; CLKPR = 8;  // CLK/256
         _delay_ms(200); 
        CLKPR= 1<<CLKPCE;  CLKPR = 0; 
     }
}
void loop(){}

 

Код попробывал, только частота меняется от 9 до 34 кГц и в течении минуты. Я изменил некоторые значения и теперь частота 15-55 кГц меняется в течении 30сек.

#define F_CPU 9600000UL   
#include <avr/io.h>
#include <avr/interrupt.h>  
#include <util/delay.h> 
#define on PORTB |= 1<<PB0
#define off PORTB &= ~1<<PB0
#define ledon PORTB |= 1<<PB1
#define ledoff PORTB &= ~1<<PB1

volatile uint16_t dds_shag= 2033; //15kHz
uint16_t akkum;
void setup() {
DDRB|=(1<<PB0);
TCCR0A=1<<WGM01; //CTC mode
OCR0A=50; TIMSK0=1<<OCIE0A; 
TCCR0B=(1<<CS02)|(1<<CS00); //делитель 1024
while(1){
  (akkum+=dds_shag)&(1<<15) ? PORTB|=1<<PB0 : PORTB&=~(1<<PB0);
  }
}

ISR (TIM0_COMPA_vect){ 
dds_shag++;
if (dds_shag>7821) { //если дошло до 55кГц, то
             dds_shag= 2033; //установить 15кГц
             PORTB&=~(1<<PB0); //отчистить порт
           CLKPR= 1<<CLKPCE; CLKPR = 8;  // CLK/256
         _delay_ms(120); 
        CLKPR= 1<<CLKPCE;  CLKPR = 0; 
     }
}
void loop(){}