STM32F103 - генератор синуса
- Войдите на сайт для отправки комментариев
Втр, 21/11/2017 - 12:37
#define SAMPLES 2000 #define DEBOUNCE_DELAY 100 #define DEBOUNCE_IDLE 0 #define DEBOUNCE_ACTIVE 1 #include <libmaple/dma.h> #include <EEPROM.h> struct debounce_info { int start, state; int16 shift; }left, right, up, down; dma_tube_config dma_cfg, dma_cfg2; int flag1 = 0; int flag2 = 0; int out1 = PB7; int out2 = PA8; int val1[SAMPLES]; int val2[SAMPLES]; int phasep = PB6; int phasen = PB5; int ampp = PB8; int ampn = PB9; int16 shift = 0; int amp = 35; int cnt = 0; int time_track = 0; float stp = 6.2831/SAMPLES; int ret = 17; timer_dev *dev1 = PIN_MAP[out1].timer_device; timer_dev *dev2 = PIN_MAP[out2].timer_device; uint8 cc_channel1 = PIN_MAP[out1].timer_channel; uint8 cc_channel2 = PIN_MAP[out2].timer_channel; void fun() { flag1++; } void fun2() { flag2++; } void timer_conf() { timer_dma_set_base_addr(dev1, TIMER_DMA_BASE_CCR2); timer_dma_set_burst_len(dev1, 1); timer_dma_enable_req(dev1, cc_channel1); timer_set_reload(dev1, 102); timer_set_prescaler(dev1, 0); timer_dma_set_base_addr(dev2, TIMER_DMA_BASE_CCR1); timer_dma_set_burst_len(dev2, 1); timer_dma_enable_req(dev2, cc_channel2); timer_set_reload(dev2, 102); timer_set_prescaler(dev2, 0); } void dma_conf() { dma_init(DMA1); /* T4C2 DMA C4 */ dma_cfg.tube_dst = &(dev1->regs.gen->DMAR); dma_cfg.tube_dst_size = DMA_SIZE_32BITS; dma_cfg.tube_src = val1; dma_cfg.tube_src_size = DMA_SIZE_32BITS; dma_cfg.tube_nr_xfers = SAMPLES; dma_cfg.tube_flags = DMA_CFG_SRC_INC | DMA_CFG_CIRC | DMA_CFG_CMPLT_IE; dma_cfg.tube_req_src = DMA_REQ_SRC_TIM4_CH2; dma_cfg.target_data = 0; ret = dma_tube_cfg(DMA1, DMA_CH4, &dma_cfg); /* T1C1 DMA C2 */ dma_cfg.tube_dst = &(dev2->regs.gen->DMAR); dma_cfg.tube_dst_size = DMA_SIZE_32BITS; dma_cfg.tube_src = val2; dma_cfg.tube_src_size = DMA_SIZE_32BITS; dma_cfg.tube_nr_xfers = SAMPLES; dma_cfg.tube_flags = DMA_CFG_SRC_INC | DMA_CFG_CIRC | DMA_CFG_CMPLT_IE; dma_cfg.tube_req_src = DMA_REQ_SRC_TIM1_CH1; dma_cfg.target_data = 0; ret = dma_tube_cfg(DMA1, DMA_CH2, &dma_cfg); } void dma_start() { dma_attach_interrupt(DMA1, DMA_CH4, fun); dma_enable(DMA1, DMA_CH4); timer_resume(dev1); dma_attach_interrupt(DMA1, DMA_CH2, fun2); dma_enable(DMA1, DMA_CH2); timer_resume(dev2); } void init_wave() { int i; for(i=0;i<SAMPLES;i++) { val1[i] = 50 + amp * sin(stp * i); val2[i] = val1[i]; } } void get_wave(int16 shift) { int i; for(i=0;i<SAMPLES;i++) { val2[i] = 50 + amp * sin( stp * i + shift * 0.1 * 6.2831 / 360); } } void setup() { int i; pinMode(out1, PWM); pinMode(out2, PWM); pinMode(phasep, INPUT); pinMode(phasen, INPUT); pinMode(ampp, INPUT); pinMode(ampn, INPUT); memset(&left, 0, sizeof(debounce_info)); memset(&right, 0, sizeof(debounce_info)); memset(&up, 0, sizeof(debounce_info)); memset(&down, 0, sizeof(debounce_info)); left.shift = -1; right.shift = 1; up.shift = 1; down.shift = -1; Serial.begin(9600); timer_conf(); dma_conf(); dma_start(); init_wave(); EEPROM.read(0, (uint16*)&shift); get_wave(shift); } void loop() { /*process_key(digitalRead(phasep), &right); process_key(digitalRead(phasen), &left); //process_key_amp(digitalRead(ampp), &up); process_key_amp(digitalRead(ampn), &down);*/ delay(80); Serial.println(shift); } void process_key(int val, struct debounce_info *k) { switch(k->state) { case DEBOUNCE_IDLE: if(val == HIGH) { k->state = DEBOUNCE_ACTIVE; k->start = millis(); } break; case DEBOUNCE_ACTIVE: if(val == HIGH) { if(millis() - k->start > DEBOUNCE_DELAY) { shift += k->shift; get_wave(shift); } } else k->state = DEBOUNCE_IDLE; EEPROM.write(0, shift); break; } } void process_key_amp(int val, struct debounce_info *k) { switch(k->state) { case DEBOUNCE_IDLE: if(val == HIGH) { k->state = DEBOUNCE_ACTIVE; k->start = millis(); } break; case DEBOUNCE_ACTIVE: if(val == HIGH) { if(millis() - k->start > DEBOUNCE_DELAY) { amp += (int)k->shift; get_wave(shift); } } else k->state = DEBOUNCE_IDLE; break; } }
Вот программа, пожалуйста подскажите как уменьшить шаг регулировки амплитуды в 10 раз.
что значит "уменьшить шаг регулировки амплитуды"? - может просто "уменьшить амплитуду"? - тогда это несложно, в скетче есть параметр amp. который как раз отвечает за это
Вот программа, пожалуйста подскажите как уменьшить шаг регулировки амплитуды в 10 раз.
1
ты бухой штоли?
1
[quote=Тед]
забаньте спаммера
регулировка амплитуды производится с помощью кнопок, 30 мВ на шаг, я хочу уменьшить ее в 10 раз
регулировка амплитуды производится с помощью кнопок, 30 мВ на шаг, я хочу уменьшить ее в 10 раз
ну и уменьшай, нафига форум-то засирать?
Админы, прибейте ветку!
как удалить ошибки ?
регулировка амплитуды производится с помощью кнопок, 30 мВ на шаг, я хочу уменьшить ее в 10 раз
видимо, придёца каму-то лекцию читать, как 30 мВ на 10 поделить.
5 раз подряд?
5 раз я хотел удалить, не получилось.
5 раз я хотел удалить, не получилось.
ОК, оставим это.
Ответ на ваш вопрос про амплитуду - в сообщении #1
это цитаты из кода
регулировка амплитуды производится с помощью кнопок, 30 мВ на шаг, я хочу уменьшить ее в 10 раз
это- пожелание.
=============================
Ну как сам-то думаешь?
.............
ИМХО - все-таки он бухой! ...ну или совсем тупой! ;)
Попкорн, господа?
не, ну ты хоть маленька мозг-то наморщи. В первом же сообщении (#1) и ответ.
amp - это общее усиление, строки # 142,143 для регулировки амплитуды с помощью кнопок. Где величина степеней настройки?
Застрелиться ....
int amp/10 = 350;
Вот в этой строке как раз делить на 10 не нужно.
а что нужно ?
вместо этих строк, вот эти:
======================
offtop
даже забавно. Совершенно незамутненное интеллектом сознание...
Вы часом не коммунист? ;)
извини, но тут все просто.
1. я старый (на днях 48 стукнуло) и очень опытный програмист.
2. у меня очень скверный характер.
3. я не работаю и не нуждаюсь в работе. в том смысле что обеспечен.
4. я заранее предупреждаю новичков, что плату за помощь беру глумежом и унижениями - должен же я как-то развлекать себя?
5. если ты оказался не предупрежден - жаль. ... но не очень.
6. я почти всегда, за исключением специфического оборудования, могу помочь новичку на этих условиях.
7. на мой взгляд - унижения это самый действенный педагогический прием. Новичек получает стимул во всем разобраться сам.
Потомушта, у тебя не с Ардуино опыт, а с передиранием чужих скетчей, не задумываясь как они работают. Опыт, это когда сам, своими ручками и головой, со ступеньки на ступеньку...
если это вы после 2.5 месяцев пишете- int amp/10 - то оскорбления заслужены...
Я не такого писал
Wdrakula хороший человек обругал но помог.
Это скопированный - compiling error
Это скопированный - compiling error
вы продолжаете городить одну тупость на другую :) Да, это ошибка компилятора. Но компилятор это сам придумал. что ли? - это ваш код!
Вот мне даже интересно, зачем человеку с таким уровнем интеллекта может понадобится генератор синуса? :))))
Вот мне даже интересно, зачем человеку с таким уровнем интеллекта может понадобится генератор синуса? :))))
Да накой он ваааще человеку нужен !?
Небось препод попросил исправить, дабы проверить - сам он это накропал или спер где то :0)
wdrakula я готов из программиста стать таким же програмистом как ты не нуждающимся :) Расскажи кого нужно убить ?
Небось препод попросил исправить, дабы проверить - сам он это накропал или спер где то :0)
Семен-Семеныч!!! я все время забываю о пту-шниках.... сразу все встало на свои места... ну не интересуются такие кадры синусами в реальной жизни... только ради зачета...
Семен-Семеныч!!! я все время забываю о пту-шниках.... сразу все встало на свои места... ну не интересуются такие кадры синусами в реальной жизни... только ради зачета...
Иканомисты, кадровики и историки тоже синусами не интересуются. А так же сторожа, банщики, водители метро, швеи, булошники, мент... полиц... работники органов, химики и хирурги. И моему коту нассать на синусы эти ваши в реальной жизни.
Так что будем честны друг с другом - синусы нужны только ограниченному количеству людей - норкоманам, математикам и примкнувшим к ним программистам с физиками.
wdrakula я готов из программиста стать таким же програмистом как ты не нуждающимся :) Расскажи кого нужно убить ?
Это деловое предложение? ;) Обсудим! ;) ;) ;)
Чтобы получить ответ, нужно правильно задать вопрос.
Чтобы правильно задать вопрос, нужно знать большую часть ответа.
http://arduino.ru/forum/otvlechennye-temy/robert-shekli-vernyi-vopros
val2[i] = 50 + amp/10.0 * sin( stp * i + shift * 0.1 * 6.2831 / 360);
1.ты уж разберись, тебе на А8 синус нужен или нет?
2. эта строка в порт ничего не пишет, просто массив заполняет.
Wdrakula хороший человек обругал но помог.
Не стоит его за это благодарить, вот если бы он обругал, но не помог - результаты были-бы намного лучше!
Вот, например, меня этот "хороший человек" с аналогичной гоп-компанией пару раз макнули в дерьмо за глупые вопросы (стаж - 1,5 месяца) и в результате мне самостоятельно пришлось накропать скетч из 15 строк для attiny85, которая выдает 3-фазный ШИМ синус с регулировками амплитуды 0...5 В и частоты до 2 кГц.
А выговорите помог... нафиг нужна такая помощь? :))
Синусу необходимо и дополнительно прямоугольник
zilk
Но и зачем этот ответ не по теме вопроса ?
Ответ как раз по теме - оставь надежду, всяк сюда входящий... :))
у тебя сложный для новичка скетч. С ДМА и таймером. На твоем уровне понимания - ты не добавишь туда ничего.
Про себя - прости, обещать не буду... может и помогу, а может и нет. От настроения. Без обид.
Пока я использую LM386 (максимальное усиление ), я хотел заменить его программой
zilk
Вопрос был о прямоугольных импульсах