BASIC4MCU | 질문게시판 | 로드셀을 이용한 모터 제어입니다
페이지 정보
작성자 정욱스 작성일2021-11-26 20:19 조회1,396회 댓글1건본문
로드셀에 가하는 압력이 2kg 미만일시 정방향 회전, 2kg 이상일시 역방향 회전하는 코딩입니다.
업로드에는 성공하였는데 시리얼 모니터에 압력을 측정하려하니 압력과 관계없이 쭉 1kg만 측정이 자동으로 되고 있습니다.
그리고 모터에는 미세한 진동만 발생하는 정도입니다.
무엇이 잘못되었는지 궁금합니다... ㅠㅠ 도와주세요
#include <avr/io.h>
#include <util/delay.h>
unsigned char mode = 0;
unsigned char count = 0; //fore 214
unsigned char arr_index = 0; // 01944
unsigned char offset = 0; //offset 21
long int adc_value[10] = {0}; //adca 23 b
long int cal_adc_value = 0; //adczt 107 EC COLE E
long int loadsell_to_avr = 0; //adcz
char phase[8] = {0x0l, 0x02, 0x04, 0x08, 0x0l, 0x02, 0x04, 0x08}; //1A AH814
void serial(unsigned long baud)
{
unsigned short ubrr = 0;
ubrr = (unsigned short) (F_CPU/(16*baud)-1);
UBRR0H = (unsigned char) (ubrr >> 8);
UBRR0L = (unsigned char) (ubrr & 0xff);
UCSR0C = 0x06;
UCSR0B = 0x18; // IEEEX, 4, 402
}
void tx_data(unsigned char data)
{
while ((UCSR0A & 0x20) == 0x00);
UDR0 = data;
}
long int get_adc (void)
{
loadsell_to_avr = 0 ;
for(count = 0; count < 24 ; count++)
{
_delay_us (1);
PORTA = 0x01;
_delay_us (1);
loadsell_to_avr = loadsell_to_avr << 1;
PORTA = 0x00;
_delay_us(1);
if ((PINA & 0x02) == 0x02) loadsell_to_avr++;
}
_delay_us(1);
PORTA = 0x01;
_delay_us (1);
PORTA = 0x00;
_delay_us (1);
loadsell_to_avr = 0x800000;
loadsell_to_avr -= 8348000;
if (loadsell_to_avr <0) loadsell_to_avr = 0; //279 H 2 O
return loadsell_to_avr;
}
void output(void)
{
//지난 10번의 평균 출력
adc_value[arr_index] = get_adc()/400; //scale
arr_index++;
if(arr_index == 10) arr_index = 0;
cal_adc_value = 0; //
for (count = 0; count <10; count++) cal_adc_value += adc_value [count];
cal_adc_value /= 10; //
if((UCSR0A & 0x20)== 0x20)
{
tx_data(cal_adc_value%10000/ 1000+ '0');
tx_data(cal_adc_value%1000/100 + '0' ); //84
tx_data('.');
tx_data(cal_adc_value%100/10 + '0'); //
tx_data(cal_adc_value%10 + '0'); //
tx_data('k');
tx_data('g');
tx_data(0x0d);
}
}
int main(void)
{
DDRA = 0x01; //PAO:CLKÉS, PAI:DAT (213)
DDRE = 0x02; //1/RX_DATA(9), TX DATA (29)
DDRF = 0x0f; // 1,2,3,4
serial(9600); //2015 9600
while(1)
{
_delay_ms(10);
output(); // E! 29
if(cal_adc_value%1000 < 200) mode = 0; //2kg Die
else if(cal_adc_value%1000 >= 200) mode = 1; //2kg Ola
switch (mode)
{
case 0:
{
for (count = 0; count <8; count++)
{
PORTF = phase [count];
_delay_ms(10);
}
break;
}
case 1:
{
//역방향 구동
for (count = 7; count > 0; count--)
{
PORTF = phase [count];
_delay_ms(10);
}
break;
}
}
}
}
댓글 1
조회수 1,396master님의 댓글
master 작성일
전원장치의 전류용량이 부족해서 발생하는 문제로 보입니다만
로드셀 예제만 돌려서 정상동작하는지 확인하고
모터 예제만 돌려서 정상동작하는지 확인하세요