 |

|
Elektronika.lt portalo forumas
Jūs esate neprisijungęs lankytojas. Norint dalyvauti diskusijose, būtina užsiregistruoti ir prisijungti prie forumo.
Prisijungę galėsite kurti naujas temas, atsakyti į kitų užduotus klausimus, balsuoti forumo apklausose.
Administracija pasilieka teisę pašalinti pasisakymus bei dalyvius,
kurie nesilaiko forumo taisyklių.
Pastebėjus nusižengimus, prašome pranešti.
Dabar yra 2025 06 28, 08:13. Visos datos yra GMT + 2 valandos.
|
|
|
 |
Forumas » Mikrovaldikliai » [Išspręsta] Software PWM (Atmega16)
|
Jūs negalite rašyti naujų pranešimų į šį forumą Jūs negalite atsakinėti į pranešimus šiame forume Jūs negalite redaguoti savo pranešimų šiame forume Jūs negalite ištrinti savo pranešimų šiame forume Jūs negalite dalyvauti apklausose šiame forume
|
|
|
 |
 |
[Išspręsta] Software PWM (Atmega16) |
Parašytas: 2011 04 13, 13:05 |
|
|
|
Sveiki, noriu ant atmega16 pajudinti 12 servo mechanizmų (Naudoju vidinį kvarcą: 8Mhz).
Teoriją žinau, koks signalas turi būti ir t.t. Problema tame, jog esu visiškai žalias ant timer'ių, gal kas gali pradžiai užvesti kur galima apie juos pasiskaityti plačiau. Bandžiau ant proteus eksperimentuoti, bet jaučiu, kad trūksta pačių pagrindų, o kur juos įgyti nelabai žinau.
Manęs netinkina ši kodas, nes reikia pasukinėti bent 6 servo mechanizmus skirtingomis pozicijomis vienu metu:
Citata: |
while(1)
{
PORTA ^=(1<<PD0);
_delay_ms( 2 );
PORTA ^=(1<<PD0);
_delay_ms( 18 );
} |
|
|
Paskutinį kartą redagavo Pihas, 2011 05 05, 13:54. Redaguota 1 kartą |
|
|
|
 |
 |
[Išspręsta] Software PWM (Atmega16) |
Parašytas: 2011 04 13, 13:26 |
|
|
|
Kazkada dariau kazka panasaus, bet taip ir nebaigiau... Veikia bet rezoliuzija nedidele. Teks paciam persiskaiciuot taimerio perioda pagal uc dazni ir norima signalo perioda.
Kodas: |
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util\delay.h>
//#include <avr\sleep.h>
#define LED_PORT_DIR DDRA
#define LED_PORT0 PORTA
#define LED_PORT1 PORTC
#define LED_PORT2 PORTD
#define PORT_MASK (1<<PA0)|(1<<PA1)|(1<<PA2)|(1<<PA3)|(1<<PA4)|(1<<PA5)|(1<<PA6)|(1<<PA7)
#define CH0_CLEAR (LED_PORT0 &= ~(1<<PA0)) // map CH0 to PA0
#define CH1_CLEAR (LED_PORT0 &= ~(1<<PA1)) // map CH1 to PA1
#define CH2_CLEAR (LED_PORT0 &= ~(1<<PA2)) // map CH2 to PA2
#define CH3_CLEAR (LED_PORT0 &= ~(1<<PA3)) // map CH2 to PA3
#define CH4_CLEAR (LED_PORT0 &= ~(1<<PA4)) // map CH2 to PA4
#define CH5_CLEAR (LED_PORT0 &= ~(1<<PA5)) // map CH2 to PA5
#define CH6_CLEAR (LED_PORT0 &= ~(1<<PA6)) // map CH2 to PA6
#define CH7_CLEAR (LED_PORT0 &= ~(1<<PA7)) // map CH2 to PA7
#define CH8_CLEAR (LED_PORT1 &= ~(1<<PA0)) // map CH0 to PA0
#define CH9_CLEAR (LED_PORT1 &= ~(1<<PA1)) // map CH1 to PA1
#define CH10_CLEAR (LED_PORT1 &= ~(1<<PA2)) // map CH2 to PA2
#define CH11_CLEAR (LED_PORT1 &= ~(1<<PA3)) // map CH2 to PA3
#define CH12_CLEAR (LED_PORT1 &= ~(1<<PA4)) // map CH2 to PA4
#define CH13_CLEAR (LED_PORT1 &= ~(1<<PA5)) // map CH2 to PA5
#define CH14_CLEAR (LED_PORT1 &= ~(1<<PA6)) // map CH2 to PA6
#define CH15_CLEAR (LED_PORT1 &= ~(1<<PA7)) // map CH2 to PA7
#define CH16_CLEAR (LED_PORT2 &= ~(1<<PA0)) // map CH0 to PA0
#define CH17_CLEAR (LED_PORT2 &= ~(1<<PA1)) // map CH1 to PA1
#define CH18_CLEAR (LED_PORT2 &= ~(1<<PA2)) // map CH2 to PA2
#define CH19_CLEAR (LED_PORT2 &= ~(1<<PA3)) // map CH2 to PA3
#define CH20_CLEAR (LED_PORT2 &= ~(1<<PA4)) // map CH2 to PA4
#define CH21_CLEAR (LED_PORT2 &= ~(1<<PA5)) // map CH2 to PA5
#define CH22_CLEAR (LED_PORT2 &= ~(1<<PA6)) // map CH2 to PA6
#define CH23_CLEAR (LED_PORT2 &= ~(1<<PA7)) // map CH2 to PA7
//volatile unsigned char compbuff[3];
volatile unsigned char compare[24];
void init(void)
{
compare[0] = 10;
compare[1] = 100;
compare[2] = 10;
compare[3] = 200;
compare[4] = 50;
compare[5] = 5;
compare[6] = 150;
compare[7] = 1;
compare[8] = 10;
compare[9] = 20;
compare[10] = 100;
compare[11] = 50;
compare[12] = 25;
compare[13] = 15;
compare[14] = 80;
compare[15] = 100;
compare[16] = 70;
compare[17] = 111;
compare[18] = 11;
compare[19] = 5;
compare[20] = 55;
compare[21] = 77;
compare[22] = 160;
compare[23] = 11;
DDRA |= PORT_MASK;
DDRD |= PORT_MASK;
DDRC |= PORT_MASK;
ICR1 = 255;
TCCR1A = (1<<WGM11);
TCCR1B = (1<<WGM12)|(1<<WGM13);
TIMSK |= (1<<TOIE1);
TCCR1B |= (1<<CS10); //|(1<<CS12);
sei();
}
///////////////////////////////////////////////////////////////////
int main(void){
init(); //
unsigned char status = 1;
for(;;){
compare[5]--;
compare[6]+=2;
compare[7]++;
if (compare[8]<13){
compare[8]=13;
status = 1;
}
if (compare[8]>25){
compare[8]=25;
status = 0;
}
if (status == 0)
compare[8]--;
if (status == 1)
compare[8]++;
_delay_ms(25);
}
}
/* ------------------------------------------------------------------------- */
ISR(TIMER1_OVF_vect) //Timer1 overflow vector
{
static unsigned char SoftCount = 0xFF;
if(++SoftCount == 0) {// Increment till 255 and update when counter = 0.
LED_PORT0 |= PORT_MASK; // Set all port pins high
LED_PORT1 |= PORT_MASK; // Set all port pins high
LED_PORT2 |= PORT_MASK; // Set all port pins high
}
// Clear port pin on compare match
if (compare[0] == softcount) CH0_CLEAR;
if (compare[1] == softcount) CH1_CLEAR;
if (compare[2] == softcount) CH2_CLEAR;
if (compare[3] == softcount) CH3_CLEAR;
if (compare[4] == softcount) CH4_CLEAR;
if (compare[5] == softcount) CH5_CLEAR;
if (compare[6] == softcount) CH6_CLEAR;
if (compare[7] == softcount) CH7_CLEAR;
if (compare[8] == softcount) CH8_CLEAR;
if (compare[9] == softcount) CH9_CLEAR;
if (compare[10] == softcount) CH10_CLEAR;
if (compare[11] == softcount) CH11_CLEAR;
if (compare[12] == softcount) CH12_CLEAR;
if (compare[13] == softcount) CH13_CLEAR;
if (compare[14] == softcount) CH14_CLEAR;
if (compare[15] == softcount) CH15_CLEAR;
if (compare[16] == softcount) CH16_CLEAR;
if (compare[17] == softcount) CH17_CLEAR;
if (compare[18] == softcount) CH18_CLEAR;
if (compare[19] == softcount) CH19_CLEAR;
if (compare[20] == softcount) CH20_CLEAR;
if (compare[21] == softcount) CH21_CLEAR;
if (compare[22] == softcount) CH22_CLEAR;
if (compare[23] == softcount) CH23_CLEAR;
} |
|
|
|
|
|
 |
 |
[Išspręsta] Software PWM (Atmega16) |
Parašytas: 2011 05 05, 13:50 |
|
|
|
Visgi neperkandau timer'ių laiku, tai teko suktis su tuo ką turėjau, todėl parašiau programą keturkojui robotui vien tik su _delay_ms ir be problemų pasukinėja 12 servo mechanizmų (Nepriklausomai valdomi). Aišku daug vietos tobulinimui ir t.t. Nes dabar iš proporcinio valdymo realiai padarytas analoginis, kairė, dešinė, centras.
Gal, kas su panašia problema susidurs, turėtų be problemų suktis ir ant atmegos32, atmegos8 tereikia tik dažnį taktinį nurodyt.
Kodas: |
#define F_CPU 8000000UL
#include<avr/io.h>
#include<util/delay.h>
#define true 1
#define false 0
#define A 1
#define B 2
#define C 3
#define D 4
// Servų žymenys
#define KVP 3
#define KVA 1
#define KVK 2
#define KAP 4
#define KAA 5
#define KAK 6
#define DVP 0
#define DVA 1
#define DVK 2
#define DAP 1
#define DAA 0
#define DAK 7
#define RGB_Melyna 3
#define RGB_Zalia 4
#define RGB_Raudona 5
// Servo mechanizmų pozicijos (Signalo ilgis ms)
#define Kaire -1
#define Vidurys 0
#define Desine 1
#define Periodas 20.0
// Roboto Veiksmai
#define Stoveti 0
#define JudetiTiesiai 1
int KVP_, KVA_, KVK_, KAP_, KAA_, KAK_, DVP_, DVA_, DVK_, DAP_, DAA_, DAK_;
int i, Ciklu = 1, Zingsniai = 3, StabdytiPWM = false;
void OFF(int Portas, int Id)
{
switch(Portas)
{
case A: PORTA ^= (1 << Id); break;
case B: PORTB ^= (1 << Id); break;
case C: PORTC ^= (1 << Id); break;
case D: PORTD ^= (1 << Id); break;
}
}
void Ijungti_Servu_Isejimus() //Įjungia
{
OFF(A, DVP); OFF(A, DVA); OFF(A, DVK);
OFF(B, KVP); OFF(B, KVA); OFF(B, KVK);
OFF(C, DAP); OFF(C, DAA); OFF(D, DAK);
OFF(D, KAP); OFF(D, KAA); OFF(D, KAK);
}
void PWM_Generavimas_Servam()
{
if (!StabdytiPWM)
{
Ijungti_Servu_Isejimus();
_delay_ms(0.5);
_delay_ms(0.5); //Dešine (1.0ms)
if (DVP_ > 0){OFF(A, DVP);} if(DVA_ > 0){OFF(A, DVA);} if(DVK_ > 0){OFF(A, DVK);}
if (KVP_ > 0){OFF(B, KVP);} if(KVA_ > 0){OFF(B, KVA);} if(KVK_ > 0){OFF(B, KVK);}
if (DAP_ > 0){OFF(C, DAP);} if(DAA_ > 0){OFF(C, DAA);} if(DAK_ > 0){OFF(D, DAK);}
if (KAP_ > 0){OFF(D, KAP);} if(KAA_ > 0){OFF(D, KAA);} if(KAK_ > 0){OFF(D, KAK);}
_delay_ms(0.5); //Vidurys (1.5ms)
if (!DVP_) {OFF(A, DVP);} if (!DVA_){OFF(A, DVA);} if (!DVK_){OFF(A, DVK);}
if (!KVP_) {OFF(B, KVP);} if (!KVA_){OFF(B, KVA);} if (!KVK_){OFF(B, KVK);}
if (!DAP_) {OFF(C, DAP);} if (!DAA_){OFF(C, DAA);} if (!DAK_){OFF(D, DAK);}
if (!KAP_) {OFF(D, KAP);} if (!KAA_){OFF(D, KAA);} if (!KAK_){OFF(D, KAK);}
_delay_ms(0.5); // Kaire
if (DVP_ < 0){OFF(A, DVP);} if(DVA_ < 0){OFF(A, DVA);} if(DVK_ < 0){OFF(A, DVK);}
if (KVP_ < 0){OFF(B, KVP);} if(KVA_ < 0){OFF(B, KVA);} if(KVK_ < 0){OFF(B, KVK);}
if (DAP_ < 0){OFF(C, DAP);} if(DAA_ < 0){OFF(C, DAA);} if(DAK_ < 0){OFF(D, DAK);}
if (KAP_ < 0){OFF(D, KAP);} if(KAA_ < 0){OFF(D, KAA);} if(KAK_ < 0){OFF(D, KAK);}
_delay_ms(18.0);
}
}
void Uzmigdyti()
{
KVP_ = 0; DVP_ = 0;
KVA_ = Kaire; DVA_ = Desine;
KVK_ = Kaire; DVK_ = Desine;
KAP_ = 0; DAP_ = 0;
KAA_ = Kaire; DAA_ = Desine;
KAK_ = Kaire; DAK_ = Desine;
}
int main(void)
{
Uzmigdyti(); // Kojų pradžios pozicijos
DDRA = 0xFF;
DDRB = 0xFF;
DDRC = 0xFF;
DDRD = 0xFF;
int Veiksmas = JudetiTiesiai;
// Įjungiamas RGB Diodas
PORTA = (1 << RGB_Melyna);
while(1)
{
PWM_Generavimas_Servam();
//PORTA = (0 << RGB_Melyna);
switch(Veiksmas)
{
case Stoveti:
break;
case JudetiTiesiai:
// Ciklu++;
// if (Ciklu == 4)
// {
// _delay_ms(30);
// Ciklu = 0;
// }
i++;
if ((i > 100)&&(i < 200))
{
KVP_ = 0; DVP_ = 0;
KVA_ = Kaire; DVA_ = Desine;
KVK_ = Kaire; DVK_ = Desine;
KAP_ = 0; DAP_ = 0;
KAA_ = Kaire; DAA_ = Desine;
KAK_ = Kaire; DAK_ = Desine;
}
if ((i > 200)&&(i < 225)) {
KVP_ = 0; DVP_ = 0;
KVA_ = 0; DVA_ = 0;
KVK_ = 0; DVK_ = 0;
KAP_ = 0; DAP_ = 0;
KAA_ = 0; DAA_ = 0;
KAK_ = 0; DAK_ = 0;
}
PORTA = (0 << RGB_Melyna);
PORTA = (1 << RGB_Raudona);
if ((i > 225)&&(i < 250)) {
KVP_ = 0; DVP_ = 0;
KVA_ = 0; DVA_ = Desine;
KVK_ = 0; DVK_ = 0;
KAP_ = 0; DAP_ = 0;
KAA_ = 0; DAA_ = 0;
KAK_ = 0; DAK_ = 0;
}
if ((i > 250)&&(i < 275)) {
KVP_ = 0; DVP_ = Desine;
KVA_ = 0; DVA_ = Desine;
KVK_ = 0; DVK_ = 0;
KAP_ = 0; DAP_ = 0;
KAA_ = 0; DAA_ = 0;
KAK_ = 0; DAK_ = 0;
}
if ((i > 300)&&(i < 325)) {
KVP_ = 0; DVP_ = Desine;
KVA_ = 0; DVA_ = 0;
KVK_ = 0; DVK_ = 0;
KAP_ = 0; DAP_ = 0;
KAA_ = 0; DAA_ = 0;
KAK_ = 0; DAK_ = 0;
}
if ((i > 325)&&(i < 350)) {
KVP_ = 0; DVP_ = Desine;
KVA_ = Kaire; DVA_ = 0;
KVK_ = 0; DVK_ = 0;
KAP_ = 0; DAP_ = 0;
KAA_ = 0; DAA_ = 0;
KAK_ = 0; DAK_ = 0;
}
if ((i > 350)&&(i < 375)) {
KVP_ = Kaire; DVP_ = Desine;
KVA_ = Kaire; DVA_ = 0;
KVK_ = 0; DVK_ = 0;
KAP_ = 0; DAP_ = 0;
KAA_ = 0; DAA_ = 0;
KAK_ = 0; DAK_ = 0;
}
if ((i > 400)&&(i < 425)) {
KVP_ = Kaire; DVP_ = Desine;
KVA_ = 0; DVA_ = 0;
KVK_ = 0; DVK_ = 0;
KAP_ = 0; DAP_ = 0;
KAA_ = 0; DAA_ = 0;
KAK_ = 0; DAK_ = 0;
}
if ((i > 425)&&(i < 450)) {
KVP_ = 0; DVP_ = 0;
KVA_ = 0; DVA_ = 0;
KVK_ = 0; DVK_ = 0;
KAP_ = Desine; DAP_ = Kaire;
KAA_ = 0; DAA_ = 0;
KAK_ = 0; DAK_ = 0;
}
// Kartojas tik tiek, kad ant užpakaliniu kojų
if ((i > 450)&&(i < 500)) {
KVP_ = 0; DVP_ = 0;
KVA_ = 0; DVA_ = 0;
KVK_ = 0; DVK_ = 0;
KAP_ = Desine; DAP_ = Kaire;
KAA_ = 0; DAA_ = 0;
KAK_ = 0; DAK_ = 0;
}
if ((i > 500)&&(i < 525)) {
KVP_ = 0; DVP_ = 0;
KVA_ = 0; DVA_ = 0;
KVK_ = 0; DVK_ = 0;
KAP_ = Desine; DAP_ = Kaire;
KAA_ = 0; DAA_ = Desine;
KAK_ = 0; DAK_ = 0;
}
if ((i > 550)&&(i < 575)) {
KVP_ = 0; DVP_ = 0;
KVA_ = 0; DVA_ = 0;
KVK_ = 0; DVK_ = 0;
KAP_ = Desine; DAP_ = 0;
KAA_ = 0; DAA_ = Desine;
KAK_ = 0; DAK_ = 0;
}
if ((i > 600)&&(i < 625)) {
KVP_ = 0; DVP_ = 0;
KVA_ = 0; DVA_ = 0;
KVK_ = 0; DVK_ = 0;
KAP_ = Desine; DAP_ = 0;
KAA_ = 0; DAA_ = Desine;
KAK_ = 0; DAK_ = 0;
}
if ((i > 625)&&(i < 650)) {
KVP_ = 0; DVP_ = 0;
KVA_ = 0; DVA_ = 0;
KVK_ = 0; DVK_ = 0;
KAP_ = Desine; DAP_ = 0;
KAA_ = 0; DAA_ = 0;
KAK_ = 0; DAK_ = 0;
}
if ((i > 675)&&(i < 700)) {
KVP_ = 0; DVP_ = 0;
KVA_ = 0; DVA_ = 0;
KVK_ = 0; DVK_ = 0;
KAP_ = Desine; DAP_ = 0;
KAA_ = Kaire; DAA_ = 0;
KAK_ = 0; DAK_ = 0;
}
if ((i > 725)&&(i < 750)) {
KVP_ = 0; DVP_ = 0;
KVA_ = 0; DVA_ = 0;
KVK_ = 0; DVK_ = 0;
KAP_ = 0; DAP_ = 0;
KAA_ = Kaire; DAA_ = 0;
KAK_ = 0; DAK_ = 0;
}
if ((i > 750)&&(i < 775)) {
KVP_ = 0; DVP_ = 0;
KVA_ = 0; DVA_ = 0;
KVK_ = 0; DVK_ = 0;
KAP_ = 0; DAP_ = 0;
KAA_ = 0; DAA_ = 0;
KAK_ = 0; DAK_ = 0;
}
if (i > 775) {
KVP_ = 0; DVP_ = 0;
KVA_ = Kaire; DVA_ = Desine;
KVK_ = Kaire; DVK_ = Desine;
KAP_ = 0; DAP_ = 0;
KAA_ = Kaire; DAA_ = Desine;
KAK_ = Kaire; DAK_ = Desine;
}
break;
}
}
return 0;
}
|
Vakare jei nepamiršiu įmesiu ir fotkę, kaip šis aparatas atrodo |
|
|
|
|
 |
 |
[Išspręsta] Software PWM (Atmega16) |
Parašytas: 2011 05 06, 21:55 |
|
|
|
Pihas rašo: |
Kolkas juda tik į priekį ir tai virsdamas
 |
nu grazus zveris
nu va pagaliau konkurentas bus, ir kazkas panasaus i mano zveri.
o valdosi jis kaip? |
|
|
|
|
|
 |
Google paieška forume |
|
 |
Naujos temos forume |
|
 |
FS25 Tractors
Farming Simulator 25 Mods,
FS25 Maps,
FS25 Trucks |
 |
ETS2 Mods
ETS2 Trucks,
ETS2 Bus,
Euro Truck Simulator 2 Mods
|
 |
FS22 Tractors
Farming Simulator 22 Mods,
FS22 Maps,
FS25 Mods |
 |
VAT calculator
VAT number check,
What is VAT,
How much is VAT |
 |
FS25 Mods
FS25 Harvesters,
FS25 Tractors Mods,
FS25 Maps Mods |
 |
Dantų protezavimas
All on 4 implantai,
Endodontija mikroskopu,
Dantų implantacija |
 |
FS25 Mods
FS25 Maps,
FS25 Cheats,
FS25 Install Mods |
 |
FS25 Mods
Farming Simulator 25 Mods,
FS25 Maps |
 |
ATS Trailers
American Truck Simulator Mods,
ATS Trucks,
ATS Maps |
 |
Football Training Kit
Football Training Equipment,
Football Skills,
Football Training |
|

|
 |