| 1. 컴파일러등의 개발환경 : 코드비젼
| 2. 회로나 소스코드의 제어목적: 비절연형 buck_boost 컨버터 출력 pwm duty 제어
| 3. 증상과 예상되는 문제점 : 소스코드 문제인지 동작이 안됨
안녕하십니까 ~
눈팅만 하고 혼자 공부하다가 이렇게 글을 올립니다 ..
현재 atmega128을 이용하여 DC-DC변환장치를 제어해보려고 하는 학생입니다
DC-DC변환기는 BUCK-BOOST 컨버터이구요 극성이 반전되어 나타나게 되어있습니다 ..
컨버터의 출력전압이 12V일때 AVR로 입력되는 전압은 2.5V가 되도록 회로를 구성하였고
AVR의 ADC0단자에 입력하였습니다 .. 스위칭 주파수는 약 31KHZ를 사용하였구요 ..
목적은 컨버터의 일정한 12V의 출력전압을 맞추는 것인데요 .. 당연히 2.5V가 AVR로 입력되면
12V가 컨버터에서 출력되는거니깐 .. 2.5V보다 낮으면 듀티를 증가시키고 2.5V보다 높으면 듀티를 감소시키는
그런 프로그램을 작성하고 있는데요 ..
/*****************************************************
Project :
Version :
Date : 2010-04-04
Author : kim
Company : sunchon
Comments:
Chip type : ATmega128
Program type : Application
Clock frequency : 16.000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 1024
*****************************************************/
#include <mega128.h>
#include <delay.h>
#include <mem.h>
//---------------------------------------------------------------------ADC
void init_adc(unsigned char ad_channel, unsigned ad_prescale )
{
ADMUX = (ad_channel & 0x07);
ADCSRA = 0x80 | (ad_prescale & 0x07);
}
int read_adc(void)
{
ADCSRA.6=1;
while(!ADCSRA.4);
ADCSRA.4=0;
return ADCW;
}
//------------------------------------------------------------PWM
void on_pwm(char clock_select, char pwm_channel, char pwm_prescaling)
{
ASSR = 0x00 |(clock_select<<3);
switch(pwm_channel)
{
case 0:TCCR0 =0x61; //--> +1은 00입력을 방지하기 위해..
TCNT0 = 0x00; // --> 0부터 6까지 입력가능
OCR0 = 0x00;
break;
}
}
void out_pwm(char pwm_channel, int avr128_duty_rate)
{
switch(pwm_channel)
{
case 0:OCR0 = avr128_duty_rate;
break;
}
}
void off_pwm(char pwm_channel)
{
switch(pwm_channel)
{
case 0:TCCR0 =0x00;
TCNT0 = 0x00;
OCR0 =0x00;
break;
}
}
//-----------------------------------------------------MAIN PROGRAM
void main(void)
{
int ad_value;
DDRB = 0xFF;
PORTB =0x00;
DDRC = 0xFF;
PORTC = 0x00;
init_adc(0, 7);
on_pwm(0,0,3);
out_pwm(0,77);
delay_ms(3000);
while(1)
{
ad_value = read_adc();
ad_value = (int)(ad_value/4);
if(ad_value>128)
{
PORTC = ad_value;
PORTB.0 = 1; // ---> 방향
out_pwm(0,(ad_value+1));
}
else if(ad_value<126)
{
PORTC = ad_value;
PORTB.0 = 0;
out_pwm(0,(ad_value-1));
}
else
out_pwm(0,ad_value);
delay_ms(1);
}
}
위와 같이 소스코드를 작성하였습니다 .. 10비트 A/D변환결과를 8비트 PWM의 DUTY에 넣기 위하여
1023의 변환값을 4로 나누어 약 255가 되게 하였고 A/D 값을 확인하기 위하여 PORTC에 LED를 달아서
출력을 확인하게끔 .. 또 0~5V입력 일 때 0~1023이고.. 이것을 4로 나눈값이며 .. 2.5V가 들어오면 255의
절반값인 약 127로 하였으며, 증가와 감소를 반복하며 출력전압을 일정하게 할려고 하였는데요 ,,
PWM 듀티가 정확하게 나오지도 않으며, AD변환값을 확인하기 위한 PORTC의 LED를 확인해보면
가변저항을 달아서 실험할 때와는 다르게 정확한 수치값을 알아먹을 수도 없이 값이 왔다갔다 하며 값을
알아먹을 수도 없습니다.. 뭔가 확실히 잘못된거 같은데 ..
고수님들의 조언좀 ㅠ 그리고 PWM은 정수로 밖에 안되는 겁니까 ??