저는 ATMEGA1284P로 태양 광 트래커 프로젝트를 진행하고 있습니다. PWM을 구성한 후에는 트래커의 기계적 한계를 발견하여 서보의 경계를 정의 할 시간입니다.푸시 버튼으로 서보 이동 | C | Atmel Studio
이렇게 간단한 코드를 준비했습니다. 나는 PWM이 올바르게 작동하는지 알고있다. (스코프도 함께 체크해 봤지만)이 코드는 작동하지 않는다. 아이디어는 2 개의 푸시 버튼 (GND에 연결된)으로 서보를 움직여서 나중에 UART를 구성하여 현재 서보 위치를 내 컴퓨터로 보낼 수있게하는 것입니다. if 루프 외부에서 pwm_set1 함수를 호출하려고 시도했지만 전혀 응답하지 않습니다.
또한 스위치가 올바르게 배선되어 있고 uC 핀의 전압계로도 확인되었습니다.이 스위치는 누를 때 GND, 즉 GND로 잘 작동합니다. 아래 코드에서 볼 수 있듯이 풀업 저항이 구성되어 있습니다.
모든 의견을 보내 주시면 감사하겠습니다. 감사합니다. 건배, 루이 모레노.
#ifndef F_CPU
#define F_CPU 1000000L // 1 Mhz
#endif
#include <avr/io.h>
#include <avr/portpins.h>
#include <util/delay.h>
void pwm_init(){
// Configurar o Waveform Generation Mode.
// Para modo de fast PWM, WGM11, 12 e 13 têm que estar a 1
TCCR1A |= 1<<WGM11 | 1<<COM1A1 | 0<<COM1A0; // COM1A1 para configurar PWM em modo non- inverted (devido ao BJT) | anterior:COM1A1 e COM1A0 para configurar PWM em inverted mode
TCCR1B |= 1<<WGM13 | 1<<WGM12 | 1<<CS10; // CS10 serve para selecionar o prescaler (nenhum, neste caso)
//Definir o período para PWM
ICR1 = 19999;
OCR1A = ICR1 - 550; // posição inicial do servo
};
void pwm_set1(uint16_t x){
OCR1A = ICR1-x;
}
int main(void)
{
DDRD |= 0xFF; //Configurar Porta D como saída em todos os pinos
pwm_init();
uint16_t posx = 550;
//configurar pinos C1 e C2 como entrada para os switches left e right (just in case)
DDRC &= ~(1 << PC2);
DDRC &= ~(1 << PC3);
//pull-up resistors nos pinos C1 e C2
PORTC |= (1 << PC2);
PORTC |= (1 << PC3);
while(1)
{
if ((PINC & (1<<2)) == 0){
posx+=1;
pwm_set1(posx);
}
if ((PINC & (1<<3)) == 0){
posx-=1;
pwm_set1(posx);
}
}
}