Jump to content
Sign in to follow this  
K.A.

Тахометр stm32f1x

Recommended Posts

Добрый день. Пытаюсь собрать тахометр на stm32f100c8t6b. Вывод информации - четырехразрядный семисегментный индикатор, счетчик - таймер №1, 1ый канал. На системном таймере висит индикация показаний. Вычисление оборотов - в обработчике таймера 1. Проблема в том, что при подаче импульсов на PB13 (Tim1 Ch1) не происходит прерывания. Скажите, пожалуйста, что я упускаю из виду. Заранее большое спасибо.

Скрытый текст


/* Includes & Defines-----------------------------------------------------------*/
#include <stm32f10x.h>
#include <stm32f10x_gpio.h>
#include <stm32f10x_rcc.h>
#include <stm32f10x_tim.h>
#include <misc.h>

// Определние цифр в соответствии с подлкюченными выводами
#define Nul	    	(0xB7)
#define One	    	(0x11)
#define Two	    	(0xAB)
#define Three	    (0x9B)
#define Four	    (0x1D)
#define Five	    (0x9E)
#define Six	    	(0xBE)
#define Seven	    (0x13)
#define Eight	    (0xBF)
#define Nine	    (0x5F)
/*-----------------------------------------------------------------------------*/
 uint32_t capture1 = 0, capture2 = 0, period = 0, number = 0;
 uint8_t capture_is_first = 1, capture_is_ready = 0, A1 = 0xbf, A2 = 0xbf, A3 = 0xbf, A0 = 0xbf;
 uint16_t number_to_mask_conversion(uint16_t X);


uint32_t number_conversion(uint32_t coll)									//Функция преобразования времени в отдельные числа
{

//	coll *= 60;
//	coll /= 5000;
	if (coll >= 1000)
		{
			A0 = (coll - coll % 1000) / 1000;
			A0 = number_to_mask_conversion(A0);
			coll = coll%1000;
		}
	if  (coll >= 100)
		{
			A1 = (coll - coll % 100) / 100;
			A1 = number_to_mask_conversion(A1);
			coll = coll%100;
		}
	if (coll >= 10)
		{
			A2 = (coll - coll % 10) / 10;
			A2 = number_to_mask_conversion(A2);
			coll = coll%10;
		}
	if (coll >= 1)
		{
			A3 = (coll - coll % 1) / 1;
			A3 = number_to_mask_conversion(A3);
			coll = coll%1;
		}
	return (A3, A2, A1, A0);
}

uint16_t number_to_mask_conversion(uint16_t X){
	if (X == 0) {number = Nul; return number;}
	if (X == 1) {number = One; return number;}
	if (X == 2) {number = Two; return number;}
	if (X == 3) {number = Three; return number;}
	if (X == 4) {number = Four; return number;}
	if (X == 5) {number = Five; return number;}
	if (X == 6) {number = Six; return number;}
	if (X == 7) {number = Seven; return number;}
	if (X == 8) {number = Eight; return number;}
	if (X == 9) {number = Nine; return number;}
}

void init_GPIO(void){
    /* Initialize Leds mounted on STM32 board */
    GPIO_InitTypeDef  GPIO_InitStructure;
    /* Initialize LED which connected to PC6,9, Enable the Clock*/
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);


//    GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);

    /* Configure the GPIO_LED pin */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    GPIO_Init(GPIOA, &GPIO_InitStructure);


    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
}

void init_timer(void)
{
  /* Включаем тактирование шины таймера TIM1 */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);

  TIM_TimeBaseInitTypeDef timer_base;
  TIM_TimeBaseStructInit(&timer_base);
  timer_base.TIM_Prescaler = 1600- 1;
  timer_base.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM1, &timer_base);

  TIM_ICInitTypeDef timer_ic;
  timer_ic.TIM_Channel = TIM_Channel_1;
  timer_ic.TIM_ICPolarity = TIM_ICPolarity_Rising;
  timer_ic.TIM_ICSelection = TIM_ICSelection_DirectTI;
  timer_ic.TIM_ICPrescaler = TIM_ICPSC_DIV1;
  timer_ic.TIM_ICFilter = 0;
  TIM_ICInit(TIM1, &timer_ic);

  TIM_ITConfig(TIM1, TIM_IT_CC1, ENABLE);
  TIM_Cmd(TIM1, ENABLE);



  NVIC_EnableIRQ(TIM1_CC_IRQn);
}

void SysTick_Configuration(void){

    RCC_ClocksTypeDef RCC_Clocks;
    RCC_GetClocksFreq(&RCC_Clocks);
    SysTick_Config(RCC_Clocks.HCLK_Frequency / 10000);
}

void SysTick_Handler(void){

	GPIOA->BSRR = A0;
	GPIOB->BRR = GPIO_Pin_3;
	GPIOB->BSRR = GPIO_Pin_3;
	GPIOA->BRR = A0;

	GPIOA->BSRR = A1;
	GPIOB->BRR = GPIO_Pin_0;
	GPIOB->BSRR = GPIO_Pin_0;
	GPIOA->BRR = A1;

	GPIOA->BSRR = A2;
	GPIOB->BRR = GPIO_Pin_4;
	GPIOB->BSRR = GPIO_Pin_4;
	GPIOA->BRR = A2;

	GPIOA->BSRR = A3;
	GPIOB->BRR = GPIO_Pin_1;
	GPIOB->BSRR = GPIO_Pin_1;
	GPIOA->BRR = A3;
}

uint16_t TIM1_CC_IRQHandler(void)
{
  if (TIM_GetITStatus(TIM1, TIM_IT_CC1) != RESET)
  {

    TIM_ClearITPendingBit(TIM1, TIM_IT_CC1);

    capture1 = capture2;
    capture2 = TIM_GetCapture1(TIM1);
    period = capture2 - capture1;

    if (!capture_is_first)
    	capture_is_ready = 1;

    	capture_is_first = 0;

    	return period;



  }
}

void main(void)
  {
      SysTick_Configuration();
      init_GPIO();
      init_timer();

      while (1)
      {

    	    number_conversion(period);


      }
  }

 

 

 

Taho_2.rar

Edited by K.A.

Share this post


Link to post
Share on other sites
2 hours ago, K.A. said:

uint16_t TIM1_CC_IRQHandler(void)

Обработчики прерываний не возвращают значения, исрпавьте на

void TIM1_CC_IRQHandler(void)

Share this post


Link to post
Share on other sites

а не проще ли сделать массив значений под семисегментный индикатор? и не нужны эти ифы.

Share this post


Link to post
Share on other sites

Вебинар STM32G0 – новый лидер бюджетных 32-битных микроконтроллеров от STMicroelectronics

Компания Компэл приглашает вас 25 сентября принять участие в вебинаре, который посвящен новому семейству микроконтроллеров STM32G0. Вебинар рассчитан на технических специалистов и тех, кто хорошо знаком с семейством STM32. На вебинаре будут освоены современные методы тестирования производительности микроконтроллеров на примере самых бюджетных 32-битных семейств общего назначения STM32G0 и STM32F0 и проведено их подробное сравнение.

Подробнее

может быть и проще, подумаю над Вашим предложением.

@snn_krs завтра на работе исправлю. 

Share this post


Link to post
Share on other sites

@snn_krs может ли такая ошибка в объявлении функции обработчика прерывания не давать контроллеру выставить флаг? Я запускаю симулятор в Кокосе и там не происходит никаких изменений в регистре статуса для таймера 1 

Share this post


Link to post
Share on other sites
                     

Литиевые батарейки Fanso в беспроводных датчиках пожарно-охранной сигнализации

Выбор подходящего элемента питания, способного обеспечивать требуемый уровень напряжения и выдавать необходимый ток на протяжении всего периода эксплуатации беспроводной пожарно-охранной системы является одной из первостепенных задач. Наиболее подходящим для этих целей элементом являются литий-тионилхлоридные элементы питания, а одним из наиболее конкурентоспособных производителей – компания Fanso, предлагающая своим клиентам продукты как универсальные, так и разработанные специально для решения конкретных задач.

Подробнее...

40 minutes ago, K.A. said:

может ли такая ошибка в объявлении функции обработчика прерывания не давать контроллеру выставить флаг?

Флаг должен устанавливаться, контроллер не знает о существовании обработчика прерывания. Возможно есть ошибка в инициализации таймера.

Share this post


Link to post
Share on other sites

@K.A. В реализации динамической индикации явные ошибки есть. Я бы сделал массив для сегментов и массив состояний для управления. Для управления крутить свой счетчик (простая переменная) и в прерывании выводить, сейчас там непонятно что.

Share this post


Link to post
Share on other sites

@MasterElectric Про массив сегментов полностью с Вами согласен, программу переписал. Единственный вопрос, если переменная period (значение которой выводится на дисплей) не изменяется с момента запуска программы, то на индикаторы ничего не выводится, но как только принудительно загружаешь туда постоянно изменяющееся значение(в коде я загружал значение счетчика таймера 1), то сразу появляется нормальная индикация. 

PS Если в майне задаешь значение периода, то все нормально выводится, видимо затык в том, что после инициализации, нужно изменить ее значение на произвольное. В общем то вопрос теперь исключительно риторический.

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

Скрытый текст


/* Includes & Defines-----------------------------------------------------------*/
#include <stm32f10x.h>
#include <stm32f10x_gpio.h>
#include <stm32f10x_rcc.h>
#include <stm32f10x_tim.h>
#include <misc.h>

// Определние цифр в соответствии с подлкюченными выводами
/*#define Nul	    	(0xB7)
#define One	    	(0x11)
#define Two	    	(0xAB)
#define Three	    (0x9B)
#define Four	    (0x1D)
#define Five	    (0x9E)
#define Six	    	(0xBE)
#define Seven	    (0x13)
#define Eight	    (0xBF)
#define Nine	    (0x5F)
*/
int symbol[10] = {0xB7, 0x11, 0xAB, 0x9B, 0x1D, 0x9E, 0xBE, 0x13, 0xBF, 0x5F};
int control[4] = {0x0008, 0x0001, 0x0010, 0x0002};
int A[4] = {0, 0, 0, 0};
/*-----------------------------------------------------------------------------*/
 uint32_t capture1 = 0, capture2 = 0, period = 0, number = 0;
 uint8_t capture_is_first = 1, capture_is_ready = 0, A1 = 0xbf, A2 = 0xbf, A3 = 0xbf, A0 = 0xbf, i = 0;
 uint16_t number_to_mask_conversion(uint16_t X);


uint32_t number_conversion(uint32_t coll)									//Функция преобразования времени в отдельные числа
{

//	coll *= 60;
//	coll /= 5000;
	if (coll >= 1000)
		{
			A0 = (coll - coll % 1000) / 1000;
//			A0 = number_to_mask_conversion(A0);
			A[0] = symbol[A0];
			coll = coll%1000;
		}
	if  (coll >= 100)
		{
			A1 = (coll - coll % 100) / 100;
//			A1 = number_to_mask_conversion(A1);
			A[1] = symbol[A1];
			coll = coll%100;
		}
	if (coll >= 10)
		{
			A2 = (coll - coll % 10) / 10;
//			A2 = number_to_mask_conversion(A2);
			A[2] = symbol[A2];
			coll = coll%10;
		}
	if (coll >= 1)
		{
			A3 = (coll - coll % 1) / 1;
//			A3 = number_to_mask_conversion(A3);
			A[3] = symbol[A3];
			coll = coll%1;
		}
	return (A3, A2, A1, A0);
}
/*
uint16_t number_to_mask_conversion(uint16_t X){
	if (X == 0) {number = Nul; return number;}
	if (X == 1) {number = One; return number;}
	if (X == 2) {number = Two; return number;}
	if (X == 3) {number = Three; return number;}
	if (X == 4) {number = Four; return number;}
	if (X == 5) {number = Five; return number;}
	if (X == 6) {number = Six; return number;}
	if (X == 7) {number = Seven; return number;}
	if (X == 8) {number = Eight; return number;}
	if (X == 9) {number = Nine; return number;}
}
*/
void init_GPIO(void){
    /* Initialize Leds mounted on STM32 board */
    GPIO_InitTypeDef  GPIO_InitStructure;
    /* Initialize LED which connected to PC6,9, Enable the Clock*/
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2ENR_AFIOEN , ENABLE);

//    GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);

    /* Configure the GPIO_LED pin */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    GPIO_Init(GPIOA, &GPIO_InitStructure);
//    GPIOA->BRR = GPIO_Pin_All;
//    GPIOB->BRR = GPIO_Pin_All;

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
}

void init_timer(void)
{
  /* Включаем тактирование шины таймера TIM1 */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);

  TIM_TimeBaseInitTypeDef timer_base;
  TIM_TimeBaseStructInit(&timer_base);
  timer_base.TIM_Prescaler = 1600- 1;
  timer_base.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM1, &timer_base);

  TIM_ICInitTypeDef timer_ic;
  timer_ic.TIM_Channel = TIM_Channel_1;
  timer_ic.TIM_ICPolarity = TIM_ICPolarity_Rising;
  timer_ic.TIM_ICSelection = TIM_ICSelection_DirectTI;
  timer_ic.TIM_ICPrescaler = TIM_ICPSC_DIV1;
  timer_ic.TIM_ICFilter = 0;
  TIM_ICInit(TIM1, &timer_ic);

  TIM_ITConfig(TIM1, TIM_IT_CC1, ENABLE);
  TIM_Cmd(TIM1, ENABLE);

  NVIC_EnableIRQ(TIM1_CC_IRQn);
}

void SysTick_Configuration(void){
    RCC_ClocksTypeDef RCC_Clocks;
    RCC_GetClocksFreq(&RCC_Clocks);
    SysTick_Config(RCC_Clocks.HCLK_Frequency / 300);
}

void SysTick_Handler(void){

	GPIOA->BRR = GPIO_Pin_All;
	GPIOB->BSRR = GPIO_Pin_All;

	GPIOA->BSRR = A[i];
	GPIOB->BRR = control[i];
	i++;
	if (i == 4)
		i = 0;
/*	GPIOA->BSRR = A0;
	GPIOB->BRR = GPIO_Pin_3;
	GPIOB->BSRR = GPIO_Pin_3;
	GPIOA->BRR = A0;

	GPIOA->BSRR = A1;
	GPIOB->BRR = GPIO_Pin_0;
	GPIOB->BSRR = GPIO_Pin_0;
	GPIOA->BRR = A1;

	GPIOA->BSRR = A2;
	GPIOB->BRR = GPIO_Pin_4;
	GPIOB->BSRR = GPIO_Pin_4;
	GPIOA->BRR = A2;

	GPIOA->BSRR = A3;
	GPIOB->BRR = GPIO_Pin_1;
	GPIOB->BSRR = GPIO_Pin_1;
	GPIOA->BRR = A3;*/
}

void TIM1_CC_IRQHandler(void)
{
  if (TIM_GetITStatus(TIM1, TIM_IT_CC1) != RESET)
  {
    TIM_ClearITPendingBit(TIM1, TIM_IT_CC1);

    capture1 = capture2;
    capture2 = TIM_GetCapture1(TIM1);
    period = capture2 - capture1;
    if (!capture_is_first)
    	capture_is_ready = 1;

    	capture_is_first = 0;

    	return period;

  }
}

void main(void)
  {
      SysTick_Configuration();
      init_GPIO();
      init_timer();

      while (1)
      {
    	    number_conversion(period);
//    	    SysTick_Handler();
//    	    period = TIM1->CNT;
//    	    TIM1_CC_IRQHandler();
      }
  }

 

 

Edited by K.A.

Share this post


Link to post
Share on other sites

Проблема с таймером решена, на изиэлектроникс подсказали, что вместо TIM1_CH1 использовал TIM1_CH1N. Перенёс вход таймера на PA8 и счет пошел, теперь буду калибровать. Спасибо Всем за помощь.

Edited by K.A.

Share this post


Link to post
Share on other sites

@K.A. Все-равно по индикации я не понял как оно работает. Я думал что будет массив для регистра BSRR. В массиве в каждом элементе должен быть сброс всех сегментов и установка тех что нужно.

unsigned char Buff[3];

    sprintf(Buff, "%d", 999);
    
    ...
    GPIOB->BRR = ClrAllControl;
    GPIOB->BSRR = control[i];
	GPIOA->BSRR = symbol[Buff[i]];
	if(++i == 4) i = 0;

 

 

Edited by MasterElectric

Share this post


Link to post
Share on other sites

@MasterElectric Ну я примерно так и сделал, для порта А, к которому подключены сигнальные линии, я написал массив символов с учетом подключения выводов контроллера к выводам семисегментного индикатора. Обнуление всех портов происходит вначале обработчика Систика, который является по сути функцией индикации показаний, затем выставляется нужный символ и управляющий вывод. 

Массив с символами для вывода на индикатор заполняется функцией number_conversion, которая разбивает посчитанное число на разряды и, в соответствии с разрядом, записывает в массив для вывода цифр значение индикатора.

Готов к конструктивной критике)С уважением, Артур

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

  • Similar Content

    • By n_angelo
      Привет. Хочу узнать ваше мнение. Я новичок в embedded. Можно сказать, что пришел с веба. Малость Python, JS, C. Меня, конечно, предупреждали начать с AVR, но я уверенный в себе решил сразу залезть на STM32. Вынашивая идею для проекта, параллельно курив Reference Manual и Data Sheet по STM32, я понял что его будет слишком жирно для проекта. Я перескочил на STM8L. И тут меня начал огорчать мир embedded. При переходе между stm8 и stm32 нужно менять IDE (TrueStudio на STVD). Во избежание таких курьёзов я пересаживаюсь на IAR. В процессе подключения родной библиотеки от ST, понимаю что библиотека от IAR для того же самого STM8L152C6T6 дико отличается (макросы, структуры). Привет веб-разработка. Как такое могло произойти, что под один и тот же контроллер ST даёт одну библиотеку, а IAR другую. И нигде в уроках тебя не предупредят об этом. Ну, ребят, у меня всего одна жизнь. Вы уже договоритесь там между собой? Придите к единому стандарту. Или они так решили новичков завендерлочить? Моё мнение (не претендует на правильное): пробираясь сквозь тернии популярной архитектуры ARM, инфраструктуры, инструментария, забываешь про бизнес-логику устройств. А еще просто пропасть между "я ничего не понимаю" и "господи, я зажег светодиод". Речь не о копипастерах с уроков, а действительно понимая что ты делаешь, в каком регистре, что меняешь. Это путь в 2000 (а то и больше) страниц на английском перечитанных по несколько раз, чтобы отоложилось. И в конце тебя ждут разные версии одной и той же библиотки в разных IDE. И сидишь вдупляешь... ну почему... я же в правильный регистр кладу правильную маску... ох, наболело. Такое ощущение что не для людей это всё делали, не для людей.
      Ваше мнение?
    • By Olga Kovin
      Анемометр АСО-3.  С хранения, в тубусе. В наличии: 3шт по 3000р/шт.  
       
      Генератор Г4-104.  С хранения, в ящике. Книг и проводов, в комплекте нет. В наличии: 2шт по 3500р/шт.  
       
      Магазин сопротивления Р4833. С хранения, в упаковке. В наличии: 4шт по 3500р/шт. 
       
      Рефрактомер УРЛ-1. С хранения, в упаковке. В наличии:  4шт по 3300р/шт. 
       
      Прибор регистрирующий РП160-09. С хранения, в коробке. Бумага, в комплекте. В наличии: 3шт по 3000р/шт. 
       
      Тахометр 7ТЭ-М1. С хранения, в упаковке.  Комплект. В наличии: 2шт по 3000р/шт.
       
      Тахометр стробоскопический 2ТСт.  С хранения, в упаковке. Полный комплект. В наличии: 1шт. Цена: 4000р 
       
      Регулятор контактной сварки РКС-801.  В отличном состоянии, документация в комплекте. В наличии: 1шт. Цена: 4000р 
       
      Мешалка магнитная ММ-5.  С хранения, в упаковке. Есть документация. В наличи: 2шт по 2700р/шт. 
       
      Мешалка магнитная ММ-5.  Б/у,  в хорошем состоянии. В наличии: 1шт. Цена: 1700р.  (фото, по запросу)
       
      Саратовская обл. г.Энгельс
      Отправим: почтой, транспортной компанией, в Москву - с курьером.
       
      Контакты: 
      Моб. тел.:+7904-240-51-17.
      E-mail: olgalosewa86@mail.ru
       
    • By Sofia Vin
      Предлагаем проектную работу в Москве:
      Микроконтроллер STM32F103.
        
      Есть встроенный код с использованием функций библиотеки FreeRTOS, код имеет описанный протокол для связи с внешним миром.
        
      Необходимо проводить доработку кода под задачи программиста верхнего уровня и его тестирование в составе оборудования. 
      Работа в лаборатории (м.Университет) и удаленно. 
      Оплата по договоренности.
      Если Вы обладаете опытом схемотехнического проектирования и программирования микроконтроллеров, и Вас заинтересовала данная возможность, ждем Ваши отклики по контактным данным:
      8 (925) 023-60-02   Алексей
      E-mail: nassa@marathon.ru
       
    • By artos5
      Приветствую всех на этом форуме!
      Есть необходимость измерять сигнал при помощи данного АЦП. С помощью этого АЦП можно измерять 4 аналоговых не дифференциальных сигнала . Схема следующая:
      Schematic_Temp_opto_sens_V2_20190817124112.pdf
      Картинками с более низким разрешением:
      библиотеку за основу взял эту:
      https://github.com/nsaspook/nidaq700/blob/master/supermoon/example/ADS1220.c
      Путем незначительного допиливания, получилась такая библиотека:
       
      Поправил только эти функции:
      void ADS1220SendByte(unsigned char Byte) { unsigned char Result = 0x01, i=0, flg=0; MOSI_LO; Delay_us(1); for(i=0;i<8;i++) { SCK_LO; //ADC_CLK=0 Delay_us(4); if (flg) MOSI_LO; Delay_us(1); SCK_HI; //ADC_CLK=1 Delay_us(1); if (Byte&Result){ MOSI_HI; flg=1; } else MOSI_LO; Delay_us(4); Result<<=1; } SCK_LO; //ADC_CLK=0 } unsigned char ADS1220ReceiveByte(void) { unsigned char Result = 0, i=0; for(i=0;i<8;i++) { Result<<=1; SCK_LO; //ADC_CLK=0 Delay_us(5); //Delay_us(5); SCK_HI; //ADC_CLK=1 Delay_us(3); if (MISO) Result++; Delay_us(2); } SCK_LO; //ADC_CLK=0 return Result; } И добавил эту функцию:
      void ADS1220Config_MUX_GAIN(uint8_t mux, uint8_t gain) { unsigned Temp; ADS1220ReadRegister(ADS1220_0_REGISTER, 0x01, &Temp); // clear prev value; Temp &= 0x0f; Temp |= gain; Temp |= mux; // write the register value containing the new value back to the ADS ADS1220WriteRegister(ADS1220_0_REGISTER, 0x01, &Temp); ADS1220ReadRegister(ADS1220_1_REGISTER, 0x01, &Temp); // clear prev DataRate code; Temp &= 0x1f; Temp |= (ADS1220_DR_600 + ADS1220_CC); // Set default start mode to 600sps and continuous conversions // write the register value containing the new value back to the ADS ADS1220WriteRegister(ADS1220_1_REGISTER, 0x01, &Temp); } ADS1220.h :
      в результате получаю такую осциллограмму :

      То есть , постоянно считывается 0.
      А вот регистры конфигурации:
      Задаю номер входа MUX и усиление :
       

       
      Читаю данные так:
      ADS1220Config_MUX_GAIN(ADS1220_MUX_0_G, ADS1220_GAIN_1); HAL_Delay(10); temp_[0] = ADS1220ReadData(); Это для 0 канала. 
      Пробовал и так:
      ADS1220SetChannel(ADS1220_MUX_0_G); ADS1220SetGain(ADS1220_GAIN_1); temp_[0] = ADS1220ReadData(); Результат аналогичный. Кто что подскажет? Может кто заметит какой косяк в коде? Уже голова дымит ..
    • By KVAnton
      Всем привет, начал недавно STM32 осваивать (до этого были pic12-18/arduino/raspberry) и столкнулся с интересной проблемой:
      Настроил GPIO как Input Pull-Up но при считывании получаю 0.
      Условия:
      Несколько других также настроенных портов (Input Pull-Up) при этом посажены на землю (на один порт Output Open-Drain), а непосредственно перед считыванием переключаю другой порт Output Open-Drain Pull-Up с 1 на 0.
      При этом, если поставить задержку (пробовал 1мс) после переключения OutPut и считыванием Input получаю - 1, как и должно быть. Порты по схеме ни как не связанны - пробовал вообще отключать input порт от схемы (матрица кнопок) ситуация не меняется.
      Работаю с китайской платой на stm32f103c8t6 (ардуино подобная) и библиотекой LL. Скорость порта пробовал разную - результат один.
      Сможет кто-то объяснить или хотя бы намекнуть (куда копать, что почитать) почему такой эффект возможен?
      Во всяких даташитах/аппликейшн ноте вроде ни чего интересного, зацепила только аббревиатура  SSO ( simultaneous switching output) в разделе Adapt GPIO speed (в AN на GPIO) - но понять глубину этой фразы и контекста с ходу не получилось (возможно из-за непонимания каких-то базовых моментов)
      Хотя и проблема в принципе решена (задержка допустима) - но хотелось бы разобраться в причинах.
      Буду благодарен любым вариантам, может что-то натолкнет на правильные мысли.
  • Сообщения

    • Мне не понятно, почему в одном канале R44 стоит 200 КОм, а в другом стоял 3.6 КОм? И стоял он с завода!
    • Нашёл где "собака зарыта была". Операционник TL071 ,был бракованный. Заменил и в колонках почти тишина, не считая лёгкого писка в высокочастотном динамике. Если ухо к нему поднести. Испытывали на звуке, на мощных колонках в пиках выдавал 1400ватт. на 8Ом. Ограниченные лимитёром. Дроссель нормально работает, еле тёплый. Остаток несущей амплитудой 4 вольт. Вот только помехи мне не нравятся, которые по земле гуляют. Извините за качество фото. Да и на выходе тоже не всё пока хорошо. Это остаток несущей после фильтра. Это пики от переключения транзисторов в усилителе. Попробую на выводы ферритовые бусинки одеть. Но пока придут, будем так слушать.
    • Спасибо) И вот такая платка для PT100. Пока что не отмывал от остатков флюса. Использую вазелиново-канифольную пасту, в чем-то похожа по консистенции на "TT", проблем с ней не было.  
    • Все. И по несколько раз. А ты разве нет? Если без шуток,про какоЙ конденсатор идет речь? Нет
    • Очередная порция новостей. МУКИ с этим усилителем продолжаются, хотя есть и успехи. Собрал второй блок УНЧ-50-8. Ну, тот на котором сгорели транзюки и на котором я все их выпаял. Во время пайки, у одного кт315 отвалилась ножка. Капец они жидкие. По счастливой случайности под рукой были 2N3904, которые даже лучше. Их и поставил. Для кт361 замены не нашлось, поэтому оставил его. На место сгоревшего кт837Н поставил кт837Х. Тестер показал что они по h21э почти одинаковые, по сравнению с кт837а. Запускаем... Работает! Постоянка на выходе 5-7 милливольт. Но к сожалению шум "бзззззз" по прежнему никуда не исчез. Попробовал увеличить емкость С5 (по дефолту 3.3пф). Рекомендуют увеличивать до 15-30пф. У меня таких номиналов не оказалось. Минимум что было, это 100пф. Попробовал его. Результат - не работает, вернее не пускает защита, реле даже не щелкает. Вернул 3.3пф на место. Ладно, условно блоки УНЧ-5-0-8 готовы и работают. Но надо победить этот звенящий фон. Замучался искать его причину. То ли тембрблок его источник, то ли сами блоки УНЧ, ума не приложу... Включил, громкость выкрутил на середину (именно в этом положении шумит больше всего), потрогал конденсаторы пальцами. Выяснилось что при прикосновении к С8 (0.1 мкф) шум усиливается. Выпаял, посмотрел, измерил. Емкость в норме 100нф, еср 1.8. Вроде порядок, да и что с ним может быть, это ж пленка. Впаял обратно. При прикосновении к металлическому корпусу темброблока шум тоже усиливается. И это отражается на индикаторе. Индикация аж в "оранжевую" зону уходит, ну то есть перегруз показывает. Может самовозбуждение где то какое то идет... фиг его знает.  Пустил в ход последнюю надежду в виде новой к157уд2. Старую выпаял, новую впаял и... Ноль эффекта, как шумело так и шумит. Пошло оно все В ПЕКЛО! 
    • перевожу на доступный : датчик с выходом ОК , нормально открытый , имеет два режима работы "триггер" и "концевик"  . в режиме "концевик" при подаче питания происходит ложное срабатывание датчика на 0,5сек.  подключенный на выход таймер запускается по спадающему фронту и происходит ложное включение всей последующей цепочки. причина : прошивка МК написана  Ивашкой из китайского "дворца Пыонеров" забывшего обнулить регистр порта вывода перед переключением порта на выход при инициализации МК. лечится перепрошивкой МК или заменой МК со своей прошивкой.
×
×
  • Create New...