Atmega8, ацп, потенциометр, бесколлекторник и вопросы

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 9
Зарегистрирован: Пт фев 22, 2013 06:40:26
Откуда: Россия, Чита

Сообщение Savrula »

всем доброго времени.
Задача: плавно регулировать обороты бесколлекторного двигателя, вращая потенциометр, используя ацп, в роли генератора таймер меги. забыл сказать, двигатель работает на микросхеме драйвера lb11872 нужно только подать питание, подать частоту (которую и нужно регулировать) и посадить на землю пин разрешения вращения.
вопросы:1) в режиме непрерывного преобразования, после того как программа заходит в обработчик прерываний ацп, бит adsс сбрасывается в 0, и в 1 не устанавливается, хотя должен как я понял из разных источников, посему я заново прописываю регистр ADCSRA
2) не получается сделать эту самую регулировку, принцип которой- оцифровка, к некоему значению из таблицы прибавляем результат ацп, получаем ячейку либо цыфру (которая +- частоту генератора).
Спойлер
  • ;********************************************************************
    ; 4,0 Ìãö
    ;********************************************************************
    .include "m8def.inc"
    ;********************************************************************

    ;********************************************************************



    ;********************************************************************
    ;((fclk/(2*êîýô. äåë.))/íóæíóþ ÷àñòîòó)=ÖÛÔÐÓ (timer_c) OCR1AH/L

    .def temp= r16 ;
    .def temp_1=r17 ;
    ;********************************************************************
    ; Èíèöèàëèçàöèÿ êîíòðîëëåðà
    ;********************************************************************

    .org 0 ; Âåêòîð ñáðîñà
    rjmp reset ; ïðîöåññîðà



    .org OC1Aaddr
    rjmp TIM1_COMPAB ; Timer1 CompareA Handler
    .org ADCCaddr
    rjmp complete // ïåðåõîä ïî ìåòêå



    ;********************************************************************

    reset:

    ;********************************************************************
    ;Óñòàíîâêà óêàçàòåëÿ ñòåêà
    ;********************************************************************
    ldi temp, low(RAMEND)
    out SPL, Temp
    ldi temp, high(RAMEND)
    out SPH, Temp
    ;********************************************************************
    ;íàñòðîéêà ïîðòîâ
    ;********************************************************************
    ldi temp, 0xFF ; âñå ïîðòû PB
    out DDRB, temp ; íà âûõîä

    // íàñòðîéêà àöï
    ldi r18,0b00100000 //(1<<ADEN)|(1<<ADIE)|(1<<ADFR)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)//âêëþ÷åíèå àöï, ïðåðûâàíèÿ ðàçðåøåíû, äåëèòåëü 128, íåïðåðûâíî
    out ADMUX, r18
    ldi r18,0b11101110 //(1<<ADLAR)|(1<<REFS1)|(0<<REFS0) //òî÷íîñòü 8 áèò
    out ADCSRA, r18

    ;********************************************************************
    ; óñòàíîâêà òàéìåðà
    ;********************************************************************
    ldi temp, 0 ;
    out TCNT1H, temp ;
    out TCNT1L, temp ;
    out TCCR1A, temp ;
    ldi temp, (1<<WGM12)|(0<<CS12)|(0<<CS11)|(1<<CS10); clk/1,
    out TCCR1B, temp ; ðåæèì CTC
    ldi temp, high(500) ; ñòàðøèé
    out OCR1AH, temp ; áàéò ê.ä.
    ldi temp, low(500) ; ìëàäøèé
    out OCR1AL, temp ; áàéò ê.ä
    ldi temp, (1<<OCIE1A) ; ðàçðåøåíèå ïðåðûâàíèé
    out TIMSK, temp ; ïî ñîâïàäåíèþ
    ldi temp_1, 0 ; îáíóëèì temp_1



    ;********************************************************************
    ;Îñíîâíàÿ ïðîãðàììà
    ;********************************************************************

    sei ; ðàçðåøåíèå ïðåðûâàíèé
    loop:

    rjmp loop ; âå÷íûé öèêë

    ;********************************************************************
    ; îáðàáîò÷èê ïðåðûâàíèé òàéìåðà
    ;********************************************************************
    TIM1_COMPAB: in temp, SREG ; ????????
    push temp ; SREG
    com temp_1 ;
    andi temp_1, 0b11111111 ; îñòàâèì 0-îé áèò
    out PORTB, temp_1 ; âûâîä â ïîðò

    pop temp ; SREG
    out SREG, temp ; âîññòàíîâèì


    reti ; âûõîä èç ïðåðûâàíèÿ
    ;********************************************************************
    //îáðàáîò÷èê ïðåðûâàíèé àöï
    complete:

    in r19,ADCH //çàïèñàòü ïðåîáðàçîâàíèå â ð19
    ldi ZL,low(Table*2) //çàïèñàòü â Z Table:
    ldi ZH,high(Table*2)
    adc ZL, r19//add ZH, r19
    //ADC Zl, r19//ê Z + r19 = íóæíóþ ÿ÷åéêó
    //ADC ZH, r19
    lpm r0, Z //lpm ñ÷èòûâàåò è çàïèñûâàåò â OCR
    //movw r20, r0
    out OCR1AL,r0
    out OCR1AH,r0
    //adc ZH,r19
    //lpm r21, Z
    //out OCR1AH,r21

    ldi r18,0b11101110 //(1<<ADLAR)|(1<<REFS1)|(0<<REFS0) //òî÷íîñòü 8 áèò
    out ADCSRA, r18

    reti


    Table:
    .dw 625
    .dw 624
    .dw 623
    .dw 622
    .dw 621
    .dw 620
    .dw 619
    .dw 618
    .dw 617
    .dw 616
    .dw 615
    .dw 614
    .dw 613
    .dw 612
    .dw 611
    .dw 610
    .dw 609
    .dw 608
    .dw 607
    .dw 606
    .dw 605
    .dw 604
    .dw 603
    .dw 602
    .dw 601
    .dw 600
    .dw 599
    .dw 598
    .dw 597
    .dw 596
    .dw 595
    .dw 594
    .dw 593
    .dw 592
    .dw 591
    .dw 590
    .dw 589
    .dw 588
    .dw 587
    .dw 586
    .dw 585
    .dw 584
    .dw 583
    .dw 582
    .dw 581
    .dw 580
    .dw 579
    .dw 578
    .dw 577
    .dw 576
    .dw 575
    .dw 574
    .dw 573
    .dw 572
    .dw 571
    .dw 570
    .dw 569
    .dw 568
    .dw 567
    .dw 566
    .dw 565
    .dw 564
    .dw 563
    .dw 562
    .dw 561
    .dw 560
    .dw 559
    .dw 558
    .dw 557
    .dw 556
    .dw 555
    .dw 554
    .dw 553
    .dw 552
    .dw 551
    .dw 550
    .dw 549
    .dw 548
    .dw 547
    .dw 546
    .dw 545
    .dw 544
    .dw 543
    .dw 542
    .dw 541
    .dw 540
    .dw 539
    .dw 538
    .dw 537
    .dw 536
    .dw 535
    .dw 534
    .dw 533
    .dw 532
    .dw 531
    .dw 530
    .dw 529
    .dw 528
    .dw 527
    .dw 526
    .dw 525
    .dw 524
    .dw 523
    .dw 522
    .dw 521
    .dw 520
    .dw 519
    .dw 518
    .dw 517
    .dw 516
    .dw 515
    .dw 514
    .dw 513
    .dw 512
    .dw 511
    .dw 510
    .dw 509
    .dw 508
    .dw 507
    .dw 506
    .dw 505
    .dw 504
    .dw 503
    .dw 502
    .dw 501
    .dw 500
    .dw 499
    .dw 498
    .dw 497
    .dw 496
    .dw 495
    .dw 494
    .dw 493
    .dw 492
    .dw 491
    .dw 490
    .dw 489
    .dw 488
    .dw 487
    .dw 486
    .dw 485
    .dw 484
    .dw 483
    .dw 482
    .dw 481
    .dw 480
    .dw 479
    .dw 478
    .dw 477
    .dw 476
    .dw 475
    .dw 474
    .dw 473
    .dw 472
    .dw 471
    .dw 470
    .dw 469
    .dw 468
    .dw 467
    .dw 466
    .dw 465
    .dw 464
    .dw 463
    .dw 462
    .dw 461
    .dw 460
    .dw 459
    .dw 458
    .dw 457
    .dw 456
    .dw 455
    .dw 454
    .dw 453
    .dw 452
    .dw 451
    .dw 450
    .dw 449
    .dw 448
    .dw 447
    .dw 446
    .dw 445
    .dw 444
    .dw 443
    .dw 442
    .dw 441
    .dw 440
    .dw 439
    .dw 438
    .dw 437
    .dw 436
    .dw 435
    .dw 434
    .dw 433
    .dw 432
    .dw 431
    .dw 430
    .dw 429
    .dw 428
    .dw 427
    .dw 426
    .dw 425
    .dw 424
    .dw 423
    .dw 422
    .dw 421
    .dw 420
    .dw 419
    .dw 418
    .dw 417
    .dw 416
    .dw 415
    .dw 414
    .dw 413
    .dw 412
    .dw 411
    .dw 410
    .dw 409
    .dw 408
    .dw 407
    .dw 406
    .dw 405
    .dw 404
    .dw 403
    .dw 402
    .dw 401
    .dw 400
    .dw 399
    .dw 398
    .dw 397
    .dw 396
    .dw 395
    .dw 394
    .dw 393
    .dw 392
    .dw 391
    .dw 390
    .dw 389
    .dw 388
    .dw 387
    .dw 386
    .dw 385
    .dw 384
    .dw 383
    .dw 382
    .dw 381
    .dw 380
    .dw 379
    .dw 378
    .dw 377
    .dw 376
    .dw 375
    .dw 374
    .dw 373
    .dw 372
    .dw 371
    .dw 370
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

Вот, если честно, то вообще не понятен метод определния значения для генератора, если делать выборку по таблице в зависимости от АЦП, то в таблице уже иметь готовые значения, а не относительные, или второй вариант, если отталкиваться от АЦП, тогда берем некую константу без таблицы и умножаем на значение АЦП.
Реклама
Родился
Сообщения: 9
Зарегистрирован: Пт фев 22, 2013 06:40:26
Откуда: Россия, Чита

Сообщение Savrula »

делать выборку по таблице в зависимости от АЦП, то в таблице уже иметь готовые значения, а не относительные
я этого и хочу
.dw там 256 строк, первая заносится в регистровую пару Z, к ней прибавляем содержимое регистра ADCH после оцифровки, далее считываем из Zи записываем в OCR1AH/L, и меняется частота - я правильно веду мысль?
orinoko

Сообщение orinoko »

Вот не соответствует ваше желание с вашей программой
complete:

in r19,ADCH //çàïèñàòü ïðåîáðàçîâàíèå â ð19
ldi ZL,low(Table*2) //çàïèñàòü â Z Table:
ldi ZH,high(Table*2)
adc ZL, r19//add ZH, r19
complete:

in r19,ADCH //çàïèñàòü ïðåîáðàçîâàíèå â ð19
ldi ZL,low(Table*2) //çàïèñàòü â Z Table:
ldi ZH,high(Table*2)
add ZL, r19//add ZH, r19
ldi r19,0
adc ZH, r19


причём достаточно пройтись отладчиком 1 раз
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 9
Зарегистрирован: Пт фев 22, 2013 06:40:26
Откуда: Россия, Чита

Сообщение Savrula »

причём достаточно пройтись отладчиком 1 раз
Да действительно, около часа погонял отладчик, решил обновить листинг на форуме и увидел пост Orinoko, благодарен, что уделили время.
Спойлер
  • //îáðàáîò÷èê ïðåðûâàíèé àöï
    complete:
    ldi ZL,low(Table*2) //çàïèñàòü â Z Table:
    ldi ZH,high(Table*2)
    in r19,ADCH //çàïèñàòü ïðåîáðàçîâàíèå â ð19
    ldi r20,0
    add ZL, r19
    adc ZH, r20
    lpm r20,Z //lpm ñ÷èòûâàåò è çàïèñûâàåò â OCR r30 r31
    lpm r21, Z
    out OCR1AH,r20
    out OCR1AL,r21
    ldi r18,0b11101110 //(1<<ADLAR)|(1<<REFS1)|(0<<REFS0) //òî÷íîñòü 8 áèò
    out ADCSRA, r18
    reti
получилось вот, как я понял у меня в OCR1AH и L одинаковые значения, и я не мог выдернуть младший бит из Z, сейчас по отладчику все работает как нужно, но в протеусе откровенная галиматья, начинается 200 Гц с небольшим, следующее значение 300 с небольшим, следующее чуть больше 3кГц, затем 500 с хвостиком, и т.д., закономерности я в этих цифрах не увидел, вероятно мне нужно править цыфры в табличке откуда я беру значения или ктонить увидел в коде ошибку? это моя 4 программа, с учетом что 3 были практикой на занятиях и писались в 10 лиц)
Реклама
orinoko

Сообщение orinoko »

...
add ZL, r19
adc ZH, r20
lpm r20,Z //lpm ñ÷èòûâàåò è çàïèñûâàåò â OCR r30 r31
adiw Z, 1
lpm r21, Z
...

Правда я не помню, как записываются в памяти числа DW - младший-старший или наоборот
-------------------------
хотя стоп...
У вас таблица 2-байтных чисел. чё та я сразу не заметил. :oops: Тогда немного иначе выборку из таблицы делать. И непонятно, как у вас в отладчике всё правильно
Ваши пояснения в программе кракозяблами сбивают с мысли.
Реклама
orinoko

Сообщение orinoko »

...
ldi ZL,low(Table*2) //çàïèñàòü â Z Table:
ldi ZH,high(Table*2)
in r19,ADCH //çàïèñàòü ïðåîáðàçîâàíèå â ð19
ldi r20,0
lsl r19
rol r20

add ZL, r19
adc ZH, r20
lpm r20,Z //lpm ñ÷èòûâàåò è çàïèñûâàåò â OCR r30 r31
adiw Z, 1
lpm r21, Z
out OCR1AH,r20
out OCR1AL,r21
...
как-то так
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Для того, чтобы комменты нормально отрображались код копировать не из редактора, а лучше прикладывать файл Исходника.
Можно еще скопировать из блокнота, но проще файл добавить.
Контактная информация:
Родился
Сообщения: 9
Зарегистрирован: Пт фев 22, 2013 06:40:26
Откуда: Россия, Чита

Сообщение Savrula »

сейчас пока времени нет обо всем написать, а кракозябры это пометки для меня, типа записали таблицу, считали что-нить и тд, чтоб по забыванию значения команды например не лесть в таблицу с описанием.
применив вышеописанные советы получилась регулировка от 3кГц (0 V) - до 3172 Гц (около 0.5V) а дальше при при повороте ручки потенциометра частота не изменяется.
А насчет того как я копаюсь в отладчике, вписываю в ADCH число от 0 до 255 (точность ацп 8 бит), иду в обработчик прерываний ацп, и после всех операций смотрю что записывается в OCR1AH/L и сравниваю с таблицей с учетом того что вписал в ADCH, беру несколько значений с разбросом например - 10,110,210 и собственно вписывает то что в таблице в строке 11,111,211 (считаю строки с 1). жду замечаний, советов и т.д.
спасибо, что уделяете мне время.
Вложения
projects.rar
программа и файл протеуса
(17.75 КБ) 153 скачивания
Родился
Сообщения: 9
Зарегистрирован: Пт фев 22, 2013 06:40:26
Откуда: Россия, Чита

Сообщение Savrula »

проблема решилась, в силу невнимательности не добавил питание самого ацп модуля в протеусе, и немного поковырял программу преподаватель.
Спасибо всем кто уделил внимание моему вопросу, готовый проект прилагаю.
Вложения
Архив WinRAR.rar
исходники и проект протеуса
(28.7 КБ) 182 скачивания
Ответить

Вернуться в «AVR»