13.09.2011, 15:36
|
|
Временная регистрация
Регистрация: 14.11.2008
Сообщений: 68
Сказал спасибо: 3
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Кто нибудь юзал EEPROM emulation в стм32 ?
киньте примерчик сишного кода, плиз
|
|
|
|
14.09.2011, 09:20
|
|
Вид на жительство
Регистрация: 05.07.2006
Адрес: Tashkent
Сообщений: 454
Сказал спасибо: 24
Сказали Спасибо 67 раз(а) в 44 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от DimanVIP
|
DMA_Config.DMA_M2M = DMA_M2M_Enable;
|
По-моему M2M здесь совсем не нужем.
|
|
|
|
14.09.2011, 14:56
|
|
Временная регистрация
Регистрация: 20.05.2010
Сообщений: 64
Сказал спасибо: 8
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от uk8amk
|
По-моему M2M здесь совсем не нужем.
|
Без этого светик своей ярости не меняет.
З.Ы. сейчас все переписал без использования библиотек стандартной периферии - все работает как надо.
Буду методом глубокого анализа вычислять в чем была трабла.
|
|
|
|
14.09.2011, 16:09
|
|
Временная регистрация
Регистрация: 20.05.2010
Сообщений: 64
Сказал спасибо: 8
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Вобщем, рабочий код выглядит так:
Код:
|
#include ‹stm32l1xx.h›
#include ‹stm32l1xx_gpio.h›
#include ‹stm32l1xx_rcc.h›
#include ‹stm32l1xx_tim.h›
#include ‹stm32l1xx_dma.h›
const uint8_t dma_buffer[6] = { 20, 30, 40, 50, 60, 70 };
void mcu_dma_channel1_init(void)
{
DMA_InitTypeDef DMA_Config;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
DMA_DeInit(DMA1_Channel1);
DMA_Config.DMA_PeripheralBaseAddr = (uint32_t)&TIM4-›CCR1;
DMA_Config.DMA_MemoryBaseAddr = (uint32_t)&dma_buffer;
DMA_Config.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_Config.DMA_BufferSize = 6;
DMA_Config.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_Config.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_Config.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_Config.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_Config.DMA_Mode = DMA_Mode_Circular;
DMA_Config.DMA_Priority = DMA_Priority_Low;
DMA_Config.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1, &DMA_Config);
DMA_Cmd(DMA1_Channel1, ENABLE);
}
void mcu_tim4_init(void)
{
TIM_TimeBaseInitTypeDef TIM_BaseConfig;
TIM_OCInitTypeDef TIM_OCConfig;
GPIO_InitTypeDef GPIO_Config;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOBEN, ENABLE);
GPIO_Config.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_Config.GPIO_Mode = GPIO_Mode_AF;
GPIO_Config.GPIO_OType = GPIO_OType_PP;
GPIO_Config.GPIO_Speed = GPIO_Speed_40MHz;
GPIO_Init(GPIOB, &GPIO_Config);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_TIM 4);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_TIM 4);
TIM_BaseConfig.TIM_Prescaler = 10 - 1;
TIM_BaseConfig.TIM_Period = 0xff;
TIM_BaseConfig.TIM_ClockDivision = 0;
TIM_BaseConfig.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &TIM_BaseConfig);
/* Channel1 Configuration in PWM mode */
TIM_OCConfig.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCConfig.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCConfig.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCConfig.TIM_Pulse = 1;
TIM_OC1Init(TIM4, &TIM_OCConfig);
/* Enable TIM2 DMA interface */
TIM_DMACmd(TIM4, TIM_DMA_CC1, ENABLE);
TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);
TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM4, ENABLE);
TIM_Cmd(TIM4, ENABLE);
}
int main(void)
{
mcu_tim4_init();
mcu_dma_channel1_init();
while (1)
{
}
} |
Изменения коснулись:
const uint 8_t dma_buffer[6] = { 20, 30, 40, 50, 60, 70 };
DMA_Config.DMA_PeripheralDataSize = DMA_PeripheralDataSize_ HalfWord;
DMA_Config.DMA_MemoryDataSize = DMA_MemoryDataSize_ HalfWord;
DMA_Config.DMA_M2M = DMA_M2M_ Disable;
Маловероятно что повлияло:
DMA_Config.DMA_Priority = DMA_Priority_ Low;
На выходе имеем:
|
|
|
|
14.09.2011, 16:27
|
|
Частый гость
Регистрация: 10.11.2006
Адрес: Київ
Сообщений: 34
Сказал спасибо: 4
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Изучаем STM32 Cortex M3
Подскажите пожалуйста, реально ли сделать на STM32F10X генерацию синуса ШИМом, частоту синуса нужно изменять в процессе работы в пределах 20Гц-200кГц с шагом в 1Гц?
Синусоиды нужно 2 и они должны бить сдвинуты одна относительно другой.
Заранее ответившим спасибо!!!
|
|
|
|
14.09.2011, 16:45
|
|
Гражданин KAZUS.RU
Регистрация: 12.10.2009
Сообщений: 576
Сказал спасибо: 30
Сказали Спасибо 138 раз(а) в 110 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Alexey_1811,
Что понимается под словом "реально"? STM может вычислять синус в реальном времени (по таблице) до ~300 000 раз в секунду (при F_CPU=24 МГц), ограничение будет только по разрядности самого ШИМа, т.к. она ограничивается частотой тактирования таймеров.
Я делал драйвер для двигателя, там было 3 синуса и частота ШИМ 100 кГц - все прекрасно работало. От частоты самого синуса объем вычислений не зависит.
|
|
|
|
14.09.2011, 16:49
|
|
Частый гость
Регистрация: 10.11.2006
Адрес: Київ
Сообщений: 34
Сказал спасибо: 4
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Изучаем STM32 Cortex M3
Сообщение от tanq
|
tanq,
Я делал драйвер для двигателя, там было 3 синуса и частота ШИМ 100 кГц - все прекрасно работало.
|
Не поделитесь исходником?
Ну или частью программы где реализована процедура генерации?
Последний раз редактировалось Alexey_1811; 14.09.2011 в 17:54.
|
|
|
|
16.09.2011, 18:39
|
|
Гражданин KAZUS.RU
Регистрация: 12.10.2009
Сообщений: 576
Сказал спасибо: 30
Сказали Спасибо 138 раз(а) в 110 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Alexey_1811,
Вот весьма упрощенный вариант (без манипуляций с амплитудой):
unsigned long time, time_step;
short phase1, phase2, phase3;
short sin512[512] = {........};
void timer_irq(void)
{
time += time_step;
phase1 = sin512[time››23];
phase2 = sin512[(time+0x55555555)››23];
phase3 = sin512[(time+0xAAAAAAA)››23];
}
Меня всегда дико забавляет как призводители впаривают высокопроизводительные DSP для управления мотором. Выше приведенный код, видимо, настолько крут, что требует векторного процессора на 100 МГц
|
|
|
|
16.09.2011, 21:57
|
|
Частый гость
Регистрация: 03.12.2009
Сообщений: 27
Сказал спасибо: 1
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
|
|
|
|
16.09.2011, 22:22
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.10.2010
Сообщений: 1,752
Сказал спасибо: 158
Сказали Спасибо 640 раз(а) в 364 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от big.chupakabra
|
Посмотрите любую апноту по векторному управлению движком и оцените обьем вычислений сами
|
Хм. А у движка, кроме скорости вращения (момента вращения), еще есть чем управлять?
Просто интересно.
А зачем векторное управление скоростью вращения? Похоже очередная игра в терминологию.
У меня в монтировке движки управляются довольно простеньким PIC-ом.
Последний раз редактировалось Ar-Gen-Tum; 16.09.2011 в 22:29.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 03:13.
|
|