اطلاعیه

Collapse
No announcement yet.

تغییر فرکانس pwm توسط uart در lpc1768

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    تغییر فرکانس pwm توسط uart در lpc1768

    سلام خدمت همه ی دوستان!
    من میخواهم یک عدد توی بازه 1 تا 1023 را از uart بگیرم و طبق یک رابطه ای اون را به بازه 120 تا 24000 تبدیل کنم و فرکانس pwm را برابر با حاصل این معادله کنم.
    فرمول این معادله به اینصورت هست
    کد:
    f(x)=11940*(x-1)/511 +120
    برنامم را طوری نوشتم که وقتی توی uart یک عدد در بازه 1 تا 1023 را ارسال کنم مقدار f(x) را طبق فرمول محاسبه میکنه و فرکانس pwm را برابر با اون میکنه.
    + حاصل 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';}

    }
    }
    }
لطفا صبر کنید...
X