Jump to content

XELFAER

Members
  • Content Count

    3
  • Joined

  • Last visited

Community Reputation

1 Обычный

About XELFAER

  • Rank
    Новенький

Информация

  • Пол
    Мужчина
  • Интересы
    #!/bin/bash
    echo 'I love coffee and Linux';
    exit 0;

Электроника

  • Стаж в электронике
    Менее года
  1. Ища информацию по работе с сервоприводами наткнулся на статью. Для пробы был выбран МК Atmega8 и сервопривод TowerPro SG90 9G. Сделал изменения прошивки по аналогии. При включении - вал сервопривода немного дергается и на этом все заканчивается. В чем может быть причина? Кварц был взят на 12 МГц. Из схемы выброшена кнопка S1 конденсатор С5. Пересчитал по аналогии данные: 0.45ms= 0 градусов. 1.264ms= 90 градусов. 2.45ms= 180 градусов. 12Mhz/64 = 187.5khz = 5.3 мкс (5.3us) TOP = 3749 Servoугол 0 градусов требуется ширина импульса 0.45ms (450uS), поэтому значениеOCR1A = 450us/5.3us = 84.9 Servoугол 90 градусов требуется ширина импульса 1.264ms (1264uS), поэтому значениеOCR1A = 1264us/5.3us = 238,49 Servoугол 180 градусов требуется ширина импульса 2.45ms (2450uS), поэтому значениеOCR1A = 2450us/5.3us = 462,26 Прошивка: #include <avr/io.h> #include <util/delay.h> //Функция задержки void Wait() { uint8_t i; for(i=0;i<50;i++) { _delay_loop_2(0); _delay_loop_2(0); _delay_loop_2(0); } } void main() { //Настраиваем 16-ти битный таймер: TIMER1 TCCR1A|=(1<<COM1A1)|(1<<COM1B1)|(1<<WGM11); //не инвертируем ШИМ TCCR1B|=(1<<WGM13)|(1<<WGM12)|(1<<CS11)|(1<<CS10); //делитель частоты = 64; режим = 14(быстрый ШИМ) ICR1=3749; //частота ШИМ = 50Hz; Период = 20ms (период стандартный) DDRC|=(1<<PC0)|(1<<PC1); //разьемы устанавливаем как выход while(1) { OCR1A=84.9; //0 градусов Wait(); OCR1A=238.49; //90 градусов Wait(); OCR1A=462.26; //180 градусов Wait(); } } Фьюзы прошил: Lowfuse= 0xFF Highfuse= 0xC9
  2. поидее да. Писал по аналогии. Но при конвертировании данных полученных из буфера получаеться неверные данные. Во вложении сделал скрин когда датчик температуры ds18b20 подключен и отключен.
  3. Возникла проблема с написанием программы (host) USB HID Термометр на языке С для Linux, с использованием библиотеки libusb. Прошивку взял пока готовую с сайта, по аналогии идущей в комплекте программы host'a начал делать сам на С. Оборудование находится по VID:PID. Cчитываю 8 байт, конвертирую и получаю непонятный результат который не меняеться (+32,0 С). При просмотре содержимого буфера - оно меняется при каждом опросе. Не могу понять что делаю не так. Может кто в курсе. Код программы: #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <math.h> #include <libusb-1.0/libusb.h> #include <iostream> using namespace std; #define DEV_VID 0xaaaa #define DEV_PID 0xef04 #define DATA_SIZE 8 //#define DEV_CONFIG 1 #define DEV_INTF 0 #define EP_IN 0x81 #define EP_OUT 0x01 int main(int argc, char * argv[]) { libusb_device_handle * handle; int ret; unsigned char buf[DATA_SIZE]; libusb_init(NULL); libusb_set_debug(NULL, 3); //получим handle устройства handle = libusb_open_device_with_vid_pid(NULL, DEV_VID, DEV_PID); if (handle == NULL) { printf("Не удалось найти устройство\n"); libusb_exit(NULL); return 0; } if (libusb_kernel_driver_active(handle,DEV_INTF)) libusb_detach_kernel_driver(handle, DEV_INTF); //захватываем интерфейс if (libusb_claim_interface(handle, DEV_INTF) < 0) { printf("Ошибка интерфейса\n"); libusb_close(handle); libusb_exit(NULL); return 0; } //считываем данные в буфер int returned = libusb_interrupt_transfer(handle, EP_IN, buf, DATA_SIZE, &ret, 5000); if (returned >= 0) { std::cout << "buf[0] = " << (int)buf[0] << std::endl; std::cout << "buf[1] = " << (int)buf[1] << std::endl; std::cout << "buf[2] = " << (int)buf[2] << std::endl; std::cout << "buf[3] = " << (int)buf[3] << std::endl; std::cout << "buf[4] = " << (int)buf[4] << std::endl; std::cout << "buf[5] = " << (int)buf[5] << std::endl; std::cout << "buf[6] = " << (int)buf[6] << std::endl; std::cout << "buf[7] = " << (int)buf[7] << std::endl; } //вывод содержимого буфера на экран for (int i = 0; i < DATA_SIZE; i++) std::cout << buf << std::endl; //переводим данные в hex { printf("Buf: "); for(unsigned i = 0; i<sizeof(buf); i++){ printf("0x%02x ", buf[i] & 0xff); } printf("\n"); } //конвертируем данные uint8_t temp_lo = buf[1] & 0xff; uint8_t temp_hi = buf[0] & 0xff; int16_t temp = (temp_hi << 8) | (temp_lo); float temp_f = temp / 16.0; // low 4 bits of temp are fractional part { temp_f *= 10; temp_f = round(temp_f); temp_f /= 10; printf("%+.1f\n", temp_f); } // отдаем интерфейс и закрыаем библиотеку libusb_attach_kernel_driver(handle, DEV_INTF); libusb_close(handle); libusb_exit(NULL); return 0; } компилирую: g++ -o usb main.c -lusb-1.0
×
×
  • Create New...