Generování PWM signálu na STM32F4

Všetko čo sa týka mikropočítačov + Sekcia Arduino

Moderátori: psichac, Moderátori

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1538
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Generování PWM signálu na STM32F4

Príspevok od používateľa jirka.jirka. » 11 Mar 2020, 17:36

Zdravím přátelé, kamarádi,

mám jeden dost netypický dotaz. Nezkoušel někdo generovat PWM signál o f_max=5MHz z STM32F4? Nikde se nemůžu dočíst, jestli to tento kus železa zvládne.

Konkrétně se bude jednat o STM32F405. Díky moc
0

popopepe
Stály člen
Stály člen
Príspevky: 404
Dátum registrácie: 22 Jún 2009, 00:00

Re: Generování PWM signálu na STM32F4

Príspevok od používateľa popopepe » 11 Mar 2020, 18:09

APB2 Timery běží na 84 MHz. Takže by to mělo jít, jenom rozlišení PWM bude malé.
Při 80MHz clock do timeru , prescaler 0, ARR-> 16 dá výstup 5MHz. Takže frekvence není problém.
Ale CNT se musí vejít do těch 16 - no a máš jenom 15 výstupních možnosti pro časování PWM pomocí ARR vs CNT vs CCR.

Tak pokud ti to stačí mít cca 15 možností šířky pulsu, tak by to neměl být problém.

EDIT: jenom úprava názvu registru. :-)
0

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1538
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: Generování PWM signálu na STM32F4

Príspevok od používateľa jirka.jirka. » 11 Mar 2020, 18:58

No dle DS jsem si myslel, že to bude použitelné, ale je to ještě horší, než jsem si to myslel.
Ne nezní to moc dobře. Protože PWM bude použito jako modulační signál. Takže ta střída bude potřeba. Není nějaký obvod, který by generoval PWM (komunikující třeba po I2C nebo SPI) 5MHz s lepší nastavitelností střídy?
0

popopepe
Stály člen
Stály člen
Príspevky: 404
Dátum registrácie: 22 Jún 2009, 00:00

Re: Generování PWM signálu na STM32F4

Príspevok od používateľa popopepe » 11 Mar 2020, 19:23

Ta frekvence je dost vysoká, když budeš chtít PWM třeba jenom 100 úrovní, tak potřebuješ rozlišení hodin 100 x vyšší než celá perioda, takže potřebuješ hodiny 100 x 5=500MHz. Takže nevím... jestli to je nějak rozumně řešitelné.
K čemu potřebuješ tak vysoký modulační PWM signál?
0

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1538
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: Generování PWM signálu na STM32F4

Príspevok od používateľa jirka.jirka. » 11 Mar 2020, 19:30

Máme firemní testovací generátor a teď je požadavek jej ovládat jiným způsobem. Takže to zkouším nějak rozlousknout. Už mi chybí jenom to PWM-ko a je to hotové...
Nějak jsem si to spočítal, ale pořádně jsem to nestudoval. No uvidíme co vytáhnu z toho STM-ka.

Ještě se podívám po STM32H7... Když už nic jiného nezbyde. Zde je výkonu hodně, ale musím nastudovat ty timery. Nuž nedá se nic dělat. Jenom škoda, že ta H7 je obrovská obluda. A jenom kvůli PWM. :roll:
0

popopepe
Stály člen
Stály člen
Príspevky: 404
Dátum registrácie: 22 Jún 2009, 00:00

Re: Generování PWM signálu na STM32F4

Príspevok od používateľa popopepe » 11 Mar 2020, 19:33

To jo, H7 už je pořádná mrcha.
0

Používateľov profilový obrázok
Tribec Zacks
Pokročilý člen
Pokročilý člen
Príspevky: 709
Dátum registrácie: 26 Jún 2010, 00:00
Bydlisko: Levice / Cork IRL
Vek: 41
Kontaktovať používateľa:

Re: Generování PWM signálu na STM32F4

Príspevok od používateľa Tribec Zacks » 11 Mar 2020, 20:45

jirka, TIM2 na stm32f4xx je plne 32bit timer, ma aj 32bit compare register, bezi na 42MHz max, popripade trochu overclock zvladne (186->240) ak nieje zivot ohrozujuca aplikacia :-)
0
Kreativita a motivacia je to, co prinasa originalne napady a myslienky, disciplina je to, co ich dokaze zrealizovat.

Používateľov profilový obrázok
mac26
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1298
Dátum registrácie: 01 Feb 2010, 00:00
Bydlisko: Martin

Re: Generování PWM signálu na STM32F4

Príspevok od používateľa mac26 » 11 Mar 2020, 21:54

a co analog? Pokial viem, PWM sa da generovat aj operakom, na vstup das nejake dac...
Alebo je to blbost
0

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1538
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: Generování PWM signálu na STM32F4

Príspevok od používateľa jirka.jirka. » 12 Mar 2020, 12:26

Takže zde je nastavení hodin:

Kód: Vybrať všetko

void SystemClock_Config(void) {
	uint32_t i;

	LL_FLASH_SetLatency(LL_FLASH_LATENCY_5);

	  if(LL_FLASH_GetLatency() != LL_FLASH_LATENCY_5)
	  {
	  }
	  LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE1);
	  LL_RCC_HSE_Enable();

	   /* Wait till HSE is ready */
	  while(LL_RCC_HSE_IsReady() != 1)
	  {

	  }
	  LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSE, LL_RCC_PLLM_DIV_4, 160, LL_RCC_PLLP_DIV_2);
	  LL_RCC_PLL_Enable();

	   /* Wait till PLL is ready */
	  while(LL_RCC_PLL_IsReady() != 1)
	  {

	  }
	  LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1);
	  LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_4);
	  LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_2);
	  LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL);

	   /* Wait till System clock is ready */
	  while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL)
	  {

	  }
	  LL_Init1msTick(160000000);
	  LL_SetSystemCoreClock(160000000);


	// clock enable
	LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_PWR);
	LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_SYSCFG);

	// MCU FLASH
	LL_FLASH_EnablePrefetch();
}
Nastavení PWM a výstupního pinu:

Kód: Vybrať všetko

void initpwm(void)
{
	LL_TIM_InitTypeDef TIM_InitStruct;
	LL_TIM_OC_InitTypeDef TIM_OC_InitStruct;
	LL_TIM_BDTR_InitTypeDef TIM_BDTRInitStruct;
	LL_GPIO_InitTypeDef GPIO_InitStruct;

	/* Enable the peripheral clock of GPIOs */

	LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOA);
	/* Peripheral clock enable */
	LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_TIM1);
	/* TIM1 interrupt Init */

	NVIC_SetPriority(TIM1_CC_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 0, 0));
	NVIC_EnableIRQ(TIM1_CC_IRQn);

	TIM_InitStruct.Prescaler = 0;
	TIM_InitStruct.CounterMode = LL_TIM_COUNTERMODE_UP;
	TIM_InitStruct.Autoreload = 31;
	TIM_InitStruct.ClockDivision = LL_TIM_CLOCKDIVISION_DIV1;
	TIM_InitStruct.RepetitionCounter = (uint8_t) 0x00;
	LL_TIM_Init(TIM1, &TIM_InitStruct);
	LL_TIM_SetClockSource(TIM1, LL_TIM_CLOCKSOURCE_INTERNAL);
	LL_TIM_OC_EnablePreload(TIM1, LL_TIM_CHANNEL_CH1);

	TIM_OC_InitStruct.OCMode = LL_TIM_OCMODE_PWM1;
	TIM_OC_InitStruct.OCState = LL_TIM_OCSTATE_DISABLE;
	TIM_OC_InitStruct.OCNState = LL_TIM_OCSTATE_DISABLE;
	TIM_OC_InitStruct.CompareValue = ((LL_TIM_GetAutoReload(TIM1) + 1) / 4);
	TIM_OC_InitStruct.OCPolarity = LL_TIM_OCPOLARITY_HIGH;
	TIM_OC_InitStruct.OCNPolarity = LL_TIM_OCPOLARITY_HIGH;
	TIM_OC_InitStruct.OCIdleState = LL_TIM_OCIDLESTATE_LOW;
	TIM_OC_InitStruct.OCNIdleState = LL_TIM_OCIDLESTATE_LOW;

	/* Initialize TIM instance according to parameters defined in        */

	/* initialization structure.                        */
	LL_TIM_OC_Init(TIM1, LL_TIM_CHANNEL_CH1, &TIM_OC_InitStruct);
	LL_TIM_OC_DisableFast(TIM1, LL_TIM_CHANNEL_CH1);
	LL_TIM_SetTriggerOutput(TIM1, LL_TIM_TRGO_RESET);
	LL_TIM_DisableMasterSlaveMode(TIM1);

	TIM_BDTRInitStruct.OSSRState = LL_TIM_OSSR_DISABLE;
	TIM_BDTRInitStruct.OSSIState = LL_TIM_OSSI_DISABLE;
	TIM_BDTRInitStruct.LockLevel = LL_TIM_LOCKLEVEL_OFF;
	TIM_BDTRInitStruct.DeadTime = 0;
	TIM_BDTRInitStruct.BreakState = LL_TIM_BREAK_DISABLE;
	TIM_BDTRInitStruct.BreakPolarity = LL_TIM_BREAK_POLARITY_HIGH;
	TIM_BDTRInitStruct.AutomaticOutput = LL_TIM_AUTOMATICOUTPUT_DISABLE;
	LL_TIM_BDTR_Init(TIM1, &TIM_BDTRInitStruct);

	/*************************/

	/* GPIO AF configuration */

	/*************************/

	//PE8   ------> TIM1_CH1N
	/* GPIO TIM1_CH1N configuration */

	GPIO_InitStruct.Pin = LL_GPIO_PIN_8;
	GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
	GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH;
	GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
	GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
	GPIO_InitStruct.Alternate = LL_GPIO_AF_1;

	LL_GPIO_Init(GPIOA, &GPIO_InitStruct);

	LL_TIM_CC_EnableChannel(TIM1, LL_TIM_CHANNEL_CH1); /* Enable output on channel */
	LL_TIM_EnableCounter(TIM1);
	LL_TIM_EnableAllOutputs(TIM1);
}
A zdroj hodin pro TIM1 je z APB2 což jsem nastavil na 160MHz. Teda snad. A ono ojhle, podařilo se. 5MHz a střída jde měnit pro mě v dobrých krocích. :) Viz. pár měření. Omlouvám se za zákmity, ale sonda, vývojový kit, konce v luftech, ....
A s frekvencí dolů není žádný problém. :)

Takže si myslím, že je to použitelné.
Prílohy
SetClock.PNG
tek00000.png
tek00003.png
tek00004.png
tek00006.png
tek00007.png
0

popopepe
Stály člen
Stály člen
Príspevky: 404
Dátum registrácie: 22 Jún 2009, 00:00

Re: Generování PWM signálu na STM32F4

Príspevok od používateľa popopepe » 12 Mar 2020, 13:36

Tak hlavně že se vydařilo. Na ten násobič před timerem jsem úplně zapomněl :-) .
0

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok