PDA

View Full Version : Kết nối PIC với PC thông qua MATLAB và RS232...


ganbaregenki
11-04-2011, 07:21 AM
hiện tại thì mình đang làm đồ án về điều khiển hệ thống lò điện trở.Ban đầu yêu cầu của thầy kết nối hệ thống điều khiển và đo lường thông qua CARD chuyên dụng của IBM.Nhưng mình muốn tiếp cận bài toán theo hướng khác nên đặt ra các vấn đề cần giải quyết bằng Vi xử lý nên mình đã làm như sau:
+ Thu thập tín hiệu nhiệt độ từ 5 cặp nhiệt điện để đo nhiệt độ của lò và 4 nhiệt độ phôi diotamit.
+ Truyền 5 nhiệt độ lên PC thông qua chuẩn RS232.
+ Giao diện truyền nhận ở đây được tạo bởi MATLAB thông qua 3 công cụ:
- Bằng code trong m-file.
- Sử dụng GUI tạo giao diện chỉnh sửa các tham số.
- Dùng toolbox Instrument để kết nối với SIMULINK.
+ Điều khiển nhiệt độ của vật thông qua điều khiển nhiệt độ lò bằng mạch điều khiển công suất sử dụng TRIAC:
- Có thể sử dụng IC điều khiển TRIAC TCA785.
- Hoặc sử dụng mạch zero-crossing và điều khiển thông qua PIC
Tất nhiên cả trong 2 trường hợp trên thì bộ điều khiển nằm trong SIMULINK hoặc sử dụng m-file.
Mạch PIC chỉ có tác dụng kết nối với mạch đo,truyền tín hiệu nhiệt độ và nhận tín hiệu điều khiển từ PC để mở TRIAC.
Bạn nào có hứng thú trao đổi thì có thể liên lạc với mình qua mail:hoancaubk@gmail.com nhé.
Thân

ganbaregenki
11-05-2011, 10:00 PM
Chào mọi người.Lâu lắm rồi mình chưa cập nhật cho thread,mà hình như không có ai thích tìm hiểu về vấn đề này với mình nhỉ.
Hiện tại thì đồ án của mình cũng đã bước vào giai đoạn cuối và đang tiến hành typing với lấy đồ thị thời gian thực nữa là okie.
Mình gửi code VXL và code MATLAB cho mọi người cùng thảo luận nhé.
Dưới đây là code VXL.string mình gửi từ MATLAB có dạng 'axb'.Trong đó x là giá trị duty cho pwm có dải từ 0 đến 255.
/*test uart cho pic 16f877a su dung phan mem mirko & MATLAB & Rs232
*/
char uart_rd;
unsigned int temp,duty_cycle;
volatile long int pwm_data;
char temp_text0[7],temp_text1[7], *temp_text_all,*res; //ADD A CHAR ARRAY TO HOLD THE TEXT
void main()
{
ADCON1 = 0; // All PORTA pins as analog, VDD as Vref
trisa = 0xff;
TRISB=0;
PORTB=0;
PWM1_Init(5000); // Initialize PWM1 module at 5KHz
PWM1_Start(); // start PWM1
UART1_Init(9600);
Delay_ms(100);
temp=100;
while(1){


if (UART1_Data_Ready()) // if data is received
{


uart_rd=UART1_Read();

if(uart_rd=='a') pwm_data=0;
else
{
if(uart_rd!='b')
{

pwm_data=pwm_data*10+uart_rd-48;
}
else
{
duty_cycle=pwm_data;
if(duty_cycle>255) duty_cycle=255;
PWM1_Set_Duty(duty_cycle);
temp = Adc_Read(0)*0.243902439;
IntToStr (temp, temp_text0); //CONVERT ADC VALUE TO TEXt
uart1_write_text(temp_text0); //SEND TEXT VALUE TO UARTT
//temp = Adc_Read(2)*0.243902439;
//IntToStr (temp, temp_text); //CONVERT ADC VALUE TO TEXt
//uart1_write_text(temp_text); //SEND TEXT VALUE TO UART
}

}

}
//temp = Adc_Read(1)*0.243902439;
//IntToStr (temp, temp_text1); //CONVERT ADC VALUE TO TEXt
//uart1_write_text(temp_text1); //SEND TEXT VALUE TO UART
//temp_text_all=strcat(temp_text0,";");
//temp_text_all=strcat(temp_text_all,temp_text1);
//uart1_write_text(temp_text_all); //SEND TEXT VALUE TO UART
//delay_ms(200);
}
}
Trên đây mình mới chỉ cần gửi 1 tín hiệu để MATLAB xử lý nên code vẫn chưa có đoạn đọc adc từ chân AN1.AN2,AN3 và AN5.Và lệnh gộp string+lệnh gửi string all.
Còn đây là code MATLAB.Mọi người thấy có gì sai thì cứ thảo luận nhé
% Reading of a sensor temperature
% using a microcontroller PIC16F887
% Starting: April 15 , 2011
% Author's Data: hoancaubk@gmail.com

% HaNoi university of Technology and Science

clear all;
close all;

s = serial('COM1'); %assigns the object s to serial port

set(s, 'InputBufferSize', 256); %number of bytes in inout buffer
set(s, 'BaudRate', 9600); %set baud rate
set(s, 'Parity', 'none'); %
set(s, 'DataBits', 8);
set(s, 'StopBit', 1);
set(s, 'Timeout',0.5); %Set time out for COM1,it is very important because of
% real time control
fopen(s);
fprintf(s,'%s','a102b'); % to active PIC16F887 by sending a value to PIC from PC
i=0;
while(i<20)
data=Str2num(fscanf(s))

% code controller and actuator system here

fprintf(s,'%s','axb') %send control signal value to PIC:axb
i=i+1
end
fclose(s); %close serial port

à.Do mình sử dụng vòng while nên vấn đề plot data vẫn còn đang có lỗi.
Chắc tuần sau mình sẽ up final code và MATLAB gui nhé.
Thân

ganbaregenki
11-05-2011, 10:02 PM
Code VXL mình viết bằng mikroe C PRO for PIC nên khác với PIC C Compiler.
Các bạn đừng thắc mắc tại sao post vào PIC C Compiler lại không build được nhé.

nhanconan030789
06-06-2011, 12:59 AM
hiện tại thì mình đang làm đồ án về điều khiển hệ thống lò điện trở.Ban đầu yêu cầu của thầy kết nối hệ thống điều khiển và đo lường thông qua CARD chuyên dụng của IBM.Nhưng mình muốn tiếp cận bài toán theo hướng khác nên đặt ra các vấn đề cần giải quyết bằng Vi xử lý nên mình đã làm như sau:
+ Thu thập tín hiệu nhiệt độ từ 5 cặp nhiệt điện để đo nhiệt độ của lò và 4 nhiệt độ phôi diotamit.
+ Truyền 5 nhiệt độ lên PC thông qua chuẩn RS232.
+ Giao diện truyền nhận ở đây được tạo bởi MATLAB thông qua 3 công cụ:
- Bằng code trong m-file.
- Sử dụng GUI tạo giao diện chỉnh sửa các tham số.
- Dùng toolbox Instrument để kết nối với SIMULINK.
+ Điều khiển nhiệt độ của vật thông qua điều khiển nhiệt độ lò bằng mạch điều khiển công suất sử dụng TRIAC:
- Có thể sử dụng IC điều khiển TRIAC TCA785.
- Hoặc sử dụng mạch zero-crossing và điều khiển thông qua PIC
Tất nhiên cả trong 2 trường hợp trên thì bộ điều khiển nằm trong SIMULINK hoặc sử dụng m-file.
Mạch PIC chỉ có tác dụng kết nối với mạch đo,truyền tín hiệu nhiệt độ và nhận tín hiệu điều khiển từ PC để mở TRIAC.
Bạn nào có hứng thú trao đổi thì có thể liên lạc với mình qua mail:hoancaubk@gmail.com nhé.
Thân
mình vưà làm project môn học điêù khiển tốc độ động cơ servo,giao tiếp vơí matlab sử dụng gui,mình gặp khó khăn ở chổ cập nhật dữ liêụ liên tục,mình sử dụng GUI ,với đôí tượng serial khi nhận event BytesAvailablesFcn thì nó sẽ thực thi một hàm mà mình mong muốn,nhưng khổ nôỉ mình không biết cách nào để lưu dữ liêụ lâý được trong cái hàm này vào GUI,bạn có thể chỉ mình chổ này không,vơí lại kết nôí vơí Simulink như thế nào vâỵ bạn?

ganbaregenki
26-06-2011, 09:53 AM
à.Bạn phải sử dụng cả 2 byte trong matlab của hàm fscanf ấy.2 lệnh đó là lệnh s.syn... và s.byteavail...Bạn check lại chính xác lệnh trong MATLAB.Mình đang online ở quán nét.:D

ganbaregenki
26-06-2011, 09:54 AM
Kết nói SIMULINK thì bạn phải viết 1 khối s function thôi.Hoặc có thể sử dụng C.