-
Постов
248 -
Зарегистрирован
-
Посещение
Сообщения, опубликованные dimir
-
-
Вы мне предлагаете редуктор поставить?У меня нет редуктора.И сверлит до 2мм.
-
А как же такой параметр как напряжение.Или я извиняюсь падение или скачёк напряжения.При падении напряжения и обороты упадут на моторчике.Я им дырки в стеклотекстолите делаю для пайки элементов.
-
В 27.03.2024 в 12:11, jcxz сказал:
Это не всегда так. А чаще вообще не так. Чаще целевым параметром ПИД-регулирования при управлении мотором, является не скорость, а крутящий момент. Например - в электротранспорте так. Потому что задающим воздействием, которое нужно выполнить ПИД-у, является величина нажатия педали акселератора водителем. Педаль задаёт крутящий момент, а не скорость. Аналогично - с электросамокатами и прочими средствами передвижения.
Так что мы делаем педалью акселератора увеличиваем момент.Каким это образом? Ногой это можно сделать.? Наверное открываем заслонку в карбюраторе или не так.?
Есть напряжение и ток два параметра на которые можно делать упор.Тахогенератор это тоже можно но для моторчика в 24 в нецелесообразно.
Датчик хода тоже хорошо но нужны прибамбасы выдумывать.
-
Ну а если нет в наличии тахометра.Я понял сарказм спецов.Бывают разные эл.машины постоянного тока.
-
А по формуле от чего зависит частота вращения? Там тахогенератора нет в формуле.
Частоту вращения двигателей постоянного тока можно изменять тремя способами: изменением сопротивления rя цепи якоря, изменением магнитного потока Ф, изменением подводимого к двигателю напряжения U.
А так как у меня в моторчике магнит на якоре.То напряжение оптимальный вариант.Хотя тахогенератор -круче
-
А допустим .Стабилизация скорости двигателя постоянного тока.Какими параметрами можно ползоваться в программе.Напряжение или ток?.Без тахогенератора?
-
Что такое ПИД.Расшифровку я знаю но принцип этой системы.И в формулах коэффициенты откуда берутся с фонаря?На пальцах и на примере можно объяснить?
-
В 26.02.2024 в 18:40, EdgeAligned сказал:
А вы поэкспериментируйте на практике. Тема - фильтрация сигналов RC-фильтром. Касательно темы электромоторчика, там фильтром (LС) выступают сами обмотки моторчика.
А вот этот дельный совет хороший.Спасибо.
-
Только не не любой синус получиться.Или это нужно подбирать фильтр под частоту ШИМа ?
-
Ну да прошлый раз вы меня послали а я нашёл програмку и переработал её.Это вопрос по теории мне не нужно ваших исходников.А для чего создан форум для вопросов и ответовИль чёёто не так я понял?
-
У меня возник вопрос по синусу но с помощью ШИМа.Есть такое понятие дискретизация сигнала.Что это такое и с чем его едят.И Пишут что она якобы должна быть от 4-12Кгц._это наполнее сигнала низкой частоты ШИМом или я не так понимаю?Ну у меня есть проект правда не мой.И не на stm32 а на AVR.Там частота ШИМа 31Кгц.А как добиться частоты 4 Кгц ШИМ что бы было на выходе 50 гц (через ФНЧ фильтр)?
-
Спойлер
/* * timers.c * * Created on: 22 черв. 2023 р. * Author: Admin */ #include "stm32f103xb.h" #include "stm32f1xx.h" #include "timers.h" extern volatile float TIM_Pulse; extern int i; extern volatile int d ; extern volatile float TIM_Per; // F=72000/47+1= 1500 kHz extern volatile float Zapoln; extern volatile uint16_t PR; void timer1_init(void) { RCC->APB2ENR |= RCC_APB2ENR_TIM1EN; // NVIC_EnableIRQ (TIM2_IRQn); //TIM2->CR1&=~ TIM_CR1_CEN; TIM1->PSC = 2400 - 1; // ����������� �������� ��� ������ ����� 1000 ��� � ������� TIM1->ARR = 100-1; TIM1->RCR = 5 - 1; TIM1->DIER |= TIM_DIER_UIE; TIM1->EGR = TIM_EGR_UG; TIM1->CR1 |= TIM_CR1_CEN; NVIC_EnableIRQ(TIM1_UP_IRQn); } void timer2_init_PWM(void) { //RCC->APB2ENR|=RCC_APB2ENR_IOPAEN; RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; // GPIOA->CRH&=~GPIO_CRH_CNF15_1; // GPIOA->CRH|=GPIO_CRH_CNF15_1; // GPIOA->CRH&=~GPIO_CRH_MODE15; // GPIOA->CRH|=GPIO_CRH_MODE15; // AFIO-> MAPR|=AFIO_MAPR_TIM2_REMAP ; // NVIC_EnableIRQ (TIM2_IRQn); //TIM2->CR1&=~ TIM_CR1_CEN; TIM2->PSC =0; // ����������� �������� ��� ������ ����� 1000 ��� � ������� TIM2->ARR = 1000; // TIM2->DIER |= TIM_DIER_UIE; TIM2->EGR |= TIM_EGR_UG; TIM2->CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1; // TIM2->CCMR1 = TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1; // TIM2->CCMR2 = TIM_CCMR2_OC3M_2 | TIM_CCMR2_OC3M_1; // TIM2->CCMR2 = TIM_CCMR2_OC4M_2 | TIM_CCMR2_OC4M_1; TIM2->CCER |= TIM_CCER_CC1E; // TIM2->CCER =TIM_CCER_CC2E; // TIM2->CCER =TIM_CCER_CC3E; // TIM2->CCER =TIM_CCER_CC4E; TIM2->CCER &= ~TIM_CCER_CC1P; TIM2->CR1 &= ~TIM_CR1_DIR; // NVIC_EnableIRQ (TIM2_IRQn); // TIM2->CCR1=0; // TIM2->CCR2=0; // TIM2->CCR3=0; // TIM2->CCR4=0; TIM2->CR1 |= TIM_CR1_CEN; // NVIC_EnableIRQ (TIM2_IRQn); } void timer_2_init(void) { //RCC->APB2ENR|=RCC_APB2ENR_IOPAEN; GPIOA->CRL |= GPIO_CRL_CNF0_1; GPIOA->CRL &= ~GPIO_CRL_CNF0_0; GPIOA->CRL|=GPIO_CRL_MODE0; RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; // AFIO->MAPR &= ~AFIO_MAPR_TIM2_REMAP; RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; // TIM2->PSC =0; // ����������� �������� ��� ������ ����� 1000 ��� � ������� //TIM2->ARR = 200 - 1; //65535 TIM2->PSC =0; TIM2->CCR1=TIM_Pulse; TIM2->ARR =TIM_Per; TIM2->CCMR1&=~TIM_CCMR1_CC1S; //TIM2->CCMR1|=_VAL2FLD(TIM_CCMR1_OC1M,6); TIM2->CCMR1|=TIM_CCMR1_OC1M_2|TIM_CCMR1_OC1M_1; TIM2->CCMR1|=TIM_CCMR1_OC1PE; TIM2->CCER|=TIM_CCER_CC1P; TIM2->CCER|=TIM_CCER_CC1E; //TIM2->EGR |= TIM_EGR_UG; //TIM2->DIER |=TIM_DIER_CC1IE; //TIM2->DIER |= TIM_DIER_UIE; TIM2->CR1 |= TIM_CR1_CEN; //NVIC_EnableIRQ(TIM2_IRQn); //NVIC_GetPriority(TIM2_IRQn,0.0); } void timer3_init(void) { RCC->APB1ENR |= RCC_APB1ENR_TIM3EN; TIM3->PSC = 9; // ����������� �������� ��� ������ ����� 1000 ��� � ������� TIM3->ARR = 7000; TIM3->EGR |= TIM_EGR_UG; TIM3->CR1 |= TIM_CR1_CEN; } void timer3_encoder(void) { /* GPIOA->MODER|=GPIO_MODER_MODER6_1; GPIOA->MODER|=GPIO_MODER_MODER7_1; GPIOA->PUPDR|=GPIO_PUPDR_PUPDR6_0; GPIOA->PUPDR|=GPIO_PUPDR_PUPDR7_0 ; GPIOA->AFR[0]|=_VAL2FLD(GPIO_AFRL_AFSEL6,2); GPIOA->AFR[0]|= _VAL2FLD(GPIO_AFRL_AFSEL7,2); */ GPIOA->CRL &= ~(GPIO_CRL_MODE7 | GPIO_CRL_MODE6); GPIOA->CRL &= ~(GPIO_CRL_CNF7_1 | GPIO_CRL_CNF6_1); GPIOA->CRL |= GPIO_CRL_CNF7_0 | GPIO_CRL_CNF6_0; RCC->APB1ENR |= RCC_APB1ENR_TIM3EN; TIM3->CCMR1 |= TIM_CCMR1_IC1F | TIM_CCMR1_IC2F; TIM3->CCMR1 |= TIM_CCMR1_CC1S_0 | TIM_CCMR1_CC2S_0; TIM3->CCER &= ~(TIM_CCER_CC1P | TIM_CCER_CC2P); TIM3->SMCR |= TIM_SMCR_SMS_1 | TIM_SMCR_SMS_0; TIM3->ARR = 100; TIM3->CR1 |= TIM_CR1_CEN; TIM3->CNT = 0; } void timer4_init(void) { RCC->APB1ENR |= RCC_APB1ENR_TIM4EN; TIM4->PSC = 2500- 1; // ����������� �������� ��� ������ ����� 1000 ��� � ������� TIM4->ARR = 100 - 1; TIM4->EGR |= TIM_EGR_UG; TIM4->DIER |= TIM_DIER_UIE; TIM4->CR1 |= TIM_CR1_CEN; NVIC_EnableIRQ(TIM4_IRQn); } void init_pwm_timer4(void) { //RCC->APB2ENR|=RCC_APB2ENR_IOPBEN ; GPIOB->CRL |= GPIO_CRL_CNF6_1; GPIOB->CRL &= ~GPIO_CRL_CNF6_0; GPIOB->CRL |= GPIO_CRL_MODE6_1; GPIOB->CRL |= GPIO_CRL_MODE6_0; //--��������� ������� ������ ���-����7------// GPIOB->CRL |= GPIO_CRL_CNF7_1; GPIOB->CRL &= ~GPIO_CRL_CNF7_0; GPIOB->CRL |= GPIO_CRL_MODE7_1; GPIOB->CRL |= GPIO_CRL_MODE7_0; GPIOB->CRH |= GPIO_CRH_CNF8_1; GPIOB->CRH &= ~GPIO_CRH_CNF8_0; GPIOB->CRH |= GPIO_CRH_MODE8_1; GPIOB->CRH |= GPIO_CRH_MODE8_0; //--��������� ������� ������ ���-����9------// GPIOB->CRH |= GPIO_CRH_CNF9_1; GPIOB->CRH &= ~GPIO_CRH_CNF9_0; GPIOB->CRH |= GPIO_CRH_MODE9_1; GPIOB->CRH |= GPIO_CRH_MODE9_0; // RCC->APB2ENR|=RCC_APB2ENR_AFIOEN; AFIO->MAPR &= ~AFIO_MAPR_TIM4_REMAP; RCC->APB1ENR |= RCC_APB1ENR_TIM4EN; TIM4->PSC = 0; TIM4->ARR = 4095; //TIM4->CCMR1&=~TIM_CCMR1_CC1S;//��������� ������ 1 �� �����. TIM4->CCMR1 &= ~TIM_CCMR1_CC2S; //��������� ������ 2 �� �����. TIM4->CCMR2 &= ~TIM_CCMR2_CC3S; TIM4->CCMR2 &= ~TIM_CCMR2_CC4S; //TIM4->CR1&=~TIM_CR1_DIR; TIM4->CCMR1 |= TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1; //|TIM_CCMR1_OC1M_0;//;// TIM4->CCMR1 |= TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1; //|TIM_CCMR1_OC2M_0;// TIM4->CCMR2 |= TIM_CCMR2_OC3M_2 | TIM_CCMR2_OC3M_1; //|TIM_CCMR1_OC2M_0;// TIM4->CCMR2 |= TIM_CCMR2_OC4M_2 | TIM_CCMR2_OC4M_1; TIM4->CCMR1 |= TIM_CCMR1_OC1PE; TIM4->CCMR1 |= TIM_CCMR1_OC2PE; TIM4->CCMR2 |= TIM_CCMR2_OC3PE; TIM4->CCMR2 |= TIM_CCMR2_OC4PE; TIM4->CCER |= TIM_CCER_CC1E; TIM4->CCER |= TIM_CCER_CC2E; TIM4->CCER |= TIM_CCER_CC3E; TIM4->CCER |= TIM_CCER_CC4E; // TIM4->CCER &=~TIM_CCER_CC1P; TIM4->CCER &= ~TIM_CCER_CC2P; TIM4->CCER &= ~TIM_CCER_CC3P; TIM4->CCER &= ~TIM_CCER_CC4P; // TIM4->CR1|=TIM_CR1_ARPE; //TIM4->EGR|= TIM_EGR_UG; // TIM4->CCR1=30000; TIM4->CR1 |= TIM_CR1_CEN; }
Спойлер/* * main.c * * Created on: 20 ���. 2020 �. * Author: Ivan */ #include "main.h" #define RT #define SYSCLOCK 72000000U //#define TIM_Pulse TIM2->CCR1 volatile unsigned int adc_data1 = 0; volatile unsigned int adc_data2 = 0; volatile unsigned int pauza = 0; volatile uint16_t PR; __IO uint32_t SysTick_CNT = 0; //int bufer=TIM4->CCR1*16; volatile float TIM_Pulse =50; int i; int d = 10; volatile float TIM_Per = 100; // F=72000/47+1= 1500 kHz volatile float Zapoln; struct { volatile unsigned int menu_lcd; volatile unsigned int menu_btn; volatile unsigned int a; volatile uint16_t PR; char buf1[50]; char buf2[50]; volatile unsigned char flag0; volatile unsigned int pauza_2; volatile unsigned int pauza_4; } danie, *Danie; struct { volatile unsigned int pauza1; } timer, *Timer; void pauzat(int T) //���� ����� �����(���������) ��� �������� �������� � ���������� #include "paua.h"����� ������ � �������� ����� pauza()� ������ ����� ���������� T { int i = 0; //�������� ��������������� i char t = 0; // �������� ������������ ���������� t ������� ����� ��������������� for (i = 0; i < T; t++) //���������� � ����� { if (t == 255) i = i + 1; // ������� ������ ����� ����� ����������� i ������������ ��������� TCCR2 ������������ 0.1.2 ������ ��� ��������� ������� ������ ������� } } void TIM1_UP_IRQHandler(void) { TIM1->SR &= ~ TIM_SR_UIF; //PR++; //TIM2->PSC =PR-1; //IWDG->KR = 0xAAAA; /* pauza++; if(pauza==50) { GPIOC->ODR|=GPIO_ODR_ODR13 ; } if(pauza==100) { GPIOC->ODR&=~GPIO_ODR_ODR13 ; pauza=0; } */ } void TIM2_IRQHandler(void) { /* if(TIM2->SR & TIM_SR_UIF) { TIM2->SR &= ~ TIM_SR_UIF; pauza++; if (pauza ==40) { GPIOC->BSRR |= GPIO_BSRR_BS13; GPIOA->BSRR |= GPIO_BSRR_BS0; //GPIOA->ODR |= GPIO_ODR_ODR1; } if (pauza == 80) { GPIOC->BSRR |= GPIO_BSRR_BR13; //GPIOA->ODR &= ~GPIO_ODR_ODR1; GPIOA->BSRR |= GPIO_BSRR_BR0; pauza = 0; } } */ if (TIM2->SR & TIM_SR_CC1IF) { TIM2->SR|=TIM_SR_CC1OF; } } void TIM4_IRQHandler(void) { if (TIM4->SR & TIM_SR_UIF) { TIM4->SR &= ~ TIM_SR_UIF; pauza++; if (pauza ==40) { PR++; GPIOC->BSRR |= GPIO_BSRR_BS13; // GPIOC->ODR |= GPIO_ODR_ODR13; } if (pauza == 80) { //PR=1000; GPIOC->BSRR |= GPIO_BSRR_BR13; //GPIOC->ODR &= ~GPIO_ODR_ODR13; pauza = 0; } /* pauza++; if(pauza>20) { GPIOA->BSRR|=GPIO_BSRR_BS5; } if(pauza>40) { GPIOA->BSRR|=GPIO_BSRR_BR5; pauza=0; } */ } } void delay(__IO uint32_t tck) { while (tck) { tck--; } } void delay_ms(uint32_t ms) { MODIFY_REG(SysTick->VAL, SysTick_VAL_CURRENT_Msk, SYSCLOCK / 1000 - 1); SysTick_CNT = ms; while (SysTick_CNT) { } } void NMI_Handler(void) { if ((RCC->CIR & RCC_CIR_CSSF) != 0) // HSE fail { RCC->CIR |= RCC_CIR_CSSC; // Clear CSSF flag } } void SysTick_Handler(void) { if (SysTick_CNT > 0) SysTick_CNT--; } void init_systimer(void) { MODIFY_REG(SysTick->LOAD, SysTick_LOAD_RELOAD_Msk, SYSCLOCK / 1000 - 1); CLEAR_BIT(SysTick->VAL, SysTick_VAL_CURRENT_Msk); SET_BIT(SysTick->CTRL, SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk); } void RCC_init(void) { FLASH->ACR |= FLASH_ACR_PRFTBE; FLASH->ACR |= FLASH_ACR_LATENCY_2; RCC->CR |= RCC_CR_HSEON; while (!(RCC->CR & RCC_CR_HSERDY)) { } RCC->CR |= RCC_CR_CSSON; RCC->CFGR |= RCC_CFGR_PLLMULL9; RCC->CFGR |= RCC_CFGR_HPRE_DIV1; //_VAL2FLD(RCC_CFGR_HPRE,1); RCC->CFGR |= RCC_CFGR_PPRE1_DIV2; //_VAL2FLD(RCC_CFGR_PPRE1,2); RCC->CFGR |= RCC_CFGR_PPRE2_DIV1; //_VAL2FLD(RCC_CFGR_PPRE2,1); RCC->CFGR |= RCC_CFGR_ADCPRE_DIV6; RCC->CFGR |= RCC_CFGR_PLLSRC; RCC->CFGR |= RCC_CFGR_PLLXTPRE_HSE; RCC->CR |= RCC_CR_PLLON; while (!(RCC->CR & RCC_CR_PLLRDY)) { } RCC->CFGR |= RCC_CFGR_SW_PLL; while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL) { } } void RCC_DeInit(void) { SET_BIT(RCC->CR, RCC_CR_HSION); while (READ_BIT(RCC->CR, RCC_CR_HSIRDY == RESET)) { } MODIFY_REG(RCC->CR, RCC_CR_HSITRIM, 0x80U); CLEAR_REG(RCC->CFGR); while (READ_BIT(RCC->CFGR, RCC_CFGR_SWS) != RESET) { } CLEAR_BIT(RCC->CR, RCC_CR_PLLON); while (READ_BIT(RCC->CR, RCC_CR_PLLRDY) != RESET) { } CLEAR_BIT(RCC->CR, RCC_CR_HSEON | RCC_CR_CSSON); while (READ_BIT(RCC->CR, RCC_CR_HSERDY) != RESET) { } CLEAR_BIT(RCC->CR, RCC_CR_HSEBYP); //Reset all CSR flags SET_BIT(RCC->CSR, RCC_CSR_RMVF); } void SetSysClockTo72(void) { SET_BIT(RCC->CR, RCC_CR_HSEON); while (READ_BIT(RCC->CR, RCC_CR_HSERDY == RESET)) { } //Enable the Prefetch Buffer CLEAR_BIT(FLASH->ACR, FLASH_ACR_PRFTBE); SET_BIT(FLASH->ACR, FLASH_ACR_PRFTBE); MODIFY_REG(FLASH->ACR, FLASH_ACR_LATENCY, FLASH_ACR_LATENCY_2); MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, RCC_CFGR_HPRE_DIV1); MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, RCC_CFGR_PPRE2_DIV1); MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_CFGR_PPRE1_DIV2); MODIFY_REG(RCC->CFGR, RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL, RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL9); SET_BIT(RCC->CR, RCC_CR_PLLON); while (READ_BIT(RCC->CR, RCC_CR_PLLRDY) != (RCC_CR_PLLRDY)) { } MODIFY_REG(RCC->CFGR, RCC_CFGR_SW, RCC_CFGR_SW_PLL); while (READ_BIT(RCC->CFGR, RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL) { } } void adc1_init(void) { // RCC->CFGR &=~ RCC_CFGR_ADCPRE; // RCC->APB2ENR|=RCC_APB2ENR_IOPAEN; GPIOA->CRL&=~GPIO_CRL_CNF1; GPIOA->CRL&=~ GPIO_CRL_MODE1; GPIOA->CRL&=~GPIO_CRL_CNF2; GPIOA->CRL&=~ GPIO_CRL_MODE2; RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; // RCC->APB2ENR |= RCC_APB2ENR_ADC2EN; //RCC->CFGR |= RCC_CFGR_ADCPRE_DIV2; //������ ������������ ��� ADC1->CR2 |= ADC_CR2_RSTCAL; while (!(ADC1->CR2 & ADC_CR2_RSTCAL)) { } ADC1->CR2 |= ADC_CR2_CAL; // while (!(ADC1->CR2 & ADC_CR2_CAL)); // { // } ADC1->CR2 |=ADC_CR2_CONT;//�������� ��� ADC1->CR2 |= ADC_CR2_EXTSEL; // ADC1->CR1|=ADC_CR1_SCAN ; ADC1->CR2 |= ADC_CR2_EXTTRIG; // ADC1->CR1&=~ADC_CR1_DUALMOD; ADC1->SMPR2&=~ ADC_SMPR2_SMP1_0; //1 ADC1->SMPR2&=~ADC_SMPR2_SMP1_1; //1 ADC1->SMPR2 &=~ ADC_SMPR2_SMP1_2; //1 ADC1->SQR3 |= ADC_SQR3_SQ1_0; //1 IN1 ADC1->SQR3 &= ~ ADC_SQR3_SQ1_1; //0 ADC1->SQR3 &= ~ADC_SQR3_SQ1_2; //0 ADC1->SQR3 &=~ ADC_SQR3_SQ1_3; //0 ADC1->SQR3 &= ~ADC_SQR3_SQ1_4; ADC1->CR2 |= ADC_CR2_ADON; ADC1->CR2 |= ADC_CR2_SWSTART; //} //void adc2_init(void) //{ //RCC->CFGR &=~ RCC_CFGR_ADCPRE; //RCC->APB2ENR|=RCC_APB2ENR_IOPAEN; // GPIOA->CRL&=~GPIO_CRL_CNF2; // GPIOA->CRL&=~ GPIO_CRL_MODE2; // RCC->APB2ENR |= RCC_APB2ENR_ADC2EN; // RCC->CFGR |= RCC_CFGR_ADCPRE_DIV2; // ADC2->CR2 |= ADC_CR2_RSTCAL; // while (!(ADC2->CR2 & ADC_CR2_RSTCAL)) // { // } // ADC2->CR2 |= ADC_CR2_CAL; //ADC2->CR2 |=ADC_CR2_CONT;//�������� ��� //ADC2->CR2 |= ADC_CR2_EXTSEL; // ADC2->CR2 |= ADC_CR2_EXTTRIG; //ADC2->SMPR2&=~ ADC_SMPR2_SMP2_0; //1 // ADC2->SMPR2&=~ADC_SMPR2_SMP2_1; //1 // ADC2->SMPR2 &=~ ADC_SMPR2_SMP2_2; //1 // ADC2->SQR3 &=~ ADC_SQR3_SQ1_0; //1 IN1 // ADC2->SQR3 |= ADC_SQR3_SQ1_1; //0 // ADC2->SQR3 &= ~ADC_SQR3_SQ1_2; //0 // ADC2->SQR3 &=~ ADC_SQR3_SQ1_3; //0 // ADC2->SQR3 &= ~ADC_SQR3_SQ1_4; // ADC2->CR2 |= ADC_CR2_ADON; } void DMA_init(void) { RCC->AHBENR|=RCC_AHBENR_DMA1EN; DMA1_Channel1->CPAR=(uint32_t)&ADC1->DR; DMA1_Channel1->CMAR=(uint32_t)&TIM4->CCR1; DMA1_Channel1->CNDTR=1; DMA1_Channel1->CCR|=DMA_CCR_CIRC; DMA1_Channel1->CCR&=~DMA_CCR_PINC ; DMA1_Channel1->CCR&=~DMA_CCR_MINC; DMA1_Channel1->CCR|=DMA_CCR_PSIZE_0 ; DMA1_Channel1->CCR|=DMA_CCR_MSIZE_0; DMA1_Channel1->CCR&=~DMA_CCR_DIR ; DMA1_Channel1->CCR|=DMA_CCR_EN ; ADC1->CR2|=ADC_CR2_DMA; } void IWDT_init(void) { RCC->CSR |= RCC_CSR_LSION; IWDG->KR = 0x5555; // Access to registers IWDG->PR &= ~(IWDG_PR_PR_0 | IWDG_PR_PR_1 | IWDG_PR_PR_2); // 4096 IWDG->RLR = 3000; //0x7FF; while (!((IWDG->SR & IWDG_SR_PVU) && (IWDG->SR & IWDG_SR_RVU))) { } // wait while bist of PVU and RVU will be set. IWDG->KR = 0xCCCC; // Start count down; } int main(void) { //Danie = &danie; //IWDT_init(); RCC_init(); init_systimer(); APB_init(); GPIO_init(); //IWDT_init(); //timer1_init(); timer_2_init(); //timer3_encoder(); timer4_init(); I2C1_Init(); LCD_ini(); LCD_Clear(); while (1) { //timer_2_init(); Zapoln = TIM_Per/TIM_Pulse; if((GPIOB->IDR&GPIO_IDR_IDR5)==0) { if (TIM_Per < 65535) TIM_Per = TIM_Per+d; TIM2->ARR = TIM_Per; TIM_Pulse = TIM_Per/Zapoln; TIM2->CCR1 = TIM_Pulse; // menyaem pwm vmeste s F //for(i=0;i<0x300000;i++); } pauzat(100); //for(i=0;i<0x300000;i++); /* switch(Danie->menu_btn) { case 0: IWDG->KR= 0xAAAA; TIM3->CNT=Danie->a; if(Danie->a>=100) { Danie->a=0; } Danie->a++; if(Danie->a<=0) { Danie->a=100; } Danie->a--; Danie->a=TIM3->CNT; break; case 1: IWDG->KR= 0xAAAA; TIM3->CNT=Danie->b; if(Danie->b>=100) { Danie->b=0; } Danie->b++; if(Danie->b<=0) { Danie->b=100; } Danie->b--; Danie->b=TIM3->CNT; break; case 2: Danie->menu_btn=0; break; } switch (Danie->menu_lcd) { case 0: IWDG->KR = 0xAAAA; // sprintf(Danie->buf0,"a=%2d ",Danie->a); LCD_SetPos(0, 0); LCD_String("Mama"); LCD_SendChar('M'); LCD_SendChar('a'); LCD_SendChar(0xBC); LCD_SendChar('a'); LCD_SendChar(' '); break; case 1: IWDG->KR = 0xAAAA; // sprintf(Danie->buf1,"b=%2d ",Danie->b); LCD_SetPos(0, 0); LCD_SendChar(0xA8); LCD_SendChar('a'); LCD_SendChar(0xBE); LCD_SendChar('a'); LCD_SendChar(' '); LCD_String("Papa"); break; case 2: Danie->menu_lcd = 0; break; } */ // LCD_SetPos(0,1); // LCD_String("Mama"); } }
Вот он код только немного видоизменённый.Так как на SPL был написан и моя задержка.
-
В 11.02.2024 в 09:15, tonyk_av сказал:
Так и есть. Я один и тот же вопрос от этого ivan dimir вижу на многих сайтах. У него подход к делу такой: прикинуться шлангом, выложить какой-нибудь бред, а потом ждать, пока грамотные челы ему всё разжуют и напишут. При этом он сам даже напрягаться не хочет, чтобы изучить теорию. Поэтому я удивляюсь, что многие до сих пор ведутся и тратят на него своё время.
Я нашёл пример на ютубе.И автор скинул на мою почту.Правда компилятор пишет ошибки.Пока не проверял рабочий он или нет.Правда в режиме ШИМ производится регулировка.У меня один вопрос к вам спецам или профисианалам .Для чего создаются форумы?Цель и задача форума .Мои цели вам известны. Вот человек поделился.Если надо и я поделюсь чем могу.А так как то не по человечески.Ведь информация должна передаваться из руки в руки. Иначе не имеет всё это смысла.Спасибо конечно за внимание.
-
В 11.02.2024 в 00:53, Obam сказал:
Но вот решить проблему вот такого плана не смог.Нужно менять частоту поэтапно от нуля включить на частоту 800 кГц .Потом шаг 80 кГц и менять до заданного значения метод итерации.
Ну вот и посчитай на бумажке коэффициенты деления для 80, 160, 240..(весь ряд сам допиши, у мну устный счёт плохо) 800 кГцРяд можно дописать .Программу написать .Но она не будет выполнять данную работу.А примера нет.Есть только видео stm32 & DDS .Si5351A -DDS прямоугольных импульсов.Но нужно создавать программу под неё.Да зная структурную схему DDS можно её самому сделать на базе stm32 но не на контроллере которого хочу я применить.Покажите пример.
-
Я это понимаю .Но вы мне покажите пример на пальцах хотя бы объясните.Как оно будет работать в основном цикле?
-
В 10.02.2024 в 06:13, HardWareMan сказал:
Частота зависит от периодов счёта и прескалера. Коэффициенты без проблем вычисляются из значений частоты периферии (брать APB1/APB2 к которому принадлежит выбранный таймер) и требуемой частоты. В чём проблема управлять частотой генерации таймера, если выбранный вами таймер без lock режима?
Это я знаю. Каким образом это можно реализовать.Одной переменной не обойтись. Просто в основном цикле вычислить и подставить -не работает.Так покажите пример.
- 1
-
Опубликовано · Изменено пользователем dimir · Пожаловаться
Как мне менять частоту генерации меандра?Я нашёл в своём коде пару ошибок.Из за них код не работал.Но вот решить проблему вот такого плана не смог.Нужно менять частоту поэтапно от нуля включить на частоту 800 кГц .Потом шаг 80 кГц и менять до заданного значения метод итерации.
-
HAL это хорошо.Спасибо заранее.Этот режим мне нужен для генератора меандр.Но генератор не просто на одной частоте.Как сделать управлением прескаллера.В майне по умолчанию.?Если можете проконсультировать амматора.
-
Ау спецы? Где вы ? На СВО?
- 1
-
Опубликовано · Изменено пользователем haker_fox
Тему перенёс. · ПожаловатьсяНастроил таймер на режим output compare togle.И всё погасло а тыкал на выход С1-112А абсолюный ноль.Что не так?
Спойлерvoid timer_2_init(void) { RCC->APB2ENR|=RCC_APB2ENR_IOPAEN; GPIOA->CRL |= GPIO_CRL_CNF0_1; GPIOA->CRL &= ~GPIO_CRL_CNF0_0; GPIOA->CRL|=GPIO_CRL_MODE0; RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; TIM2->PSC =2-1; // ����������� �������� ��� ������ ����� 1000 ��� � ������� TIM2->ARR = 3 - 1; //65535 TIM2->CCR1= 2; TIM2->CCMR1&=~TIM_CCMR1_CC1S; TIM2->CCMR1|=_VAL2FLD(TIM_CCMR1_OC1M,2); TIM2->CCMR1&=~TIM_CCMR1_OC1PE; TIM2->CCER&=~TIM_CCER_CC1P; TIM2->CCER|=TIM_CCER_CC1E; TIM2->EGR |= TIM_EGR_UG; TIM2->DIER |=TIM_DIER_CC1IE; //TIM2->DIER |= TIM_DIER_UIE; TIM2->CR1 |= TIM_CR1_CEN; NVIC_EnableIRQ(TIM2_IRQn); //NVIC_GetPriority(TIM2_IRQn,0); }
-
Я пошарил в нете и на сайте st нвшёл решение своей проблемы.Наверное это клон st-link/v2.Потому как cubeide сканирует под номером 6.Прошивается но отладка только с оригиналом.Ну так я прочитал.
-
Ну вот я по умолчанию выбрал проект и прошил Debug нажал и что должно показать в этой сессии.Можно подробнее до деталей.Потому как я ставлю галочку на сканирование st-link нажимаю Debug и ошибка?хотя по ютубу такого нет.
-
Опубликовано · Изменено пользователем haker_fox
Тему перенёс, т.к. речь идёт о среде разработки. · Пожаловатьсяу меня возник вопрос об отладке .Научился я прошивать Stm32 в Cubeide среде.Провозился с обновлением .Настроил для прошивки.А какие критерии настройки отладки и как я могу визуально это увидеть?
-
В 16.01.2024 в 17:22, tonyk_av сказал:
Этот ТС уже не единожды честно признавался, что читать не умеет и не хочет, зато умеет trahaть людям мозги на форумах. Я в его темы захожу вместо сайтов с анекдотами, когда пью кофе как сейчас, например.
Спасибо за комплимент.Я с Одесского региона анекдоты и мне нравятся.Но смотрите.Если вы же специалисты.У вас же можно проконсультироватся.?
STM32 & PID-регулятор
в Программирование
Опубликовано · Пожаловаться
В моторчике или статор или якорь состоит из магнита.Я его не разбирал.Потому как выведены + и - и больше нет выводов. Времён СССР движок.Рукой можно взять и сверлить.В эл.машинах постоянного тока если есть якорь и обмотка возбуждения то выводятся наружу вывода.Может они соеденены в корпусе не знаю.