stm32f103 выкинуть спарку DC мотор квадратурный энкодер

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
qwer-31
Родился
Сообщения: 1
Зарегистрирован: Сб ноя 19, 2016 13:05:51

stm32f103 выкинуть спарку DC мотор квадратурный энкодер

Сообщение qwer-31 »

доброе время суток уважаемые форумчяни
прошу помощи по такой нестандартной задачи
нужно выкинуть спарку-- dc мотор квадратурный энкодер--
то есть меряем шим с выходов Н моста по результатам измерения
генерируем сигнал квадратурного энкодера
при включеннии устройства происходит тест
работы энкодера в обе стороны и тест
работы на разных скоростях
мой эмулято с ним успешно справляется
выдавая нужное количество импульсов на нужной частоте
дальше происходит следующие эмуляция может работать
час или несколько минут далее устройство выпадает в ошибку
не получив нужный сигнал энкодера
но что самое не понятное для меня после перезагрузки устройства
при тесте если не перезагрузить -контроллёр эмулятора на stm32f103- устройство
выпадает в ошибку
связь моего контроллёра с устройством только через опторязвязки
нет иона для питания ацп
в программе нет фильтров для ацп не учитывается разгон и торможение двигателя
но она как то работает
//** ЦЕЛЬ:выкинуть спарку DC мотор квадратурный энкодер****
//***********************************************************
// контроллёр stm32f103 среда Keil
// меряю 2 канала шим результат в DMA
// настраиваю таймеры для генерации квадратурного сигнала
// TIM3 тактирует TIM1
// TIM3 -- стоп,старт,частота
// TIM1 -- направление - изменяя делители в каналах TIM1 на противоположные
// TIM1 -- никогда не выключается
//***********************************************************
// частота ядра 40 мГц
// частота измеряемого шим сигнала 25кГц - 40 µs
// шим в dc - на входе в ацп 2 звена фильтра с - 0.1 , r - 10 к
// максимальная частота энкодера 8кГц - 125 µs
// время выполнения кода примерно 13 µs.
// прерывание от TIM2 11кГц - 90 µs
//***********************************************************
// переменные обьявляю так
// до фанаря какие типы использовать
// результат практически одинаковый
//***********************************************************
uint16_t volatile ADC1ConvertedValue[2]; // данные с двух каналов ацп
uint16_t volatile ADC11,ADC12; //
volatile float spid = 0; //
volatile float spid_n = 0; //
volatile uint16_t spid2= 0; //
//***********************************************************
//***********************************************************
void TIM2_IRQHandler (void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update)!= RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
ADC12=ADC1ConvertedValue[1]; // данные ШИМ 1 КАНАЛ
ADC11=ADC1ConvertedValue[0]; // данные ШИМ 2 КАНАЛ
//****************направление вращения************************
spid = ADC12 - ADC11;
if(spid>=20)
{
TIM_SetCompare1(TIM1, 20);
TIM_SetCompare2(TIM1, 40);
}

else if(spid<20)
{
TIM_SetCompare1(TIM1, 40);
TIM_SetCompare2(TIM1, 20);
}
//*********избавляемся от знака,подганяем переменную *********
//**************под массив с делителями для TIM3 *************
if(spid < 0)
{
spid_n =(spid*-1);
}
if(spid > 0) {
spid_n =spid;
}
spid2= spid_n /8;
//*****************ограничиваем переменную*********************
//*******присваиваем делителю TIM3 значение из массива*********
if(spid2>238)
{
spid2 =238;
}
TIM3->PSC = table[spid2];

//*****************включаем выключаем энкодер******************
if(spid2 <=8)
{
TIM_Cmd(TIM3, DISABLE);
}
else if(spid2 > 8 )
{
TIM_Cmd(TIM3, ENABLE);
}
}
}
//***********************************************************
//***********************************************************
Реклама
Ответить

Вернуться в «ARM»