سلام خدمت همه ی دوستان!
من میخواهم یک عدد توی بازه 1 تا 1023 را از uart بگیرم و طبق یک رابطه ای اون را به بازه 120 تا 24000 تبدیل کنم و فرکانس pwm را برابر با حاصل این معادله کنم.
فرمول این معادله به اینصورت هست
برنامم را طوری نوشتم که وقتی توی uart یک عدد در بازه 1 تا 1023 را ارسال کنم مقدار f(x) را طبق فرمول محاسبه میکنه و فرکانس pwm را برابر با اون میکنه.
+ حاصل f(x) را توی uart برمیگردونه!
حالا توی محاسبه f(x) هیچ مشکلی نیست و مقداری که از حاصل این رابطه برمیگردونه کاملا درسته ولی مشکل اینجاست که فرکانس pwm توی رنج ها بالا تغییر نمیکنه و 0 میشه!
مثلا اگه 1 رو بفرستم طبق رابطه مقدار mr0 برابر با 120 میشه! ولی فرکانس و ولتاژ سیگنال خروجیم 0 هست.
خودم فکر میکنم نحوه تغییر فرکانس pwm در زمان کار با کدی که من نوشتم فرق میکنه!
اینم کد!
ممنون میشم راهنمایی کنید.
من میخواهم یک عدد توی بازه 1 تا 1023 را از uart بگیرم و طبق یک رابطه ای اون را به بازه 120 تا 24000 تبدیل کنم و فرکانس pwm را برابر با حاصل این معادله کنم.
فرمول این معادله به اینصورت هست
کد:
f(x)=11940*(x-1)/511 +120
+ حاصل f(x) را توی uart برمیگردونه!
حالا توی محاسبه f(x) هیچ مشکلی نیست و مقداری که از حاصل این رابطه برمیگردونه کاملا درسته ولی مشکل اینجاست که فرکانس pwm توی رنج ها بالا تغییر نمیکنه و 0 میشه!
مثلا اگه 1 رو بفرستم طبق رابطه مقدار mr0 برابر با 120 میشه! ولی فرکانس و ولتاژ سیگنال خروجیم 0 هست.
خودم فکر میکنم نحوه تغییر فرکانس pwm در زمان کار با کدی که من نوشتم فرق میکنه!
اینم کد!
ممنون میشم راهنمایی کنید.
#include "lpc17xx.h"
#include "lpc17xx_gpio.h"
#include "delay.h"
#include "timer.h"
#include "gpio.h"
#include "adc.h"
#include <string.h>
#include <stdlib.h>
unsigned char set;
char buff[20],buffer[10];
uint32_t uc=0;
int putchar( unsigned char data ){while (!(LPC_UART0->LSR & 0x20));return (LPC_UART0->THR = data);}
void puts(unsigned char *data){unsigned int j=0;for(j=0;;j++){if(data[j]==0){return;}else putchar(data[j]);}}
unsigned char getchar(void){while (!(LPC_UART0->LSR & 0x01));return (LPC_UART0->RBR);}
void pwm1_init(uint32_t f,uint32_t dt)
{
LPC_PINCON->PINSEL4 = (1<<0) | (1<<2) | (1<<4) | (1<<6); //1.2.3.4
LPC_PWM1->TCR = 0x01;
LPC_PWM1->MCR = 0x02;
LPC_PWM1->PCR = (1<<11) ;
LPC_PWM1->MR0 = f;
LPC_PWM1->MR1 = (dt*f)/100;
LPC_PWM1->LER = (1<<0) | (1<<1) | (1<<2) | (1<<3) | (1<<4);
LPC_PWM1->PCR = (1<<9) | (1<<10) | (1<<11) | (1<<12);
}
void pwm1_edit(uint32_t f,uint32_t dt)
{
LPC_PWM1->MR0 = f;
LPC_PWM1->MR1 = (dt*f)/100;
LPC_PWM1->LER = (1<<0) | (1<<1) | (1<<2) | (1<<3) | (1<<4);
LPC_PWM1->PCR = (1<<9) | (1<<10) | (1<<11) | (1<<12);
}
void uart0_init( void )
{
uint16_t usFdiv;
LPC_GPIO0->FIODIR|=(1<<2); //P0.2 Config As Output
LPC_PINCON->PINSEL0|=1<<4;//TXD0
LPC_GPIO0->FIOSET|=1<<2;//SET HIGH LEVEL FOR IDEL
LPC_GPIO0->FIODIR&=~(1<<3); //P0.3 Config As Input
LPC_PINCON->PINSEL0|=1<<6;//RXD0
LPC_PINCON->PINMODE0|=0<<6;//pull-up
LPC_SC->PCONP |=(1<<3);/*Open UART0 power control bit*/
//DATABIT=8-bit--STOPBIT=1 stop bit--PARITY=NONE
LPC_UART0->LCR=3<<0|0<<2|0<<3|1<<7;
usFdiv = (24000000/ 16) / 9600;/* Set baud rate*/
LPC_UART0->DLM = usFdiv / 256;
LPC_UART0->DLL = usFdiv % 256;
LPC_UART0->LCR=3<<0|0<<2|0<<3;
LPC_UART0->FCR = 0x06;
return;
}
int main(void)
{
SystemInit();
uart0_init();
pwm1_init(62500,50);
GPIO_SetDir(1,0xff,1);
LPC_GPIO2->FIOPIN=set;
while(1)
{
set=getchar();
if(set!=13){buff[c]=set;c++;}
if(set==13)
{
buff[c+1]='\0';c=0;
uc=((11940*(atoi(buff)-1))/511)+120;
sprintf(buffer,"%d",uc);
if(atoi(buff)>0){pwm1_edit(uc,50);}
puts("\r\n>>>");puts(buffer);putchar(10);putchar(13);
for(i=0;buff[i]!='\0';i++){buff[i]='\0';}
for(i=0;buffer[i]!='\0';i++){buffer[i]='\0';}
}
}
}