Давно хотел собрать хороший вольтметр для блока питания. Нашел для этого PIC16F822 и MAX7219. Собрал проект в протеусе и вроде всё устроило. Но тут попался халявный ADuC847 и сразу потекли слюнки глядя на его 24-х битный ADC, а пик ушел в другой девайс. Но вот с написанием проги под него возникли трудности. Если кто писал нечто подобное, и может поделится наработками буду премного благодарен. Для меня пока основными трудностями являются конфигурирование периферии связанной с ADC и вывод данных в SPI. Для пиков писал на CCS C. Там и ADC в визарде сконфигурировать можно. И для SPI примеров куча.
Вкратце о тех задании: 2 канала вольтметра с диапазоном от 0 до 25 вольт (естественно делителем понизится до максимально возможного для ADC). Далее вывод данных через SPI в MAX7219 к которой подключены 2 четырехразрядных семи сегментных светодиодных индикатора. Первый индикатор – напряжение, второй – ток(хотя тут без разницы).
Задача для себя любимого поэтому сроки не жмут, но и растягивать особо тоже не охота.
Всем откликнувшимся заранее огромное спасибо.
Двухканальный вольтметр на ADuC847+MAX7219
-
Taranenko81
- Родился
- Сообщения: 14
- Зарегистрирован: Ср апр 16, 2008 05:31:27
Re: Двухканальный вольтметр на ADuC847+MAX7219
// Вывод байта в индикатор
void WrDSP(unsigned char byte)
{
// Помещаем байт в регистр данных SPI
SPIDAT = byte;
// Ждём окончания выдачи байта
while(!(SPICON & 0x80));
// Сбрасываем флаг окончания выдачи байта
SPICON &= 0x7f;
}
// Главный цикл программы
void main(void)
{
// Частота ядра = 12.582912MHz
PLLCON = 0x00;
// Запрет выдачи сигнала ALE
PCON |= 0x10;
// Разрешение использования внутренней XRAM
CFG847 = 0x01;
// Включение SPI
SPICON = 0x30;
// Выдача байта в дисплей через SPI
WrDSP(0x00);
// Вечный цикл
while(1);
}
С АЦП можно разобраться на примере от ADI (код приведён для ADUC845, но это не важно).
Замечу, одно. Для вашего случая лучше использовать внешний источник опорного напряжения, так как внутренний ИОН недостаточно точный.
void WrDSP(unsigned char byte)
{
// Помещаем байт в регистр данных SPI
SPIDAT = byte;
// Ждём окончания выдачи байта
while(!(SPICON & 0x80));
// Сбрасываем флаг окончания выдачи байта
SPICON &= 0x7f;
}
// Главный цикл программы
void main(void)
{
// Частота ядра = 12.582912MHz
PLLCON = 0x00;
// Запрет выдачи сигнала ALE
PCON |= 0x10;
// Разрешение использования внутренней XRAM
CFG847 = 0x01;
// Включение SPI
SPICON = 0x30;
// Выдача байта в дисплей через SPI
WrDSP(0x00);
// Вечный цикл
while(1);
}
С АЦП можно разобраться на примере от ADI (код приведён для ADUC845, но это не важно).
Замечу, одно. Для вашего случая лучше использовать внешний источник опорного напряжения, так как внутренний ИОН недостаточно точный.
- Вложения
-
- 845code_c.zip
- (14.95 КБ) 209 скачиваний
-
Taranenko81
- Родился
- Сообщения: 14
- Зарегистрирован: Ср апр 16, 2008 05:31:27
Re: Двухканальный вольтметр на ADuC847+MAX7219
Спасибо буду пробовать. По поводу точности -мне и 16 бит более чем достаточно.
Re: Двухканальный вольтметр на ADuC847+MAX7219
Дело не в битах. Дело в том, что неточный ИОН даёт неверный наклон характеристики преобразования. Вы подадите на вход 5В (проконтролировав это напряжение сторонним высокоточным вольтметром), а ваше устройство выдаст на индикатор, например, 4.98В... В абсолютных измерениях, как у вас, я думаю, это важно. Хотя, вам виднее.
Удачи.
Удачи.