Умоляю помогите, уже руки опустились. Имею плату DUE, построил программу для управления этой платой через ModBus панелькой Delta HMI, программировал через FLProg, все было прекрасно пока мне не понадобилось управлять драйвером сервопривода по step dir. Все блоки которые нашел и тестировал мне не нравились т.к. на высоких частотах шаг увеличения частоты увеличивался. Аналоговое управление решил оставить на последок если не смогу осилить step dir
Нашел прекрасно работающий код просто не реального гения в моих глазах - @dimax
void setup() {
Serial.begin(9600);
REG_PIOC_OER|=1<<3; //PC3 будет выход
REG_PIOC_PDR|=1<<3;//PC3 будет периферия
REG_PIOC_ABSR|=1<<3; //периферия "Б" выбрана
REG_PMC_PCER1|=1<<4; //включить тактирование "PWM"
REG_PWM_WPCR=0;//отлючение защиты от записи
REG_PWM_CLK=0; //клоки АБ выключены
REG_PWM_CMR0=1; //Мастерклок прескалер по умолчанию /2
REG_PWM_CPRD0= 42000u; // период по умолчанию -1000 Герц
REG_PWM_CDTY0=21000ul; //дьюти по умолчанию 50%
REG_PWM_ENA|=1<<0;//Включить PWM 0 канал
}
void loop() {
uint32_t divider=1, icr=0, freq2pwm=0; uint16_t duty=0;
if(Serial.available() > 0){
freq2pwm = Serial.parseInt();
duty=Serial.parseInt();
icr=(84E6 /freq2pwm /divider);
for(byte i=1; i<12;i++){
if (icr >65535) {
divider= 1<<i;
icr=(84E6 /freq2pwm /divider); }
else { REG_PWM_CMR0 = i-1; break; } //делитель в регистр
}//end for
REG_PWM_CPRDUPD0=icr; //запись периода
if (duty){ REG_PWM_CDTYUPD0= (uint32_t)icr*(100-duty)/100; }
else { REG_PWM_CDTYUPD0=icr/2;}
Serial.print("Freq= ");
Serial.print((uint32_t)84E6/icr/divider); Serial.println(" Herz");
}// end is serial
} //end loop
Протестировал на максимальной частоте драйвера 500кГц меня бы устроили и 100кГц. Но после зашил свой код и он перестал работать, панель выдает ошибки по связи, пины периодически самопроизвольно срабатывают, скорее всего из за попыток панели установить связь. Перерыл интернет как сделать сброс нашел rstc_start_software_reset(RSTC); и RSTC->RSTC_CR = 0xA5000005; но как я его только не загружал и питание отключал и ждал, не помогло. И сам пытался из скетча @dimax вернуть регистры на место, чего только мои кривые руки не натворили. Читать 1400 листов по этому процессору вгоняют в еще большую депрессию, а так не хочется ждать другую плату. Печали нет предела. Еще пробовал скетч @dimax
// выход генератора -пин 2 на Arduino DUE
void setup() {
Serial.begin(9600);
REG_PIOB_OER|=1<<25; //b25 будет выход
REG_PIOB_PDR|=1<<25;//b25 будет периферия
REG_PIOB_ABSR|=1<<25; //периферия "Б" выбрана
REG_PMC_PCER0|=1<<27; //включить тактирование "TC0"
REG_TC0_CMR0=(1<<14)|(1<<15)|(1<<18)|(1<<19);//WAVE конфиг
}
void loop() {
static uint32_t freq2tc=0;
if (Serial.available() > 0){
freq2tc = Serial.parseInt();
REG_TC0_RC0= 21E6/freq2tc;
REG_TC0_CCR0=5;
Serial.print(21E6/REG_TC0_RC0,0);
Serial.println(" Herz");
} //end if serial..
}
но он не заработал у меня. Не ругайтесь сильно, зарегистрировался и пишу от отчаяния.