|
MSP430 - вопросы от чайника, генератор опорного напряжения |
|
|
|
 |
Ответов
|
Jun 17 2008, 19:48
|
Местный
  
Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345

|
Цитата(rezident @ Jun 17 2008, 00:30)  Я рад вашим успехам  Зря иронизируете, я медленно(очень медленно), но верно расту Цитата(rezident @ Jun 17 2008, 00:30)  Кстати, если вам требуется округление, то можно (до преобразования в int) при вычислениях с float прибавлять число 0.5f. Спасибо за совет - пригодится Цитата(VAI @ Jun 17 2008, 07:32)  если число положительное, и вычитать 0.5, если число отрицательное. Примерно, в общем виде, где-то так... Спасибо, VAI.
|
|
|
|
|
Jun 22 2008, 15:37
|
Местный
  
Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345

|
Здравствуйте, и снова вопросы  много, много вопросов 1.!! Сначала по поводу усреднения отсчетов для уменьшения шума - предлагали использовать бит MSC в регистре ADC12CTL0. Правильно ли я понимаю, что тогда значения выборок будут постоянно(до сброса бита ENC) записываться в регистры ADC12MEMx, и получить усредненное значение можно считывая значения из разных регистров ADC12MEMx и деля на их количество? Но у меня 16 каналов АЦП, задействовано в дальнейшем будет 5. Т.е. я могу использовать для усреднения только три значения из регистров ADC12MEMx - маловато будет... ну, или я все же не понимаю, поясните тогда принцип использования бита MSC. Делаю усреднение пока так(знаю, что криво, но) int filter(int r[10])// среднее арифметическое 10 значений { int s, t; s = 0; for(t = 0 ; t < 10 ; t++) s+=r[t]; return s/10; } ... ADC12CTL0 = ADC12ON + REFON + SHT0_8;// настройка АЦП ADC12CTL1 = CSTARTADD0 + CSTARTADD1 + ADC12SSEL_1+ CONSEQ_1+ SHS_1; ADC12MCTL3 = INCH_3; ADC12MCTL4 = INCH_4 + EOS; index = 0; ... И, собственно if (TACCTL0 & CCIFG)// если таймер переключился { if (P1OUT & BIT5)// и, если вывод все еще в единице,т.е. еще идет длинный импулсьс { ADC12CTL0 |= ENC; Vr[0][index] = ADC12MEM3; // записываем в массив значения из ADC12MEMх Vr[1][index] = ADC12MEM4; ADC12CTL0 &= ENC; index++; if (index >= 10)// когда значений в массиве 10 { index = 0; offset[0] = (Vs[0] - filter(Vr[0]))/2; // Вычисление смещений уровня сигнала offset[1] = (Vs[1] - filter(Vr[1]))/2; Vx = filter(Vr[0]) - offset[0]; //вычисление координат вектора маг.индукции Vy = filter(Vr[1]) - offset[1]; azimut = calculation (Vx,Vy); //вычисление азимута } send_int(azimut); } send_int(azimut) - вычисленный азимут посылается на СOM. Описание send_int было выше в теме, да и не в ней суть, на вычисления тоже можно не обращать внимания ВОПРОС! - 2.!! В данном случае вычисляю азимут 10 раз, а посылаю только один. т.е. 10 раз посылается одно и то же значение. Если переношу строчку send_int(azimut); под строку azimut = calculation (Vx,Vy); - т.е. сразу после вычисления и отправляю, то программа не работает  На СOM ничего не приходит!  Поясните, пожалуйста, если будет время разобраться - ПОЧЕМУ?! 3.!! Вопрос не по теме MSP430, уж извините, но вдруг кто-нибудь знает - Когда считываю уровень сигнала с датчика, он самопроизвольно "плывет", плата лежит неподвижно, а уровень за минуту убегает довольно прилично, при вычислении азимута получается, что в минуту градусов +/- 5  С чем это может быть связано? Датчик, напоминаю, HMC1002  Вопрос в основном к Курту, если он заглянет. Да, Kurt, отправила Вам письмо - загляните в ящик - там еще куча вопросов по компасу конкретно  Ну, Вы сами обещали помочь Ну вот, пока все - помогите, кто может чем сможет  Не ругайте за безграмотность и всех с победой сбороной России
|
|
|
|
|
Jun 22 2008, 18:38
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Daria @ Jun 22 2008, 21:37)  ну, или я все же не понимаю, поясните тогда принцип использования бита MSC. Бит MSC не имеет прямого отношения к усреднению. Он лишь позволяет автоматически запускать таймер сэмплирования (Sample Timer) после каждого преобразования (если выбран режим последовательности каналов). На блок-схеме из User's Guide хорошо видно, что устройство выборки-хранения (Sample-and-Hold или УВХ в отечественной терминологии), подключенное к входному 16-и канальному мультиплексору управляется сигналом SAMPCON. Лог.1. SAMPCON включает режим выборки, в котором конденсатор УВХ заряжается до напряжения входного сигнала, подключенного к выбранному входу мультиплексора, а лог.0 отключает УВХ от мультиплексора и запускает преобразование. Длительность лог.1 задается таймером сэмплирования, либо внешним сигналом в обход таймера сэмплирования. Сам таймер сэмплирования запускается по фронту сигнала SHI, который формируется либо программно от ADC12SC, либо одним из трех внешних сигналов от модулей таймера A или таймера B. Так вот установка бита MSC позволяет не ждать фронта сигнала SHI для запуска каждого последующего преобразования, а формировать его аппаратно по окончании предыдущего преобразования. Но это все работает только, если выбран режим управления от Sample Timer и режим последовательности каналов. Цитата(Daria @ Jun 22 2008, 21:37)  Делаю усреднение пока так(знаю, что криво, но) int filter(int r[10])// среднее арифметическое 10 значений { int s, t; s = 0; for(t = 0 ; t < 10 ; t++) s+=r[t]; return s/10; } Ну некоторая "кривизна" присутствует только при передаче аргумента функции. Передавать следует указатель на массив отсчетов и возможно еще и длину этого массива. Код int filter(int *ptr, int size) { int s=0, t; for(t=0; t<size; t++) s+=*ptr; ptr++; if (size>0) //проверим на исключение "деление на нуль" return (s/size); else return 0; } Вызов функции будет такой Код x=filter(r, 10); или Код x=filter(&r[0], 10); Передавать второй аргумент имеет смысл потому, что если вы неправильно неудачно выбрали времена, то у вас будет заполнен не весь буфер. Т.е. за выбранное время будет меньше 10 преобразований. См. ниже про эту потенциальную ошибку. Цитата(Daria @ Jun 22 2008, 21:37)  ... ADC12CTL0 = ADC12ON + REFON + SHT0_8;// настройка АЦП ADC12CTL1 = CSTARTADD0 + CSTARTADD1 + ADC12SSEL_1+ CONSEQ_1+ SHS_1; ADC12MCTL3 = INCH_3; ADC12MCTL4 = INCH_4 + EOS; index = 0; ... Еще раз обращаю внимание, что во избежание ошибок при формировании слова из отдельных битов следует пользоваться побитовым ИЛИ ' |', а не оператором сложения ' +'. Цитата(Daria @ Jun 22 2008, 21:37)  И, собственно if (P1OUT & BIT5)// и, если вывод все еще в единице,т.е. еще идет длинный импулсьс { Здесь возможно имеется потенциальная алгоритмическая ошибка. Проверять нужно не только до начала преобразования, но и после окончания преобразования. И если после окончания преобразования бит сменил свое состояние, то результат последнего преобразования нужно отбрасывать. Следовательно у вас может быть не 10 отсчетов, а меньше. Поэтому выше я предложил передавать в функцию фильтрации еще и реальную длину буфера отсчетов. Цитата(Daria @ Jun 22 2008, 21:37)  2.!! В данном случае вычисляю азимут 10 раз, а посылаю только один. т.е. 10 раз посылается одно и то же значение. Если переношу строчку send_int(azimut); под строку azimut = calculation (Vx,Vy); - т.е. сразу после вычисления и отправляю, то программа не работает  На СOM ничего не приходит!  Поясните, пожалуйста, если будет время разобраться - ПОЧЕМУ?! Затрудняюсь сходу дать однозначный ответ, но думаю, что причиной является факт, что получение значения измерения и передача его через UART это процессы вообще-то асинхронные, но вы их пытаетесь принудительно синхронизировать без использования буферов. Вы используете передачу по опросу бита готовности, а не по прерыванию. А каждая передача "тормозит" измерения на время передачи двух символов. Поэтому за тот же самый интервал времени (который у вас фиксированный и определяется таймером) вы получаете меньше отсчетов, чем предполагаемое вами количество (10). Следовательно условие if (index >= 10) не выполняется, результата azimut вы не получаете, и передача через UART тоже не идет. Для решения этой проблемы рекомендую использовать передачу по прерываниям и формировать для передачи свой собственный буфер, линейный или циклический. По 3-му вопросу ответить не могу. Я не "копенгаген", да и с подобными датчиками я не работал
Эскизы прикрепленных изображений
|
|
|
|
Сообщений в этой теме
Daria MSP430 - вопросы от чайника May 18 2008, 20:05 rezident Цитата(Daria @ May 19 2008, 02:05) Подска... May 18 2008, 20:19 Daria Большое спасибо, вопрос был именно про LFXT А в ... May 19 2008, 17:28  rezident Цитата(Daria @ May 19 2008, 23:28) А в ру... May 19 2008, 18:13   Daria Цитата(rezident @ May 19 2008, 21:13) Ну ... May 22 2008, 20:12    Daria А вот еще вопрос от чайника. Подскажите, если кто ... May 25 2008, 19:27 rezident Вам нужен готовый или схема для самостоятельного и... May 25 2008, 19:58 Daria Цитата(rezident @ May 25 2008, 22:58) Вам... May 26 2008, 08:42  Daria Здравствуйте. Такой вопрос - запускаю таймер( в TA... Jun 3 2008, 19:24 rezident Что-то полная путаница. При чем тут модуль TimerA,... Jun 3 2008, 22:07 A R T Цитата(Daria @ Jun 3 2008, 23:24) Здравст... Jun 4 2008, 04:38 Daria Спасибо, следуя вашему совету, начинаю разбираться... Jun 5 2008, 19:51 rezident А у вас высокочастотный кварц 8Мгц куда подключен?... Jun 6 2008, 01:08 Daria Цитата(rezident @ Jun 6 2008, 04:08) А у ... Jun 6 2008, 20:02 rezident При использовании высокочастотного кварца нужна оп... Jun 6 2008, 20:45 Daria Большое спасибо! Сделаю в точности так, как вы... Jun 6 2008, 21:01  Daria Здравствуйте, снова я Опять проблемы
привожу вес... Jun 8 2008, 17:22   Daria на строчку send_int не обращайте внимания, она ост... Jun 8 2008, 18:50    Daria Нет, тут опять ошибки Vs вычисляется после P1OUT... Jun 9 2008, 19:52   rezident Цитата(Daria @ Jun 8 2008, 23:22) Здравст... Jun 9 2008, 21:21 АДИКМ Посылать по 6 бит никто не запрещает конечно, но в... Jun 9 2008, 20:24 Daria Цитата(АДИКМ @ Jun 10 2008, 00:24) Посыла... Jun 9 2008, 20:47  АДИКМ Цитата(Daria @ Jun 9 2008, 23:47) Проблем... Jun 9 2008, 21:10   Daria Цитата(АДИКМ @ Jun 10 2008, 01:10) Расска... Jun 9 2008, 22:00 АДИКМ Как зовут магнитный датчик? Jun 10 2008, 07:32 Kurt Мне нравится с каким упорством девушка двигается к... Jun 10 2008, 11:36 Daria Цитата(Kurt @ Jun 10 2008, 15:36) Мне нра... Jun 10 2008, 20:19  Kurt Цитата(Daria @ Jun 11 2008, 02:19)
С уп... Jun 11 2008, 03:18   Daria Господа! Как ни странно, оно работает! ... Jun 12 2008, 15:35 rezident Да я не забыл про обещание. Просто пока нет времен... Jun 12 2008, 19:18 Daria Цитата(rezident @ Jun 12 2008, 23:18) 1. ... Jun 14 2008, 21:39  Dog Pawlowa Цитата(Daria @ Jun 15 2008, 00:39) Помоги... Jun 15 2008, 09:37  rezident Цитата(Daria @ Jun 15 2008, 03:39) Помоги... Jun 15 2008, 20:37   Daria Большое спасибо, rezident, теперь все получилось)) Jun 16 2008, 20:24     Daria Здравствуйте снова.
Rezident, спасибо за подробный... Jun 24 2008, 19:17 VAI Цитатаприбавлять число 0.5f.
если число положитель... Jun 17 2008, 03:32 rezident Daria, давайте все исходники (весь проект). Вариан... Jun 24 2008, 20:13 Daria Цитата(rezident @ Jun 25 2008, 00:13) Я б... Jun 25 2008, 18:18  NoName Цитата(Daria @ Jun 25 2008, 21:18) Функци... Jun 26 2008, 14:11   Daria Цитата(NoName @ Jun 26 2008, 18:11) Имеет... Jun 26 2008, 18:44    rezident Цитата(Daria @ Jun 27 2008, 00:44) Спасиб... Jun 26 2008, 20:30     Daria Цитата(rezident @ Jun 27 2008, 00:30) 5 а... Jun 28 2008, 20:14    NoName Цитата(Daria @ Jun 26 2008, 21:44) Спасиб... Jun 29 2008, 11:23     Daria Цитата(NoName @ Jun 29 2008, 15:23) Daria... Jun 29 2008, 21:10    Dog Pawlowa Цитата(Daria @ Jun 26 2008, 21:44) Спасиб... Jun 30 2008, 06:50     Daria Цитата(Dog Pawlowa @ Jun 30 2008, 10:50) ... Jun 30 2008, 16:58      Т.Достоевский Цитата(Daria @ Jun 30 2008, 20:58) ...Как... Jul 1 2008, 00:33       Daria Ау, rezident! Вы там вроде обещали... забыли и... Jul 3 2008, 18:16        Daria Снова я, здравствуйте
Такой вопрос - контроллер... Jul 15 2008, 19:37         NoName Цитата(Daria @ Jul 15 2008, 22:37) Снова ... Jul 16 2008, 09:33          Daria Цитата(NoName @ Jul 16 2008, 13:33) вопро... Jul 16 2008, 18:31
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|