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

Stm8 High И Low Bytes - Как Правильно От 0 До 100% Шим Изменить?


ukr823f

Рекомендуемые сообщения

рограммисты, помогите вот с такой задачей. Сейчас на ней немного подзастрял…

Для реализиции ШИМ записываются данные в такие регистры.

TIM2_ARRH = 0xc3; // High byte числа 50,000. — Частота ШИМ

TIM2_ARRL = 0x50; // Low byte числа 50,000.

TIM2_CCR1H = 0x30; // High byte числа 12,500 — Период ШИМ (Duty)

TIM2_CCR1L = 0xd4; // Low byte числа 12,500

И вот что нужно. Я хочу плавно увеличивать — уменьшать скважность ШИМ, только вот как это правильно делать? у меня то число рзбито на два байта.

В AVR проще — меняем OCRA = 255 и до нуля и получаем ШИМ от 0 до 100%, а вот как быть с двумя числами в STM8?

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

В AVR проще — меняем OCRA = 255 и до нуля и получаем ШИМ от 0 до 100%
Ага, особенно на 16-битном таймере Т1. А в stm8 нет буферизации? Просто в AVR в некоторых режимах регистр сравнения обновляется только по достижении счетчиком 0 или модуля счета. Еще можно на время переключения просто остановить таймер. Это всего пара тактов, никто не заметит.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

как это правильно делать?
Что по Вашему есть "правильно" ?
у меня то число рзбито на два байта
Ну и что ? А кто мешает изменять оба байта ? Какая разница сколько байтов менять, 1, 2, 4 ,... ?

Хотите получить разрешение в 8 бит (0-255) ? Пожалуйста, меняйте старший байт, и будет Вам счастье.

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

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Можете попробовать это более подробно.

Вот кусок примера

TIM2_PSCR = 0x04;	 // Делитель= 8.
TIM2_ARRH = 0x3e;	 // Старший байт числа 999. Частота
TIM2_ARRL = 0x07;	 // Младший байт числа 999 Частота
TIM2_CCR1H = 0x1f;	 // Старший байт числа 500.Скважность ШИМ 50%
TIM2_CCR1L = 0x04;	 // Младший байт числа 500.Скважность ШИМ 50%
TIM2_CCER1_CC1P = 0;
TIM2_CCER1_CC1E = 1;
TIM2_CCMR1_OC1M = 6; // режим ШИМ -PWM Mode 1
TIM2_CR1_CEN = 1;	 // Активируем таймер

Вот подскажите, как мне скважность ШИМ поменять с 50% до нуля. Как это сделать?

Я в AVR работал только с 8 бит ШИМ. Там декрементировали переменную и писали её значение в OCRA. Но там то было всего одно число, а тут блин два. Еу никак не пойму как это сделать, и пример что то не выходит найти в интернете

Изменено пользователем ukr823f
Ссылка на комментарий
Поделиться на другие сайты

unsigned int pwm;
...
TIM1_CCR1H=(unsigned char)(pwm>>8);
TIM1_CCR1L=(unsigned char)(pwm);

Это если без извращений. Кстати, вариант Alex'а не совсем подойдет: будет изменение либо от 0 до 254, либо от 1 до 255, в зависимости от младшего байта.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

unsigned int pwm;
...
TIM1_CCR1H=(unsigned char)(pwm>>8);
TIM1_CCR1L=(unsigned char)(pwm);

Это если без извращений. Кстати, вариант Alex'а не совсем подойдет: будет изменение либо от 0 до 254, либо от 1 до 255, в зависимости от младшего байта.

А подскажите - какой диапазон значений переменная pwm может иметь. Ну 0% шим - это 0 - понятно, а какое число тут будет отвечать за 100 % шим?

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

2 байта очевидно, какой еще может быть диапазон у переменной, запихваемой в 2 байта?

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

нет

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

нет

В может попробовать проще объяснить. 1байт равен 8 бит. Итого 2 байта- это 16 бит. 16 бит - это 65536

Пожалуйста, ответьте , ведь сложного ничего нет, но я допустим немогу понять - какое максимально число влезет в 2 байта

Потому что вот мои вычисления

в одном байте - 2^8-1 = 255

в двух байтах - 2^16-1 = 65535

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

Теперь да. В 2 байтах 65536 значений, максимальное из которых 65535.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

Кстати, вариант Alex'а не совсем подойдет: будет изменение либо от 0 до 254, либо от 1 до 255, в зависимости от младшего байта.
Ну скажем у меня не совсем был вариант, скорее вопрос. Т.к. не совсем понятно, что нужно человеку :)

Он написал :

В AVR проще — меняем OCRA = 255 и до нуля и получаем ШИМ от 0 до 100%

Отсюда и предложение менять старший байт.

Кстати, при значении младшего байта, равном нулю, меняя старший байт, получится 256 шагов - от 0 до 255.

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

Т.к. не совсем понятно, что нужно человеку :)

Ему нужно изменять значение регистра сравнения от 0 до 65535 (плавно). А работать с двухбайтными значениями он не умеет (пока).

Изменено пользователем Геннадий
Ссылка на комментарий
Поделиться на другие сайты

Не видел в его посте цифры от 0 до 65535, только 0-100% и заикание про 0-255 в АВРе.

Вполне логично предположить и другой вариант - ему хочется менять от 0 до 255, но у него есть 2 байта и он не знает что с ними делать.

Собственно, человеку в голову не залезешь, по этому приходится задавать наводящие вопросы, т.к. люди, порой, сами не понимают чего хотят. Отсюда, соответственно, не могут нормально задать вопрос.

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

Кстати, при значении младшего байта, равном нулю, меняя старший байт, получится 256 шагов - от 0 до 255.
Не совсем, это будет от 0 до 65280 (от 0% до 99.6%). Либо, если младший байт равен 0хFF, от 256 до 65535 (от 0.4% до 100%). С другой стороны, полпроцента - не то значение, на которое стоит обращать внимание.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

...И вот что нужно. Я хочу плавно увеличивать — уменьшать скважность ШИМ, только вот как это правильно делать? у меня то число рзбито на два байта.

...как быть с двумя числами в STM8?

Ему нужно ПЛАВНО.

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

Как будто в пределах 1 байта нельзя сделать плавно

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

Ну "плавно" - понятие относительное. В любом случае, получится не плавней дискретности.

Можно сделать 100 шагов по 1%, будет тоже плавно. А это в байт влезает легко, даже не 1 дискрета на процент.

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

Я в AVR работал только с 8 бит ШИМ. Там декрементировали переменную и писали её значение в OCRA. Но там то было всего одно число, а тут блин два. Еу никак не пойму как это сделать, и пример что то не выходит найти в интернете

Так и не научите парня работать с духбайтными числами? :)

Изменено пользователем Геннадий
Ссылка на комментарий
Поделиться на другие сайты

Я имел в виду с практической точки зрения (нет ничего лучше отцовского подзатыльника наставника). Получается гораздо понятнее. :yes:

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

Ну ему пример привели, думаю, этого вполне достаточно.

В идеале, хотелось бы услышать от товарища, что его конкретно интересует. Гадать лениво...

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

unsigned int pwm;
...
TIM1_CCR1H=(unsigned char)(pwm>>8);
TIM1_CCR1L=(unsigned char)(pwm);

Это если без извращений. Кстати, вариант Alex'а не совсем подойдет: будет изменение либо от 0 до 254, либо от 1 до 255, в зависимости от младшего байта.

Мужики, давайте продолжать правктические задания, потому что какой то атас опять

Как я понял по этому коду

unsigned int pwm=0;
TIM2_CCR1H=(unsigned char)(pwm>>8);
TIM2_CCR1L=(unsigned char)(pwm);

Я при значении переменной pwm=0 , будем иметь ШИМ = 0%, а при значении pwm=65535 - буду иметь ШИМ=100%

Но вот что то несходиться. При установке значения pwm = 32768, я по идее должен был иметь ШИМ равен 50%, а вместо того имею ШИМ равный 100%

Методом тыка установил что у меня 50 % ШИМ выходит при значении переменной pwm=8200 (примерно). А при значении pwm=16400 Имеем шим 100%

Что я опять наделал не так...???

Вот полный код примера

#include "iostm8s003k3.h"
#include "stdint.h"
#include "intrinsics.h"
unsigned int pwm=0;

int main( void )
{

CLK_ICKR = 0;	
CLK_ICKR_HSIEN = 1;
CLK_ECKR = 0;
while (CLK_ICKR_HSIRDY == 0);
CLK_CKDIVR = 8;
CLK_PCKENR1 = 0xff;
CLK_PCKENR2 = 0xff;
CLK_CCOR = 0;
CLK_HSITRIMR = 0;	
CLK_SWIMCCR = 0;
CLK_SWR = 0xe1;
CLK_SWCR = 0;
CLK_SWCR_SWEN = 1;
while (CLK_SWCR_SWBSY != 0);

 TIM2_CR1 = 0;
TIM2_IER = 0;
TIM2_SR2 = 0;
TIM2_CCER1 = 0;
TIM2_CCER2 = 0;
TIM2_CCER1 = 0;
TIM2_CCER2 = 0;
TIM2_CCMR1 = 0;
TIM2_CCMR2 = 0;
TIM2_CCMR3 = 0;
TIM2_CNTRH = 0;
TIM2_CNTRL = 0;
TIM2_PSCR = 0;
TIM2_ARRH = 0;
TIM2_ARRL = 0;
TIM2_CCR1H = 0;
TIM2_CCR1L = 0;
TIM2_CCR2H = 0;
TIM2_CCR2L = 0;
TIM2_CCR3H = 0;
TIM2_CCR3L = 0;
TIM2_SR1 = 0;

TIM2_PSCR = 0x04;	 // Делитель 8.
TIM2_ARRH = 0x3e;	 // старший байт числа 999
TIM2_ARRL = 0x07;	 // младший байт числа 999
TIM2_CCR1H = 0x1f;	 // старший байт числа 500 (50% шим)
TIM2_CCR1L = 128;	 // сладший байт числа 500(50% шм)
TIM2_CCER1_CC1P = 0;
TIM2_CCER1_CC1E = 1;
TIM2_CCMR1_OC1M = 6;
TIM2_CR1_CEN = 1;

PD_DDR_bit.DDR0 = 1; //Настраиваем 7й пин порта C на выход
PD_CR1_bit.C10 = 1; //Переключаем его в режим push-pull (это когда он может выдавать

PB_DDR_DDR7 = 0;
PB_CR1_bit.C17 = 1;
PB_CR2_bit.C27 = 1;

//Настраиваем оба прерывания на срабатывание по спаду напряжения (задний фронт)
EXTI_CR1_PDIS = 1;
EXTI_CR2_TLIS = 0;
asm("RIM");

while (1) //В цикле будем мигать светодиодом
{

 pwm=8191;
TIM2_CCR1H=(unsigned char)(pwm>>8);
TIM2_CCR1L=(unsigned char)(pwm);
};

}

Вот при значении pwm=8191, ШИМ получается 50%

И вот прикрепляю скрин с осциллограмма с ножки , на которую выдаётся ШИМ. на картинке -значение переменной pwm = 15000;

post-177795-0-78931800-1410781597_thumb.jpg

Изменено пользователем ukr823f
Ссылка на комментарий
Поделиться на другие сайты

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

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

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

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

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

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...