Перейти к содержанию
    

Только что, dimir сказал:

Мне кажется что DMA в  этом плане не очень подходит

В каком плане?

2 минуты назад, dimir сказал:

Каким образом это произвести?

12 часов назад, Сергей Борщ сказал:

Можно быстро-быстро методом DDS набить половину массива, натравить на массив ПДП в циклическом режиме и пока ПДП скармливает эту половину таймеру - быстро-быстро набить вторую половину массива. Потом повторять набивание первой/второй половин в прерываниях HTIF/TCIF.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 минут назад, dimir сказал:

Метод DDS ?И в прерывании по DMA.

Да, прямой цифровой синтез в прерывании ПДП.

15 минут назад, dimir сказал:

Некоторая периферия перестаёт просто работать.

Какая именно периферия? Показывайте код, разберемся вместе. У меня все работает, так что дело тут явно не в периферии.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 21.08.2022 в 11:39, Сергей Борщ сказал:

Какая именно периферия? Показывайте код, разберемся вместе. У меня все работает, так что дело тут явно не в периферии.

Ну я пытался писать в обработчике прерываний по DMA.И у меня переставал работать LCD c I2С.DMA работало с ADC.В основном цикле всё работает.Может это с периферией связано потому как в AVR ADC в прерывании работает то проблеммы те же LCD перестаёт работать.Если 5 каналов включить.У меня другой вопрос как это половина массива отправить а вторую потом?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

#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=&par;
  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.Покажите пример?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

/*
 * 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.

 

Изменено пользователем dimir

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 - когда переданы все данные. Когда передана половина данных - на их место можно писать новые для следующего цикла. Когда переданы все - можно писать на место второй половины, пока ПДП передает первую (если его запустить в циклическом режиме - он после передачи второй половины автоматически снова начнет передавать первую).

Утром попробую найти код, которым студенту объяснял прямой цифровой синтез для запуска трехфазного синхронного двигателя.

Добавлено: нашел переписку со студентом, кода там нет. Будет время - накидаю заново, но не обещаю, что прямо завтра.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Настраивать эти флаги в майне?.Я хочу вас огорчить.Или озадачить вернее сказать.DMA если шим подавать модуляции  будет.Только нужно в цикличном прерывании.И тогда взможно 3 фазы для эл.двигателя. Вы преподаватель?

Изменено пользователем dimir

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

@Сергей Борщ, увы, автору не помогут примеры, ИМХО. У него LCD и I2C отваливаются, какой тут DDS. А про DMA вообще молчу, ТС просто не понимает что это такое, с чем едят и что за циклический режим Вы ему пытаетесь показать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 22.08.2022 в 10:12, Arlleex сказал:

@Сергей Борщ, увы, автору не помогут примеры, ИМХО. У него LCD и I2C отваливаются, какой тут DDS. А про DMA вообще молчу, ТС просто не понимает что это такое, с чем едят и что за циклический режим Вы ему пытаетесь показать.

Да не помогут DMA.Сигнал должен быть промодулированный.На avr пример есть.Проблема в управлении частотой.Я  понимаю суть что и с чем едят.Хоть и любитель.Не гуру и не профессор.Когда работает частотник есть такой свист.Это и есть модулируемая частота.DMA не решит этой проблеммы.

Изменено пользователем dimir

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 8/21/2022 at 12:58 PM, Сергей Борщ said:

Чтобы не вызывать прерывание таймера на каждый отсчет, а готовить сразу кучу отсчетов в прерывании ПДП. 

Там основная частота шима 5КГц, dimir  своим кодингом отчётов на секунды нашлёпает, представляешь какая реакция на кнопки будет?

К тому-же у него три таблицы шима, под три фазы - то-есть человек практически не обучаем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, dimir сказал:

Когда работает частотник есть такой свист.

Чтобы убрать свист надо повышать частоту ШИМа. За пределы звукового диапазона. Если повысить до 20кГц, то свиста не будет слышно. 5кГц - это крайне некомфортно будет для всех, кто рядом находится. Если токи более/менее существенные.

Ну или искать глухой персонал для работы с вашим частотником.  :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 8/22/2022 at 2:33 PM, jcxz said:

Чтобы убрать свист надо повышать частоту ШИМа.

Выше 5КГц - железо мотора начинает дико греться. Не обмотки, не якорь, и даже не провода, а именно пакет железных пластин - на котором катушки намотаны. Для того чтобы обойти потери - ставят внешние индукторы. Частотник в подобном исполнении выдаёт на выхлоп уже не шим, а готовый к употреблению синус, чистый как слеза электрика.

Есно низкочастотные дешёвые игбт с али - для этой цели уже не годятся. Применяются классические мосфеты целыми пачками, на частотах в 200Кгц и выше. Дроссели кстати тоже пачками на одну фазу, потому как качественного дешёвого кольца на 5 киловатт  - просто не существует. Ну и цена взлетает в космос.

Использовать скалярное управление при подобных тратах на железо - просто кощунство. Это как атомной станцией управлять через Z80.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 минут назад, AVI-crak сказал:

Выше 5КГц - железо мотора начинает дико греться. Не обмотки, не якорь, и даже не провода, а именно пакет железных пластин - на котором катушки намотаны.

У меня рядом работает двигатель с ШИМом ~20кГц. Но если верить вам, то он давно должен был расплавиться.  :biggrin:

А по пригородам тут бегают электробусы с ШИМом = ~10кГц. С утра до вечера по маршруту бегают. И тоже почему-то не плавятся.  :unknw:

А если бы в них был ШИМ на 5кГц, то думаю в салоне такого и вы недолго бы выдержали. Не говоря уже о том, что водил пришлось бы набирать только глухих.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 часов назад, dimir сказал:

Настраивать эти флаги в майне?

Для начала прочитать их описание в документации на контроллер.

5 часов назад, dimir сказал:

Я хочу вас огорчить.Или озадачить вернее сказать.DMA если шим подавать модуляции  будет.

Перечитал несколько раз. Так ничего и не понял.

5 часов назад, dimir сказал:

И тогда взможно 3 фазы для эл.двигателя

Как же у студента из одного массива ШИМом формировались три синусоиды и от них трехфазный синхронный двигатель крутился и скорость регулировалась? Как у меня ATмега88 (без ПДП - его там нет) с кварцем 16 МГц формирует 31 кГц ШИМом 6 синусоид 400 Гц из одного массива с огибающей синуса для управления 3 двухфазными двигателями ДиД, оцифровывает 2 сельсина, считает ПИДы следящих систем и успевает еще общаться с управляющим компьютером? Как такая же ATmega88 формирует тем же ШИМом из того же массива огибающей два трехфазных напряжения частотой 400 Гц с плавным нарастанием частоты и амплитуды от 0 до заданных значений и потом с плавным снижением частоты и амплитуды до нуля?

5 часов назад, dimir сказал:

Вы преподаватель?

Нет. Но приходится обучать принятых на работу студентов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...