Сергей Борщ 143 21 августа, 2022 Опубликовано 21 августа, 2022 · Жалоба Только что, dimir сказал: Мне кажется что DMA в этом плане не очень подходит В каком плане? 2 минуты назад, dimir сказал: Каким образом это произвести? 12 часов назад, Сергей Борщ сказал: Можно быстро-быстро методом DDS набить половину массива, натравить на массив ПДП в циклическом режиме и пока ПДП скармливает эту половину таймеру - быстро-быстро набить вторую половину массива. Потом повторять набивание первой/второй половин в прерываниях HTIF/TCIF. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimir 2 21 августа, 2022 Опубликовано 21 августа, 2022 · Жалоба Метод DDS ?И в прерывании по DMA.Некотороя периферия перестаёт просто работать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 21 августа, 2022 Опубликовано 21 августа, 2022 · Жалоба 14 минут назад, dimir сказал: Метод DDS ?И в прерывании по DMA. Да, прямой цифровой синтез в прерывании ПДП. 15 минут назад, dimir сказал: Некоторая периферия перестаёт просто работать. Какая именно периферия? Показывайте код, разберемся вместе. У меня все работает, так что дело тут явно не в периферии. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimir 2 21 августа, 2022 Опубликовано 21 августа, 2022 · Жалоба В 21.08.2022 в 11:39, Сергей Борщ сказал: Какая именно периферия? Показывайте код, разберемся вместе. У меня все работает, так что дело тут явно не в периферии. Ну я пытался писать в обработчике прерываний по DMA.И у меня переставал работать LCD c I2С.DMA работало с ADC.В основном цикле всё работает.Может это с периферией связано потому как в AVR ADC в прерывании работает то проблеммы те же LCD перестаёт работать.Если 5 каналов включить.У меня другой вопрос как это половина массива отправить а вторую потом? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimir 2 21 августа, 2022 Опубликовано 21 августа, 2022 · Жалоба #include"main.h" #include<stdio.h> #define SYSCLOCK 72000000U __IO uint32_t tmpreg; __IO uint32_t SysTick_CNT = 0; //volatile uint16_t adc_data=0; uint16_t txData[255]; __IO uint8_t fl_adc; volatile uint16_t adc_data[4]={0}; volatile unsigned char sec,min,hour,day,date,month,year; volatile unsigned char menu_btn; volatile unsigned char menu_lcd; uint8_t status; uint8_t dt[8]; uint16_t raw_temper; float temper; char c; struct { volatile uint16_t Ua; volatile uint16_t Ub; volatile uint16_t Uc; volatile uint16_t Ia; volatile uint16_t Ib; volatile uint16_t Ic; }par,*par_p; char buf0[20]; char buf1[20]; char buf2[20]; char buf3[20]; char buf4[20]; char buf5[20]; char buf6[20]; char buf7[20]; char buf8[20]; char buf9[50]; char buf10[50]; volatile unsigned char flag=0; volatile unsigned char flag1=0; volatile unsigned int pauza=0; volatile unsigned int pauza1=0; volatile unsigned char flag2=0; volatile unsigned char flag3=0; volatile unsigned int pauza2=0; volatile unsigned int pauza3=0; volatile unsigned char a1; volatile unsigned char a2; volatile unsigned char b1; volatile unsigned char b2; volatile unsigned char c1; volatile unsigned char c2; volatile unsigned char d1; volatile unsigned char d2; volatile unsigned int a; volatile unsigned int b; volatile unsigned int d; unsigned int result_a; unsigned int result_b; unsigned int result_c; unsigned int result_d; uint8_t BAT1 [8]= { 0B01110, 0B01010, 0B11111, 0B10001, 0B10001, 0B10001, 0B10001, 0B11111 }; uint8_t BAT2 [8]= { 0B01110, 0B01010, 0B11111, 0B10001, 0B10001, 0B10001, 0B11111, 0B11111 }; uint8_t BAT3 [8]= { 0B01110, 0B01010, 0B11111, 0B10001, 0B10001, 0B11111, 0B11111, 0B11111 }; uint8_t BAT4 [8]= { 0B01110, 0B01010, 0B11111, 0B10001, 0B11111, 0B11111, 0B11111, 0B11111 }; uint8_t BAT5 [8]= { 0B01110, 0B01010, 0B11111, 0B11111, 0B11111, 0B11111, 0B11111, 0B11111 }; struct { volatile unsigned char a1; volatile unsigned char a2; volatile unsigned char b1; volatile unsigned char b2; volatile unsigned char c1; volatile unsigned char c2; volatile unsigned char d1; volatile unsigned char d2; unsigned short int a; unsigned short int b; unsigned short int c; unsigned short int d; unsigned int result_a; unsigned int result_b; unsigned int result_c; unsigned int result_d; volatile unsigned char MA[10]; }danie; struct { volatile unsigned char menu_btn; volatile unsigned char menu_lcd; char buf0[50]; char buf1[50]; char buf2[50]; char buf3[50]; char buf4[50]; char buf5[50]; char buf6[50]; char buf7[50]; char buf8[50]; char buf9[50]; char buf10[50]; char buf11[50]; char buf12[50]; volatile unsigned char flag; volatile unsigned char flag1; volatile unsigned int pauza0; volatile unsigned int pauza1; volatile unsigned int pauza2; volatile unsigned int pauza3; volatile unsigned char flag2; volatile unsigned char flag3; volatile unsigned char flag4; volatile unsigned char flag5; volatile unsigned char flag6; volatile unsigned char flag7; volatile unsigned char flag8; volatile unsigned char flag_eeprom_error; volatile unsigned char flag_eeprom; volatile unsigned char flag_obriv_a; volatile unsigned char flag_obriv_b; volatile unsigned char flag_obriv_c; volatile unsigned char bit_obriv_a; volatile unsigned char bit_obriv_b; volatile unsigned char bit_obriv_c; volatile unsigned char flag_port_peregruz; volatile unsigned char bit_status_A; volatile unsigned char bit_status_B; volatile unsigned char bit_status_C; volatile unsigned char bit_status_D; }nastroyki,*nastroyki_n; struct { volatile unsigned int pauza1; } timer; struct { volatile unsigned int pauza1_A; volatile unsigned int pauza1_B; volatile unsigned int pauza1_C; volatile unsigned int pauza1_D; }timers; void DMA1_Channel1_IRQHandler (void) { if(DMA1->ISR & DMA_ISR_TCIF1) { DMA1->IFCR|= DMA_IFCR_CTCIF1; } if(DMA1->ISR& DMA_ISR_TEIF1) { DMA1->IFCR|= DMA_IFCR_CTEIF1; } } void DMA1_Channe4_IRQHandler (void) { if(DMA1->ISR& DMA_ISR_TCIF4) { DMA1->IFCR|= DMA_IFCR_CTCIF4; } if(DMA1->ISR& DMA_ISR_TEIF4) { DMA1->IFCR|= DMA_IFCR_CTEIF4; } } void TIM1_UP_IRQHandler(void) { if(TIM1->SR & TIM_SR_UIF) { TIM1->SR &= ~ TIM_SR_UIF; { } } } void TIM2_IRQHandler (void) { if(TIM2->SR & TIM_SR_UIF) { TIM2->SR &= ~ TIM_SR_UIF; if((GPIOB->IDR&GPIO_IDR_IDR5)==0) { //nastroyki.flag1=1; nastroyki_n->flag=1; nastroyki_n->pauza1++; pauza1=0; } if((nastroyki_n->flag==1)&&(GPIOB->IDR&GPIO_IDR_IDR5)&&(nastroyki_n->pauza1>10)&&(nastroyki_n->pauza1<100)) { nastroyki_n->flag=0; // nastroyki.flag1=0; nastroyki_n->pauza1=0; //nastroyki.pauza=0; nastroyki_n-> menu_lcd++; menu_btn++; } if((nastroyki_n->flag==1)&&(GPIOB->IDR&GPIO_IDR_IDR5)&&(nastroyki_n->pauza1>100)) { nastroyki_n->flag=0; //nastroyki.flag1=0; nastroyki_n->pauza1=0; nastroyki_n-> menu_lcd=0; menu_btn=0; } } } void TIM3_IRQHandler (void) { if(TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~ TIM_SR_UIF; } } void TIM4_IRQHandler (void) { if(TIM4->SR & TIM_SR_UIF) { TIM4->SR &= ~ TIM_SR_UIF; } } void SysTick_Handler(void) { if(SysTick_CNT > 0) SysTick_CNT--; } void init_systimer(void) { MODIFY_REG(SysTick->LOAD,SysTick_LOAD_RELOAD_Msk,SYSCLOCK / 1000 - 1); CLEAR_BIT(SysTick->VAL, SysTick_VAL_CURRENT_Msk); SET_BIT(SysTick->CTRL, SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk); } void delay(__IO uint32_t tck) { while(tck) { tck--; } } //---------------------------------------------------------- void delay_ms(__IO uint32_t ms) { MODIFY_REG(SysTick->VAL,SysTick_VAL_CURRENT_Msk,SYSCLOCK / 1000 - 1); SysTick_CNT = ms; while(SysTick_CNT) {} } void DelayMicro(__IO uint32_t micros) { micros *=(SystemCoreClock / 1000000) / 9; while (micros--); } void NMI_Handler(void) { if((RCC->CIR & RCC_CIR_CSSF) != 0) // HSE fail { RCC->CIR |= RCC_CIR_CSSC; // Clear CSSF flag } } void RCC_init(void) { FLASH->ACR |=FLASH_ACR_PRFTBE ; FLASH->ACR|=FLASH_ACR_LATENCY_2; RCC->CR |=RCC_CR_HSEON ; while(!(RCC->CR&RCC_CR_HSERDY )) { } RCC->CR |=RCC_CR_CSSON ; RCC->CFGR|=RCC_CFGR_PLLSRC; RCC->CFGR|=RCC_CFGR_PLLXTPRE_HSE; RCC->CFGR|=RCC_CFGR_PLLMULL9; RCC->CFGR|=RCC_CFGR_HPRE_DIV1; //_VAL2FLD(RCC_CFGR_HPRE,1); RCC->CFGR|=RCC_CFGR_PPRE1_DIV2 ;//_VAL2FLD(RCC_CFGR_PPRE1,2); RCC->CFGR|=RCC_CFGR_PPRE2_DIV1; //_VAL2FLD(RCC_CFGR_PPRE2,1); RCC->CFGR|= RCC_CFGR_ADCPRE_DIV2; RCC->CR|=RCC_CR_PLLON; while(!(RCC->CR&RCC_CR_PLLRDY)) { } RCC->CFGR|=RCC_CFGR_SW_PLL; while(!(RCC->CFGR&RCC_CFGR_SWS_PLL )) { } } void WWDT_init(void) { RCC->APB1ENR =RCC_APB1ENR_WWDGEN; WWDG->CFR|=_VAL2FLD(WWDG_CFR_WDGTB,0); WWDG->CFR|=WWDG_CFR_EWI; } void IWDT_init(void) { RCC->CSR|= RCC_CSR_LSION; //while(!(RCC->CSR &RCC_CSR_LSIRDY )); IWDG->KR =0x5555; IWDG->PR|= _VAL2FLD(IWDG_PR_PR,0); // IWDG->PR &=~(IWDG_PR_PR_2|IWDG_PR_PR_1|IWDG_PR_PR_0); // 4096 IWDG->RLR =3000;//0x7FF; while (!((IWDG->SR & IWDG_SR_PVU) && (IWDG->SR & IWDG_SR_RVU))){} // wait while bist of PVU and RVU will be set. IWDG->KR =0xCCCC; // Start count down; } int main(void) { //nastroyki_n->menu_lcd=0; // Timer=&timer; par_p=∥ nastroyki_n=&nastroyki; IWDT_init(); RCC_init(); init_systimer(); APB_init(); GPIO_init(); timer_1_init(); timer_2_init(); timer_3_init(); timer_4_init(); // USART1_Init(); // USART1_DMA_Init(); adc1_DMA1_init(); I2C1_Init(); LCD_ini(); LCD_Clear(); LCD_CreateChar(BAT1,1); LCD_CreateChar(BAT2,2); LCD_CreateChar(BAT3,3); LCD_CreateChar( BAT4,4); LCD_CreateChar(BAT5,5); while(1) { switch(nastroyki_n->menu_lcd) { case 0: IWDG->KR= 0xAAAA; LCD_SetPos(0,0); LCD_SendChar('M'); LCD_SendChar('a'); LCD_SendChar(0xBC); LCD_SendChar('a'); LCD_SendChar(' '); LCD_PrintMyChar(1); break; case 1: IWDG->KR= 0xAAAA; LCD_SetPos(0,0); LCD_SendChar(0xA8); LCD_SendChar('a'); LCD_SendChar(0xBE); LCD_SendChar('a'); LCD_SendChar(' '); LCD_PrintMyChar(2); break; case 2: IWDG->KR= 0xAAAA; LCD_SetPos(0,0); LCD_SendChar('K'); LCD_SendChar('p'); LCD_SendChar('o'); LCD_SendChar(0xBB); LCD_SendChar(0xB8); LCD_SendChar(0xBA); LCD_PrintMyChar(2); break; case 3: IWDG->KR= 0xAAAA; LCD_SetPos(0,0); LCD_SendChar(0xA4); LCD_SendChar('a'); LCD_SendChar(0xC7); LCD_SendChar(0xE5); LCD_SendChar(' '); LCD_PrintMyChar(5); // LCD_SendChar(0x9B); break; case 4: nastroyki_n-> menu_lcd=0; break; } } } Ну вот обработчик по DMA.Покажите пример? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimir 2 21 августа, 2022 Опубликовано 21 августа, 2022 (изменено) · Жалоба /* * atmega128 pwm.c * * Created: 20.08.2017 13:52:41 * Author : User */ #define F_CPU 800000UL #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include <math.h> volatile long int p; struct { volatile char flag1; volatile char flag2; volatile char flag3; volatile char flag4; volatile int bit1; }status; volatile unsigned int K=0; volatile unsigned int i; //sinusA=(sin(2px/T)+1)*127 //sinusB=(sin(2px/T+2p/3)+1)*127 //sinusB=(sin(2px/T-2p/3)+1)*127 const int sinusA[128]={237,233,230,226,222,218,214,204,199,194,192,188,183,177,171,166,161,154,147,141,135, 129,123,116,110,104,98,92,86,80,74,69,63,58,53,48,43,38,34,30,26,22, 19,16,13,10,8,6,4,2,1,0,0,0,0,0,1,2,3,4,6,10,11, 14,17,20,23,27,31,35,40,44,49,54,59,65,70,76,82,88,94,100,106,112,118,124,131,137,143, 149,155,161,167,173,179,185,190,195,200,205,210,215,219,223,227,231,234,238,240,243,245,247,249,251,252,253,253,253,253,253,252,251, 250,249,247,245,342,239}; const int sinusB[128]={127,134,140,146,152,158,164,170,176,182,187,193,198,203,208,213,217,222,226,230,233, 236,240,242,245,247,249,251,252,253,254,254,254,254,254,253,252,251,249,247,245,242, 240,236,233,230,226,222,217,213,208,203,198,193,187,182,176,170,164,158,152,146,140, 134,127,121,115,109,103,97,91,85,79,73,68,62,57,52,47,42,38,33,29,25,22,19,15,13,10, 8,6,4,3,2,1,1,0,1,1,2,3,4,6,8,10,13,15,19,22,25,29,33,38,42,47,52,57,62,68,73,79,85, 91,97,103,109,115,121}; const int sinusC[128]={17,14,11,8,6,4,3,2,1,0,0,0,0,0,1,2,4,6,8,10,13,15,19,22,26,30, 34,38,43,48,53,63,68,74,80,86,92,98,104,110,116,122,129.135,141,147,153,159,165,171, 177,183,188,194,199,204,209,213,218,222,226,230,234,236,239,242,245,247,249,250,251, 252,253,253,253,253,253,252,251,249,247,245,243,240,238,234,231,227,223,219,215,210, 205,200,195,190,185,179,173,167,161,155,149,143,138,131,124,119,112,106,100,94,88,82, 76,70,65.59,54,49,44,40,35,31,27,23,20 }; ISR(TIMER0_COMP_vect) { // OCR3B=sinusA[K]; TCNT0=0; K++; } ISR(TIMER1_COMPA_vect) { OCR3A=sinusA[i]; OCR3B=sinusB[i]; OCR3C=sinusC[i]; i++; if(i>127) { i=0; } } void init_ports() { PORTB|=(0<<4)|(0<<5)|(0<<6)|(0<<7); DDRB|=(1<<4)|(1<<5)|(1<<6)|(1<<7); DDRE|=(0<<2)|(1<<3)|(1<<4)|(1<<5); PORTE|=(1<<2)|(0<<3)|(0<<4)|(0<<5); } void init_timers() { //TCCR3B=(1<<WGM31)|(1<<CS30); // TCCR1B=0x69; // TCCR3B|=0x09; ; TIMSK|=(0<<OCIE2)|(0<<TOIE2)|(0<<TICIE1)|(1<<OCIE1A)|(0<<OCIE1B)|(0<<TOIE1)|(1<<OCIE0)|(0<<TOIE0); TIFR|=(0<<OCF2)|(0<<TOV2)|(0<<ICF1)|(0<<OCF1A)|(0<<OCF1B)|(0<<TOV1)|(1<<OCF0)|(0<<TOV0); TCCR1B|=(0<<ICNC1)|(0<<ICES1)|(1<<WGM13)|(1<<WGM12)|(0<<CS12)|(0<<CS11)|(1<<CS10); TCCR1A|=(0<<COM1A1)|(0<<COM1A0)|(0<<COM1B1)|(0<<COM1B0)|(0<<COM1C1)|(0<<COM1C0)|(1<<WGM11)|(1<<WGM10); TCCR1C|=(0<<FOC1A)|(0<<FOC1B)|(0<<FOC1C); TCCR3A|=(1<<COM3A1)|(0<<COM3A0)|(1<<COM3B1)|(0<<COM3B0)|(1<<COM3C1)|(0<<COM3C0)|(0<<WGM31)|(1<<WGM30); TCCR3B|= (0<<ICNC3)|(0<<ICES3)|(0<<WGM33)|(1<<WGM32)|(0<<CS32)|(0<<CS31)|(1<<CS30); TCCR3C|=(0<<FOC3A)|(0<<FOC3B)|(0<<FOC3C); TCCR2|=(0<<FOC2)|(1<<WGM20)|(1<<COM21)|(0<<COM20)|(0<<WGM21)|(0<<CS22)|(0<<CS21)|(1<<CS20); TCCR0|=(0<<FOC0)|(1<<WGM00)|(1<<COM01)|(0<<COM00)|(1<<WGM01)|(0<<CS02)|(0<<CS01)|(0<<CS00); TCNT0=0; TCNT1H=0; TCNT1L=0; TCNT2=0; TCNT3L=0; TCNT3H=0; OCR0=0; OCR2=0; // OCR1AH=0x04; // OCR1AL=0xE2; OCR1AH=50; OCR1AL=50; OCR3A=0; //OCR3A=1000; OCR3B=0; OCR3C=0; } int main(void) { init_ports(); init_timers(); asm("sei"); while (1) { } } А вот мои три фазы но на avr. Изменено 21 августа, 2022 пользователем dimir Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 21 августа, 2022 Опубликовано 21 августа, 2022 · Жалоба 5 часов назад, dimir сказал: void DMA1_Channel1_IRQHandler (void) { if(DMA1->ISR & DMA_ISR_TCIF1) { DMA1->IFCR|= DMA_IFCR_CTCIF1; } if(DMA1->ISR& DMA_ISR_TEIF1) { DMA1->IFCR|= DMA_IFCR_CTEIF1; } } Вот сразу тут: 1) Зачем дважды читать ISR? достаточно прочитать его один раз во временную переменную и потом проверять биты флагов в этой переменной. 2) делать "или" с содержимым IFCR не имеет смысла - оттуда всегда читаются нули. Поэтому нужно в него только писать (DMA1->IFCR = DMA_IFCR_CTCIF1;) На логику работы не повлияет, но какие-то такты сэкономите. Настройки ПДП в коде не нашел - может вы там разрешили еще какое-то прерывание, флаг которого не обрабатываете и поэтому программа после выхода из обработчика попадает в него снова. 11 часов назад, dimir сказал: .У меня другой вопрос как это половина массива отправить а вторую потом? У ПДП есть два флага - HTIF выставляется, когда передана половина от запрошенного количества данных и TCIF - когда переданы все данные. Когда передана половина данных - на их место можно писать новые для следующего цикла. Когда переданы все - можно писать на место второй половины, пока ПДП передает первую (если его запустить в циклическом режиме - он после передачи второй половины автоматически снова начнет передавать первую). Утром попробую найти код, которым студенту объяснял прямой цифровой синтез для запуска трехфазного синхронного двигателя. Добавлено: нашел переписку со студентом, кода там нет. Будет время - накидаю заново, но не обещаю, что прямо завтра. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimir 2 22 августа, 2022 Опубликовано 22 августа, 2022 (изменено) · Жалоба Настраивать эти флаги в майне?.Я хочу вас огорчить.Или озадачить вернее сказать.DMA если шим подавать модуляции будет.Только нужно в цикличном прерывании.И тогда взможно 3 фазы для эл.двигателя. Вы преподаватель? Изменено 22 августа, 2022 пользователем dimir Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 22 августа, 2022 Опубликовано 22 августа, 2022 · Жалоба @Сергей Борщ, увы, автору не помогут примеры, ИМХО. У него LCD и I2C отваливаются, какой тут DDS. А про DMA вообще молчу, ТС просто не понимает что это такое, с чем едят и что за циклический режим Вы ему пытаетесь показать. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimir 2 22 августа, 2022 Опубликовано 22 августа, 2022 (изменено) · Жалоба В 22.08.2022 в 10:12, Arlleex сказал: @Сергей Борщ, увы, автору не помогут примеры, ИМХО. У него LCD и I2C отваливаются, какой тут DDS. А про DMA вообще молчу, ТС просто не понимает что это такое, с чем едят и что за циклический режим Вы ему пытаетесь показать. Да не помогут DMA.Сигнал должен быть промодулированный.На avr пример есть.Проблема в управлении частотой.Я понимаю суть что и с чем едят.Хоть и любитель.Не гуру и не профессор.Когда работает частотник есть такой свист.Это и есть модулируемая частота.DMA не решит этой проблеммы. Изменено 22 августа, 2022 пользователем dimir Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AVI-crak 0 22 августа, 2022 Опубликовано 22 августа, 2022 · Жалоба On 8/21/2022 at 12:58 PM, Сергей Борщ said: Чтобы не вызывать прерывание таймера на каждый отсчет, а готовить сразу кучу отсчетов в прерывании ПДП. Там основная частота шима 5КГц, dimir своим кодингом отчётов на секунды нашлёпает, представляешь какая реакция на кнопки будет? К тому-же у него три таблицы шима, под три фазы - то-есть человек практически не обучаем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 245 22 августа, 2022 Опубликовано 22 августа, 2022 · Жалоба 1 час назад, dimir сказал: Когда работает частотник есть такой свист. Чтобы убрать свист надо повышать частоту ШИМа. За пределы звукового диапазона. Если повысить до 20кГц, то свиста не будет слышно. 5кГц - это крайне некомфортно будет для всех, кто рядом находится. Если токи более/менее существенные. Ну или искать глухой персонал для работы с вашим частотником. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AVI-crak 0 22 августа, 2022 Опубликовано 22 августа, 2022 · Жалоба On 8/22/2022 at 2:33 PM, jcxz said: Чтобы убрать свист надо повышать частоту ШИМа. Выше 5КГц - железо мотора начинает дико греться. Не обмотки, не якорь, и даже не провода, а именно пакет железных пластин - на котором катушки намотаны. Для того чтобы обойти потери - ставят внешние индукторы. Частотник в подобном исполнении выдаёт на выхлоп уже не шим, а готовый к употреблению синус, чистый как слеза электрика. Есно низкочастотные дешёвые игбт с али - для этой цели уже не годятся. Применяются классические мосфеты целыми пачками, на частотах в 200Кгц и выше. Дроссели кстати тоже пачками на одну фазу, потому как качественного дешёвого кольца на 5 киловатт - просто не существует. Ну и цена взлетает в космос. Использовать скалярное управление при подобных тратах на железо - просто кощунство. Это как атомной станцией управлять через Z80. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 245 22 августа, 2022 Опубликовано 22 августа, 2022 · Жалоба 14 минут назад, AVI-crak сказал: Выше 5КГц - железо мотора начинает дико греться. Не обмотки, не якорь, и даже не провода, а именно пакет железных пластин - на котором катушки намотаны. У меня рядом работает двигатель с ШИМом ~20кГц. Но если верить вам, то он давно должен был расплавиться. А по пригородам тут бегают электробусы с ШИМом = ~10кГц. С утра до вечера по маршруту бегают. И тоже почему-то не плавятся. А если бы в них был ШИМ на 5кГц, то думаю в салоне такого и вы недолго бы выдержали. Не говоря уже о том, что водил пришлось бы набирать только глухих. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 22 августа, 2022 Опубликовано 22 августа, 2022 · Жалоба 5 часов назад, dimir сказал: Настраивать эти флаги в майне? Для начала прочитать их описание в документации на контроллер. 5 часов назад, dimir сказал: Я хочу вас огорчить.Или озадачить вернее сказать.DMA если шим подавать модуляции будет. Перечитал несколько раз. Так ничего и не понял. 5 часов назад, dimir сказал: И тогда взможно 3 фазы для эл.двигателя Как же у студента из одного массива ШИМом формировались три синусоиды и от них трехфазный синхронный двигатель крутился и скорость регулировалась? Как у меня ATмега88 (без ПДП - его там нет) с кварцем 16 МГц формирует 31 кГц ШИМом 6 синусоид 400 Гц из одного массива с огибающей синуса для управления 3 двухфазными двигателями ДиД, оцифровывает 2 сельсина, считает ПИДы следящих систем и успевает еще общаться с управляющим компьютером? Как такая же ATmega88 формирует тем же ШИМом из того же массива огибающей два трехфазных напряжения частотой 400 Гц с плавным нарастанием частоты и амплитуды от 0 до заданных значений и потом с плавным снижением частоты и амплитуды до нуля? 5 часов назад, dimir сказал: Вы преподаватель? Нет. Но приходится обучать принятых на работу студентов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться