суббота, 10 марта 2012 г.

I & STM32-discovery part11 - pwm

ШИМ - широтно-импульсная модуляция, имеет очень много применений. Основная особенность ШИМ - с минимум обвязки или без оной можно получить относительно быстро меняющийся аналоговый сигнал. генерация многоканального (2 и более) является одной из функций таймеров мк.



Принцип работы режима ШИМ в таймере следующий - состояние вывода переключается так же как и в режиме по сравнению, но переключение происходит и в начале счета. В итоге мы имеем импульс длину которого можно задать в регистре сравнения.

В таймерах stm32 есть два режима ШИМ:
  1. При инкрементном режиме счетчика - высокий уровень пока счетчик меньше регистра сравнения/захвата, иначе низкий логический уровень. При декрементом режиме наоборот.
  2. При инкрементном режиме - низкий логический уровень пока счетчик меньше регистра сравнения/захвата, иначе высокий логический уровень. При декрементом режиме также наоборот.
Такой подход имеет свои плюсы - можно получить сдвинутые по фазе сигналы, что позволяет упростить алгоритм программы.
На этом мы заканчиваем теорию и приступаем к реализации.
Создаем папку нового проекта и переходим в нее:

nis@jane ~/stm32/examples $ cp -a 05-tim3/ 06-tim3-pwm
nis@jane ~/stm32/examples $ cd 06-tim3-pwm/

В основном коде модифицируем инициализацию для узлов сравнения 3 и 4 переведя их в режим ШИМ №1:

/** setup CC3..4 to PWM mode 1 */
        TIM3->CCMR2 |= TIM_CCMR2_OC3M_2 | TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC4M_2 | TIM_CCMR2_OC4M_1;

А заодно упростим обработчик внешнего прерывания, заменив предыдущий код на операцию xor с нулевым битом управления режимо узла сравнение 3.
В зависимости от состояния бита происходит работа узла либо в режиме ШИМ №1 либо ШИМ №2:

/* EXTI line0 interrupt */
void EXTI_L0_Handler(void) {
    if (EXTI->PR & (1 << 0)) {
        TIM3->CCMR2 ^= TIM_CCMR2_OC3M_0;
        EXTI->PR |= (1 << 0);
    }
   
}

Полные файлы проекта.

main.c:



startup.c:



Соберем проект и запишем его во флешь мк:

nis@jane ~/stm32/examples/06-tim3-pwm $ make all write
arm-softfloat-linux-gnueabi-gcc -g -O2 -mlittle-endian -mthumb -ffreestanding -nostdlib -nostdinc -mcpu=cortex-m3 -DSTM32F10X_MD_VL -I. -I../../stlink/example/libs_stm/inc/base -I../../stlink/example/libs_stm/inc/core_support -I../../stlink/example/libs_stm/inc/device_support -Wl,-T,stm32f100xb_flash.ld   -c -o startup.o startup.c
arm-softfloat-linux-gnueabi-gcc -g -O2 -mlittle-endian -mthumb -ffreestanding -nostdlib -nostdinc -mcpu=cortex-m3 -DSTM32F10X_MD_VL -I. -I../../stlink/example/libs_stm/inc/base -I../../stlink/example/libs_stm/inc/core_support -I../../stlink/example/libs_stm/inc/device_support -Wl,-T,stm32f100xb_flash.ld -o firmware.elf main.o sys_init.o startup.o -L.
arm-softfloat-linux-gnueabi-objcopy -O binary firmware.elf firmware.bin
st-flash write v1 firmware.bin 0x8000000
2012-03-10T15:38:06 INFO src/stlink-common.c: Loading device parameters....
2012-03-10T15:38:06 INFO src/stlink-common.c: Device connected is: F1 Medium-density Value Line device
2012-03-10T15:38:06 INFO src/stlink-common.c: SRAM size: 0x2000 bytes (8 KiB), Flash: 0x20000 bytes (128 KiB) in pages of 1024 bytes
2012-03-10T15:38:06 INFO src/stlink-sg.c: Successfully opened a stlink v1 debugger
2012-03-10T15:38:06 INFO src/stlink-common.c: Successfully unlocked flash
Erasing chip entirely... Done
2012-03-10T15:38:06 INFO src/stlink-common.c: Attempting to write 612 (0x264) bytes to stm32 address: 134217728 (0x8000000)
2012-03-10T15:38:06 INFO src/stlink-common.c: Erasing flash page at addr: 0x8000000
2012-03-10T15:38:06 INFO src/stlink-common.c: Successfully unlocked flash
2012-03-10T15:38:06 INFO src/stlink-common.c: Finished erasing 1 pages of 1024 (0x400) bytes
2012-03-10T15:38:06 INFO src/stlink-common.c: Starting Flash write for VL core id
2012-03-10T15:38:06 INFO src/stlink-common.c: Successfully loaded flash loader in sram
2012-03-10T15:38:06 INFO src/stlink-common.c: Writing flash block 0 of size 64 (0x40)
...
2012-03-10T15:38:07 INFO src/stlink-common.c: Successfully unlocked flash
2012-03-10T15:38:07 INFO src/stlink-common.c: Writing flash block 9 of size 64 (0x40)
2012-03-10T15:38:07 INFO src/stlink-common.c: Successfully unlocked flash
2012-03-10T15:38:07 INFO src/stlink-common.c: Starting verification of write complete
2012-03-10T15:38:07 INFO src/stlink-common.c: Flash written and verified! jolly good!

Видео работы прошивки:

На этом все.

Комментариев нет:

Отправить комментарий