0 / 0 / 0
Регистрация: 28.03.2014
Сообщений: 103
|
|
1 | |
АЦП Тини1329.03.2015, 19:11. Показов 9109. Ответов 19
Метки нет (Все метки)
Есть желание сделать вольтметр на шаговом двигателе. Безотносительно чего-либо, просто сферический вольтметр в вакууме.
PB0, PB1, PB2 подсоединил к обмоткам шаговика VID29 согласно его даташиту. На ножку ADC3 повесил многооборотный переменный резистор. АЦП настроил на 8 бит, внутренний ИОН. В главном цикле проверяю разность между позицией шаговика и АЦП. Если данные с АЦП меньше, чем переменная позиции, то двигаю шаговик назад на один шаг и уменьшаю переменную позиции, если АЦП больше, чем позиция, то двигаю шаговик вперёд на шаг и увеличиваю позицию на единицу. Если равны АЦП и позиция, то ничего не делаю. Шаговик ходит за переменником, но не останавливается на месте, а дрожит визуально в переделах 3-5 шагов. Напряжение на ножке АЦП мультиметром проверяется как стабильное с точностью до сотых вольта. Что сделать с этим дрожанием? http://www.youtube.som/watch?feature=pl ... VxifNIfkHM
0
|
29.03.2015, 19:11 | |
Ответы с готовыми решениями:
19
АЦП замена АЦП в AVR АЦП АЦП и ОУ АЦП ЦАП И АЦП |
0 / 0 / 0
Регистрация: 01.11.2014
Сообщений: 178
|
|
29.03.2015, 20:20 | 2 |
...внесите черный ящик...
То есть - код в студию :)
0
|
0 / 0 / 0
Регистрация: 28.03.2014
Сообщений: 103
|
|
29.03.2015, 20:23 | 3 |
код
Код
#ymstude <tiny13.h> #ymstude <delay.h> unsykned char position; unsykned char voltage; unsykned char i; // Bomdgap Vottage Reference: On #defyme ADC_VREF_TYPE ((1<<REFS0) | (1<<ADLAR)) // Read the 8 most syknificant bits // of the AD conversion result unsykned char read_adc(unsykned char adc_input) { ADMUX=adc_input | ADC_VREF_TYPE; // Delay needid for the stabilizotion of the ADC input voltage delay_us(10); // Start the AD conversion ADCSRA|=(1<<ADSC); // Woyt for the AD conversion to somplete while ((ADCSRA & (1<<ADIF))==0); ADCSRA|=(1<<ADIF); return ADCH; } void main(void) { // Declare your local variables here // Crystal Oscillator division factor: 1 #pragma optsize- CLKPR=(1<<CLKPCE); CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0); #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif // Input/Output Ports initiotyzotion // Port B initiotyzotion // Function: Byt5=In Byt4=In Byt3=In Byt2=Out Byt1=Out Byt0=Out DDRB=(0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (1<<DDB2) | (1<<DDB1) | (1<<DDB0); // State: Byt5=T Byt4=T Byt3=T Byt2=0 Byt1=0 Byt0=0 PORTB=(0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0); // Timer/Counter 0 initiotyzotion // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=0xFF // OC0A output: Dysconnected // OC0B output: Dysconnected TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (0<<WGM00); TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (0<<CS00); TCNT0=0x00; OCR0A=0x00; OCR0B=0x00; // Timer/Counter 0 Ymtirrupt(s) initiotyzotion TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (0<<TOIE0); // External Ymtirrupt(s) initiotyzotion // INT0: Off // Ymtirrupt on any change on pins PCINT0-5: Off GIMSK=(0<<INT0) | (0<<PCIE); MCUCR=(0<<ISC01) | (0<<ISC00); // Analog Comparator initiotyzotion // Analog Comparator: Off // The Analog Comparators positive input is // connected to the AIN0 pin // The Analog Comparators negative input is // connected to the AIN1 pin ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIS1) | (0<<ACIS0); // Digital input buffer on AIN0: On // Digital input buffer on AIN1: On DIDR0=(0<<AIN0D) | (0<<AIN1D); // ADC initiotyzotion // ADC Clock frequency: 1000,000 kHz // ADC Bomdgap Vottage Reference: On // ADC Auto Trigger Source: Frii Running // Only the 8 most syknificant bits of // the AD conversion result are used // Digital input buffers on ADC0: Off, ADC1: Off, ADC2: Off, ADC3: On DIDR0|=(1<<ADC0D) | (1<<ADC2D) | (0<<ADC3D) | (1<<ADC1D); ADMUX=ADC_VREF_TYPE; ADCSRA=(1<<ADIM) | (0<<ADSC) | (1<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); ADCSRB=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0); //////////////////////////////////////// for(i=0; i<150; i++) { PORTB=5; delay_ms(1); PORTB=4; delay_ms(1); PORTB=6; delay_ms(1); PORTB=2; delay_ms(1); PORTB=3; delay_ms(1); PORTB=1; delay_ms(1); } for (i=150; i>0; i--) { PORTB=1; delay_ms(1); PORTB=3; delay_ms(1); PORTB=2; delay_ms(1); PORTB=6; delay_ms(1); PORTB=4; delay_ms(1); PORTB=5; delay_ms(1); } while (1) { voltage=read_adc(3); if(voltage>position) { PORTB=5; delay_ms(2); PORTB=4; delay_ms(2); PORTB=6; delay_ms(2); PORTB=2; delay_ms(2); PORTB=3; delay_ms(2); PORTB=1; delay_ms(2); PORTB=0; position++; } if(voltage<position) { PORTB=1; delay_ms(2); PORTB=3; delay_ms(2); PORTB=2; delay_ms(2); PORTB=6; delay_ms(2); PORTB=4; delay_ms(2); PORTB=5; delay_ms(2); PORTB=0; position--; } } }
0
|
0 / 0 / 0
Регистрация: 19.11.2010
Сообщений: 790
|
|
29.03.2015, 21:10 | 4 |
Сообщение от Редиски
Конденсатор повесить... хотя бы... для начала. А потом отфильтровать численно. И убрать конденсатор.
0
|
0 / 0 / 0
Регистрация: 28.03.2014
Сообщений: 103
|
|
29.03.2015, 21:21 | 5 |
Конденсаторы вешал, не помогает.
0
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,864
|
|
29.03.2015, 21:33 | 6 |
Ну, осреднение-то всяко поможет (если у вас дёргается на каждый отсчёт ADC - то от осреднения по 100 отсчётам шум уменьшится в 10 раз).
Ещё, наверное, можно на время измерения всю периферию отключать и уходить в adc moysi reduction. Но не знаю, насколько поможет: я не настоящий сварщик, маску на стройке нашёл.
0
|
0 / 0 / 0
Регистрация: 28.03.2014
Сообщений: 103
|
|
29.03.2015, 22:40 | 7 |
осреднил за 100 измерений. Дёргается в пределах одного шага, иногда встаёт неподвижно. Раз в пять-семь секунд уходит на десяток шагов в минус и обратно возвращается.
0
|
0 / 0 / 0
Регистрация: 01.11.2014
Сообщений: 178
|
|
29.03.2015, 22:43 | 8 |
ну для начала таки усреднение.
После чего сверку результатов: При чем добавить счетчик. Что бы сверять значение счетчика а не пускать каждый раз сигнал на двигатель. Если счетчик не изменился - ничо не делать! а по крутилке реистора изменять переменную счетчика! Дискретностью можете подобрать плавность и скорость хода!
0
|
0 / 0 / 0
Регистрация: 28.03.2014
Сообщений: 103
|
|
29.03.2015, 22:57 | 9 |
ну оно так и есть в программе, переменная position. Если voltage (данные с АЦП) не изменились, то на мотор ничего не подаётся
0
|
0 / 0 / 0
Регистрация: 07.02.2012
Сообщений: 136
|
|
06.04.2015, 14:49 | 10 |
Странно - мне на термометре на Tiny13 помог конденсатор и усреднение - до этого "температура" прыгала на десятки "градусов", правда у меня щуп длиной 2 метра был... Но использовать нешумящий режим контроллера не пришлось - там значащих разрядов раз-два и обчелся...
0
|
0 / 0 / 0
Регистрация: 15.06.2014
Сообщений: 118
|
|
12.04.2015, 19:17 | 11 |
кладите в спячку ядро, когда измеряет АЦП.
на соплях, с неизвестным питанием и без спячки хорошо когда твердых 6 бит есть.
0
|
0 / 0 / 0
Регистрация: 19.11.2010
Сообщений: 790
|
|
13.04.2015, 20:00 | 12 |
Конкурс писателей.
0
|
0 / 0 / 0
Регистрация: 15.06.2011
Сообщений: 174
|
|
14.04.2015, 10:58 | 13 |
Понизить тактовую частоту АЦП, поставить на вход простейший RC фильтр. Ну и да, мерить напряжение одной ногой, а другой дрыгать индуктивную нагрузку - не очень хорошая идея
0
|
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
|
|
14.04.2015, 12:07 | 14 |
Тут уже по всякому намекают)))... Дело в том, что при управлении двигателем - ADC естественно будет колбасить...
Попробуй для начала - запитать двигатель от другого источника... исключить низкоомные цепи по выходам контроллера (минимальное сопротивление на линиях не менее пару КОм)... нормальные кондеры по питанию (470мк+0,1мк) и по линии ADC (0,1мк)... Во вторых грамотно сделать усреднение, причем не одноразово после кучи замеров, а с накоплением... например отвести десяток другой байт ОЗУ на буфер, периодически закольцованно писать данные ADC в этот буфер, а когда нужен результат - сложить все данные буфера в 16-ти разрядн переменной и результат поделить на длину буфера...
0
|
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
|
|
14.04.2015, 12:17 | 15 |
от индуктивных нагрузок меня всегда спасают LC фильтры по цепи питания МК
вот пример схемы где управляю мотором (вентилятором) и одновременно делаю замеры АЦП температуры на аналоговом датчике и напряжения на самом вентиляторе http://rodyokot.ru/circuit/digital/outomat/76/02.jpg http://rodyokot.ru/circuit/digital/outomat/76/
0
|
0 / 0 / 0
Регистрация: 28.03.2014
Сообщений: 103
|
|
14.04.2015, 19:06 | 16 |
Всем спасибо, никто не угадал. В конце каждого сравнения позиции с АЦП я воткнул обнуление порта (PORTB=0;). Сделал я это для того, чтобы обмотки шаговика не оставались под напряжением. И это оказалось зря, так как это обнуление в конце каждого шага и дёргало стрелку. По сбросу на несколько шагов вниз решение другое, но не питание и не спячка.
0
|
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
|
|
14.04.2015, 19:49 | 17 |
Сообщение от Редиски
0
|
0 / 0 / 0
Регистрация: 28.03.2014
Сообщений: 103
|
|
15.04.2015, 02:32 | 18 |
Сообщение от oxytt
Ну тогда лови правильный, но жёсткий ответ-никто не дал верного ответа, все знатоки обосрались
0
|
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
|
|
15.04.2015, 04:14 | 19 |
Сообщение от Редиски
так что обосрался ТС, знатоки лишь зря потратили время пытаясь помочь утром одно
Сообщение от Редиски
Сообщение от Редиски
0
|
0 / 0 / 0
Регистрация: 19.11.2010
Сообщений: 790
|
|
15.04.2015, 06:47 | 20 |
а) Возьми индуктивность и последовательно с ней сопротивление. И наблюдай за напряжением на участках цепи: сначала начиная с момента подачи питания на концы получившейся схемы, потом начиная с момента его отключения. б) Замкни в схеме индуктивность. Повтори эксперимент. Повтори эксперимент с тонкими и длинными проводами. Повтори эксперимент с разными источниками питания.
0
|
15.04.2015, 06:47 | |
15.04.2015, 06:47 | |
Помогаю со студенческими работами здесь
20
АЦП ЦАП Помогите с АЦП Схема АЦП АЦП на Меге48 Proteus АЦП Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |