Generování PWM signálu na STM32F4
Moderátori: psichac, Moderátori
- jirka.jirka.
- 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
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
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
Re: Generování PWM signálu na STM32F4
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.
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
- jirka.jirka.
- 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
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?
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
Re: Generování PWM signálu na STM32F4
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?
K čemu potřebuješ tak vysoký modulační PWM signál?
0
- jirka.jirka.
- 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
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.
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.
0
- Tribec Zacks
- 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
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.
Re: Generování PWM signálu na STM32F4
a co analog? Pokial viem, PWM sa da generovat aj operakom, na vstup das nejake dac...
Alebo je to blbost
Alebo je to blbost
0
- jirka.jirka.
- 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
Takže zde je nastavení hodin:
Nastavení PWM a výstupního pinu:
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é.
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();
}
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 s frekvencí dolů není žádný problém.
Takže si myslím, že je to použitelné.
0
Re: Generování PWM signálu na STM32F4
Tak hlavně že se vydařilo. Na ten násobič před timerem jsem úplně zapomněl .
0
-
- Podobné témy
- Odpovedí
- Zobrazení
- Posledný príspevok