Mình dùng mạch chỉnh lưu chính xác kết hợp
khuếch đại để lấy ra sóng dạng sin bán kì tần số 50Hz mình đã đo ossillo ( tín hiệu từ CT) mình mới học avr nên còn gà lám mong các bạn góp ý cho code của mình .vì phần này làm miết mà kô chạy sai tùm lum ah.
mình không dùng thêm phần cứng để tìm trị đỉnh cũng như dò zero tất cả đều dùng soft để giải quyết. vấn đề truyền 485 cũng như quét led hiển thị trên board dùng spi đã chạy rất oke.
- Vấn đề nan giải còn lại như mình đã nói là quét tìm trị đỉnh để tính ra trị hiệu dụng . do mình dùng atmega8 nên tín hiệu ra từ chỉnh lưu bán kì +khếch đại được đưa qua phân kênh analog 4052 nên dù có tới 6 CT mình cũng chỉ dùng 2 ADC0 và ADC1 thôi còn các ADC khác mình dùng như là các I/O để điều khiển chọn kênh cũng như hiển thị quét led.
- Bình thường khi không có tín hiệu từ cảm biến tức không có gắn tải vô mạch thì ngõ ra ADC đọc về vẫn có giá trị khác 0 chưa kể vân đề sai số của adc 10bit ( do vậy vấn đề muốn tìm điểm zero là bỏ mình không có ý định designe lại board) với ADC 10 bit thì có thể cho độ phân giải đến 4.8mV với Vreff 5V.
- vì mình chỉ định thiết kế với tải ngõ vào là (200mA -- >5A ) nên ngõ vào của ADC khuếch đại lên với tải nhỏ nhất cũng hơn 100mV rồi.
==> Hướng giải quyết của mình :
// đọc giá trị ADC ban đầu và so sánh xem nó có lớn hơn 10mV không ( tại bán kì không được chỉnh lưu vẫn có áp chừng 10mV chẳng hạn, tại bán kì có chỉnh lưu thì sẽ là 10mV+ V_rectifier_amp).
code: int backup;
unsigned char pa_flag;
if( pa_flag == 0) // chưa có mẫu nào
{
samp_1 = ADCW ; // dọc lần đầu.
backup = samp_1;
samp_1 = samp_1*5000/1024; // đổi ra mV
if(samp_1 < 10) // nếu nhỏ hơn 10mV
samp_1 = 0; // bỏ mẫu ban đầu lấy đi
else
{ // giữ lại mẫu ban đầu
samp_1 = backup;
// thiết lập một biến để báo đã lấy được mẫu đầu tiên
pa_flag = 1;
}
}
else // đã có mẫu
if( samp_1 < ACDW ) // ta đang lấy mẫu ở bên trái sườn sóng sin (giá trị sau lớn hơn trước)
// lưu tiếp mẫu mới này
samp_1 = ADCW;
else // trường hợp này xảy ra khi ta lấy mẫu ở bên phải sườn sóng sin.
// hoặc là sóng từ sườn trái đi qua phải ?
// nếu là trường hợp thứ 2 từ trái đi sang phải thì mình giữ nguyên mẫu trươc đó.
V_peak = samp_1;
// vậy là bài toán tìm trị đỉnh đã được giải quyết bằng soft.
nhưng vấn đề cũng phát sinh chính trong đoạn
đó chỉ có 1 khả năng được xảy ra trong 2 khả năng xảy ra vậy muốn biết khả năng nào xảy ra thì sao ? và cái khả năng không mong muốn là ta đang lấy mẫu tại sườn phải sẽ giải quyết tiếp ra sao.
chưa kể chuyện ở khoảng gần trị đỉnh cho là mỗi lần lấy mẫu mất 100us đi thì giá trị giữa 2 lần lấy mẫu thây đổi còn nhỏ hơn cả độ phân giải của ADC 10bit kết hợp với sai số của ADC 10bit sẽ gây hiểu nhầm và lấy lộn đỉnh sóng hoặc kô dò được. điều này khá nguy hiểm khi kết hợp nó với do pha.
Mong các bạn cho hướng giải quết
chỉnh lưu lý tưởng :
khuếch đại để lấy ra sóng dạng sin bán kì tần số 50Hz mình đã đo ossillo ( tín hiệu từ CT) mình mới học avr nên còn gà lám mong các bạn góp ý cho code của mình .vì phần này làm miết mà kô chạy sai tùm lum ah.
mình không dùng thêm phần cứng để tìm trị đỉnh cũng như dò zero tất cả đều dùng soft để giải quyết. vấn đề truyền 485 cũng như quét led hiển thị trên board dùng spi đã chạy rất oke.
- Vấn đề nan giải còn lại như mình đã nói là quét tìm trị đỉnh để tính ra trị hiệu dụng . do mình dùng atmega8 nên tín hiệu ra từ chỉnh lưu bán kì +khếch đại được đưa qua phân kênh analog 4052 nên dù có tới 6 CT mình cũng chỉ dùng 2 ADC0 và ADC1 thôi còn các ADC khác mình dùng như là các I/O để điều khiển chọn kênh cũng như hiển thị quét led.
- Bình thường khi không có tín hiệu từ cảm biến tức không có gắn tải vô mạch thì ngõ ra ADC đọc về vẫn có giá trị khác 0 chưa kể vân đề sai số của adc 10bit ( do vậy vấn đề muốn tìm điểm zero là bỏ mình không có ý định designe lại board) với ADC 10 bit thì có thể cho độ phân giải đến 4.8mV với Vreff 5V.
- vì mình chỉ định thiết kế với tải ngõ vào là (200mA -- >5A ) nên ngõ vào của ADC khuếch đại lên với tải nhỏ nhất cũng hơn 100mV rồi.
==> Hướng giải quyết của mình :
// đọc giá trị ADC ban đầu và so sánh xem nó có lớn hơn 10mV không ( tại bán kì không được chỉnh lưu vẫn có áp chừng 10mV chẳng hạn, tại bán kì có chỉnh lưu thì sẽ là 10mV+ V_rectifier_amp).
code: int backup;
unsigned char pa_flag;
if( pa_flag == 0) // chưa có mẫu nào
{
samp_1 = ADCW ; // dọc lần đầu.
backup = samp_1;
samp_1 = samp_1*5000/1024; // đổi ra mV
if(samp_1 < 10) // nếu nhỏ hơn 10mV
samp_1 = 0; // bỏ mẫu ban đầu lấy đi
else
{ // giữ lại mẫu ban đầu
samp_1 = backup;
// thiết lập một biến để báo đã lấy được mẫu đầu tiên
pa_flag = 1;
}
}
else // đã có mẫu
if( samp_1 < ACDW ) // ta đang lấy mẫu ở bên trái sườn sóng sin (giá trị sau lớn hơn trước)
// lưu tiếp mẫu mới này
samp_1 = ADCW;
else // trường hợp này xảy ra khi ta lấy mẫu ở bên phải sườn sóng sin.
// hoặc là sóng từ sườn trái đi qua phải ?
// nếu là trường hợp thứ 2 từ trái đi sang phải thì mình giữ nguyên mẫu trươc đó.
V_peak = samp_1;
// vậy là bài toán tìm trị đỉnh đã được giải quyết bằng soft.
nhưng vấn đề cũng phát sinh chính trong đoạn
Code:
else // trường hợp này xảy ra khi ta lấy mẫu ở bên phải sườn sóng sin. // hoặc là sóng từ sườn trái đi qua phải ? // nếu là trường hợp thứ 2 từ trái đi sang phải thì mình giữ nguyên mẫu trươc đó. V_peak = samp_1;
chưa kể chuyện ở khoảng gần trị đỉnh cho là mỗi lần lấy mẫu mất 100us đi thì giá trị giữa 2 lần lấy mẫu thây đổi còn nhỏ hơn cả độ phân giải của ADC 10bit kết hợp với sai số của ADC 10bit sẽ gây hiểu nhầm và lấy lộn đỉnh sóng hoặc kô dò được. điều này khá nguy hiểm khi kết hợp nó với do pha.
Mong các bạn cho hướng giải quết
chỉnh lưu lý tưởng :
Comment