IV. Mạch đo sử dụng vi điều khiển atmega
4. Đọc tín hiệu SS
Độ phân giải: 10 bit Tốc độ lấy mẫu: 10kHz
Do SSI sử dụng chuẩn RS-422 phát ra tín hiệu vi sai và tín hiệu nên phải sử dụng các bộ RS-422 Transciever để chuyển đổi tín hiệu và đọc trên các PORT của vi điều khiển. ở đây sử dụng IC MAX 1486 của hãng MAXIM.
Nhận dữ liệu từ cảm biến
Trên các vi điều khiển thông thường không có module riêng dành cho SSI. Tuy nhiên với khung dữ liệu tương đối đơn giản và giống với giao diện SPI, ta có thể cho vi điều khiển nhận dữ liệu thông qua module SPI hoặc lập trình để vi điều khiển nhận dữ liệu qua một chân bất kỳ.
Nhận dữ liệu từ chân bất kỳ
Nguyên tắc của phương pháp này là bật tắt (toggle) một chân của vi điều khiển để tạo xung clock điều khiển việc truyền dữ liệu từ cảm biến. Một chân khác sẽ được dùng làm cổng nhận dữ liệu của “giao diện nối tiếp”. Ta sẽ tạo một biến có độ dài thích hợp để chứa dữ liệu
nhận về. Cách ghi dữ liệu vào biến này sẽ tương đương với một thanh ghi dịch.
Hàm đọc dữ liệu 12bit
Uint16 pinToggleReadSSI ( void ) {
Uint8 bit_count; Uint16 result = 0; Uint8 portdata;
for (bit_count=0; bit_count<13; bit_count++) {
// falling edge on clock port
// left-shift the current result result = (result << 1);
// rising edge on clock port, data changes SSI_CLK_PORT |= (1 << SSI_CLK_BIT); // read the port data
portdata = SSI_DTA_PORT;
// evaluate the port data (port set or clear) if ( (portdata & (1 << SSI_DTA_BIT)) != 0) {
// bit is set, set LSB of result result = result | 0x01; }
}
Result <<=1;
//delay at least 25 μs for timeout Delay_us(25);
return result; }
Trong hàm trên, ta không cần tính đến tốc độ của xung clock. Phương pháp này đơn giản và có thể ứng dụng cho tất cả các vi điều khiển dù đơn giản nhất.
Một cách khác là có thể sử dụng module SPI có sẵn trong các vdk. Với vdk 8 bit, dữ liệu sẽ được đọc 2 lần, cho 8 bit cao và 6 bit thấp. Dữ liệu thu được phải dịch bit sang phải 2 vị trí. Tốc độ truyền cao nhất của SPI là ¼ xung nhịp hệ thống.
/*FH***************************************************************** ********
* Name: spiInit
* Description: init SPI as master for use with SSI
********************************************************************* ********/
void spiInit( void ) {
// configure SCK, MOSI and Slave Select as output
// configure SPI as master, with CLK idle high SPCR = (1 << SPE) | (1 << MSTR) | (1 << CPOL); } / *FH****************************************************************** ******* * Name: readSSI_SPI
* Return value: value read from SSI
* Description: read a 25 Bit SSI word using the SPI interface
******************************************************* ********************/
Uint16 spiReadSSI( void ) {
Uint8 byteCount; Uint8 data;
Uint16 result = 0;
for (byteCount=0; byteCount<2; byteCount++) {
// send a dummy byte, read the result
SPDR = 0xFF; // send 0xFF as dummy result <<= 8; // left shift the result so far
data = SPDR; // read data from SPI register result |= u8data; // and ‘or’ it with the result word }
result >>= 2; // throw aways the LSBs return result;
}
Chế độ truyền đôi được thực hiện bằng cách cho vdk xuất xung clock 25 chu kỳ liên tiếp. Dữ liệu 24 bit nhận về sẽ được xử lí và so sánh để đảm bảo độ chính xác của dữ liệu.