14-08-2020, 08:00
Właśnie problem mam taki, że nie mam pojęcia jak ustawić ten timer :E
Uskrobałbyś mi, proszę, ten kawałek kodu?
Uskrobałbyś mi, proszę, ten kawałek kodu?
Ocena wątku:
ATTINY24, a PWM z wyjściem przeciwsobnym
|
#include <Arduino.h>
#define Pin_PWM1 5
#define Pin_PWM2 6
volatile uint8_t PWM = 0; // Wypelnienie o
ISR(TIMER1_COMPA_vect) {
digitalWrite(Pin_PWM1,HIGH);
digitalWrite(Pin_PWM2,LOW);
OCR1B = PWM; // 1000 Hz (16000000/((249+1)*64))
}
ISR(TIMER1_COMPB_vect) {
digitalWrite(Pin_PWM1,LOW);
digitalWrite(Pin_PWM2,HIGH);
}
void setup() {
pinMode(Pin_PWM1, OUTPUT);
pinMode(Pin_PWM2, OUTPUT);
///////////// ustawienie timera1 na 1Khz
cli();
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 249; // 1000 Hz (16000000/((249+1)*64))
TCCR1B |= (1 << WGM12);
TCCR1B |= (1 << CS11) | (1 << CS10);
TIMSK1 |= (1 << OCIE1A) | (1 << OCIE1B);
sei();
}
void loop() {
PWM = 125; // wypelnienie około 50% (0-249)
}
#include <Arduino.h>
#define Pin_PWM1 5
#define Pin_PWM2 6
volatile uint8_t PWM = 0; // Wypelnienie o
ISR(TIMER1_COMPA_vect) {
digitalWrite(Pin_PWM1,HIGH);
digitalWrite(Pin_PWM2,LOW);
uint8_t i_ = map(PWM, 0, 100 ,0, 249);
OCR1B = i_; // 1000 Hz (16000000/((249+1)*64))
}
ISR(TIMER1_COMPB_vect) {
digitalWrite(Pin_PWM1,LOW);
digitalWrite(Pin_PWM2,HIGH);
}
void setup() {
pinMode(Pin_PWM1, OUTPUT);
pinMode(Pin_PWM2, OUTPUT);
///////////// ustawienie timera1 na 1Khz
cli();
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 249; // 1000 Hz (16000000/((249+1)*64))
TCCR1B |= (1 << WGM12);
TCCR1B |= (1 << CS11) | (1 << CS10);
TIMSK1 |= (1 << OCIE1A) | (1 << OCIE1B);
sei();
}
void loop() {
PWM = 50; // wypelnienie w procentach
}
void setPwm (int val) {
OCR1A = val;
OCR1B = val;
TCCR1A = 0b10110000 | (TCCR1A & 0b00001111);
}
#include <Arduino.h>
#define Pin_PWM1 5
#define Pin_PWM2 6
volatile uint8_t PWM = 0; // Wypelnienie o
ISR(TIMER1_COMPA_vect) {
digitalWrite(Pin_PWM1,HIGH);
digitalWrite(Pin_PWM2,LOW);
OCR1B = PWM; // 1000 Hz (8000000/((124+1)*64))
}
ISR(TIMER1_COMPB_vect) {
digitalWrite(Pin_PWM1,LOW);
digitalWrite(Pin_PWM2,HIGH);
}
void setup() {
pinMode(Pin_PWM1, OUTPUT);
pinMode(Pin_PWM2, OUTPUT);
///////////// ustawienie timera1 na 1Khz
cli();
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 124; // 1000 Hz (8000000/((124+1)*64))
TCCR1B |= (1 << WGM12);
TCCR1B |= (1 << CS11) | (1 << CS10);
TIMSK1 |= (1 << OCIE1A) | (1 << OCIE1B);
sei();
}
void loop() {
PWM = 62; // wypelnienie około 50% (0-124)
}
#include <Arduino.h>
#define Pin_PWM1 5
#define Pin_PWM2 6
volatile uint8_t PWM = 0; // Wypelnienie o
ISR(TIMER1_COMPA_vect) {
digitalWrite(Pin_PWM1,HIGH);
digitalWrite(Pin_PWM2,LOW);
if(PWM >0){
OCR1B = PWM; // 1000 Hz (8000000/((124+1)*64))
TIMSK1 = 0;
TIMSK1 |= (1 << OCIE1A) | (1 << OCIE1B);
}else{
TIMSK1 = 0;
TIMSK1 |= (1 << OCIE1A) ;
}
}
ISR(TIMER1_COMPB_vect) {
digitalWrite(Pin_PWM1,LOW);
digitalWrite(Pin_PWM2,HIGH);
}
void setup() {
pinMode(Pin_PWM1, OUTPUT);
pinMode(Pin_PWM2, OUTPUT);
///////////// ustawienie timera1 na 1Khz
cli();
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 124; // 1000 Hz (8000000/((124+1)*64))
TCCR1B |= (1 << WGM12);
TCCR1B |= (1 << CS11) | (1 << CS10);
TIMSK1 |= (1 << OCIE1A) ;
sei();
}
void loop() {
PWM = 62; // wypelnienie około 50% (0-124)
}
#include <Arduino.h>
#define Pin_PWM1 5
#define Pin_PWM2 6
volatile uint8_t PWM = 0; // Wypelnienie o
ISR(TIMER1_COMPA_vect) {
digitalWrite(Pin_PWM1,HIGH);
digitalWrite(Pin_PWM2,LOW);
if(PWM >0){
uint8_t i_ = map(PWM, 0, 100 ,0, 125);
OCR1B = i_; // 1000 Hz (8000000/((124+1)*64))
TIMSK1 = 0;
TIMSK1 |= (1 << OCIE1A) | (1 << OCIE1B);
}else{
TIMSK1 = 0;
TIMSK1 |= (1 << OCIE1A) ;
}
}
ISR(TIMER1_COMPB_vect) {
digitalWrite(Pin_PWM1,LOW);
digitalWrite(Pin_PWM2,HIGH);
}
void setup() {
pinMode(Pin_PWM1, OUTPUT);
pinMode(Pin_PWM2, OUTPUT);
///////////// ustawienie timera1 na 1Khz
cli();
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 124; // 1000 Hz (8000000/((124+1)*64))
TCCR1B |= (1 << WGM12);
TCCR1B |= (1 << CS11) | (1 << CS10);
TIMSK1 |= (1 << OCIE1A) ;
sei();
}
void loop() {
PWM = 100; // wypelnienie w %
}
#define Pin_PWM1 5
#define Pin_PWM2 6
int x = 0;
void setup() {
pinMode(Pin_PWM1, OUTPUT);
pinMode(Pin_PWM2, OUTPUT);
}
void setPwm(int val){
OCR1A = val;
OCR1B = val;
TCCR1A = 0b10110000 | (TCCR1A & 0b00001111);
}
void loop() {
x = 511; //0-1023 PWM
setPwm(x);
while(1);
}
(15-08-2020, 20:32)aj123 napisał(a): Niestety, wada jaką zauważyłem jest taka, że nieważne czy ustawię 0% czy 100%, cały czas na tym samym wyjściu mam stan wysoki, a na drugim stan niski :/
(15-08-2020, 21:05)aj123 napisał(a): Nie zrozumieliśmy się; oczekiwałem, że kiedy ustawię wartość PWM na 0%, na wyjściu A dostanę stan niski, a na wyjściu B stan wysoki. Natomiast kiedy ustawię PWM na 100%, będzie odwrotnie - wysoki na A oraz niski na B.
W moim przypadku, nieważne czy ustawiłem 0% czy 100%, cały czas na A był stan niski, a na B wysoki.
#include <Arduino.h>
#define Pin_PWM1 5
#define Pin_PWM2 6
volatile uint8_t PWM = 0; // Wypelnienie o
ISR(TIMER1_COMPA_vect) {
if(PWM >0){
digitalWrite(Pin_PWM1,LOW);
digitalWrite(Pin_PWM2,HIGH);
uint8_t i_ = map(PWM, 0, 100 ,0, 125);
OCR1B = i_; // 1000 Hz (8000000/((124+1)*64))
TIMSK1 = 0;
TIMSK1 |= (1 << OCIE1A) | (1 << OCIE1B);
}else{
digitalWrite(Pin_PWM1,HIGH);
digitalWrite(Pin_PWM2,LOW);
TIMSK1 = 0;
TIMSK1 |= (1 << OCIE1A) ;
}
}
ISR(TIMER1_COMPB_vect) {
digitalWrite(Pin_PWM1,HIGH);
digitalWrite(Pin_PWM2,LOW);
}
void setup() {
pinMode(Pin_PWM1, OUTPUT);
pinMode(Pin_PWM2, OUTPUT);
///////////// ustawienie timera1 na 1Khz
cli();
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 124; // 1000 Hz (8000000/((124+1)*64))
TCCR1B |= (1 << WGM12);
TCCR1B |= (1 << CS11) | (1 << CS10);
TIMSK1 |= (1 << OCIE1A) ;
sei();
}
void loop() {
PWM = 90; // wypelnienie w %
}