proj
This commit is contained in:
		
							parent
							
								
									a2d3f71108
								
							
						
					
					
						commit
						5c427867cd
					
				
					 2 changed files with 67 additions and 95 deletions
				
			
		|  | @ -1,57 +1,77 @@ | |||
| #include "LPC17xx.h" | ||||
| 
 | ||||
| unsigned long int duty_cycle = 0; | ||||
| int direction = 1; | ||||
| int step = 50; | ||||
| // Global variables for PWM control
 | ||||
| unsigned long int duty_cycle = 0;  // Current duty cycle value (0-3000)
 | ||||
| int direction = 1;                  // Direction of duty cycle change: 1=increasing, 0=decreasing
 | ||||
| int step = 50;                      // Amount to change duty cycle per interrupt
 | ||||
| 
 | ||||
| // PWM1 Interrupt Service Routine
 | ||||
| // Called when PWM match register 0 triggers an interrupt
 | ||||
| void PWM1_IRQHandler(void) | ||||
| { | ||||
|     // Check if interrupt flag for PWM match channel 0 is set
 | ||||
|     if (LPC_PWM1->IR & (1 << 0)) | ||||
|     { | ||||
|         // Ramp up the duty cycle if direction is 1
 | ||||
|         if (direction == 1) | ||||
|         { | ||||
|             duty_cycle += step; | ||||
|             // Check if we've reached maximum duty cycle
 | ||||
|             if (duty_cycle >= 3000) | ||||
|             { | ||||
|                 duty_cycle = 3000; | ||||
|                 direction = 0; | ||||
|                 direction = 0;  // Change direction to decreasing
 | ||||
|             } | ||||
|         } | ||||
|         // Ramp down the duty cycle if direction is 0
 | ||||
|         else | ||||
|         { | ||||
|             duty_cycle -= step; | ||||
|             // Check if we've reached minimum duty cycle
 | ||||
|             if (duty_cycle <= 0) | ||||
|             { | ||||
|                 duty_cycle = 0; | ||||
|                 direction = 1; | ||||
|                 direction = 1;  // Change direction to increasing
 | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         // Update PWM match register 4 with new duty cycle
 | ||||
|         LPC_PWM1->MR4 = duty_cycle; | ||||
|         // Latch the new match value
 | ||||
|         LPC_PWM1->LER = (1 << 4); | ||||
|         // Clear the interrupt flag for channel 0
 | ||||
|         LPC_PWM1->IR = (1 << 0); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| int main(void) | ||||
| { | ||||
|     // Configure P2.5 as PWM1[4] output
 | ||||
|     // PINSEL3 bits 15:14 = 10 for PWM1[4] function
 | ||||
|     LPC_PINCON->PINSEL3 |= (2 << 14); | ||||
| 
 | ||||
|     LPC_PWM1->TCR = (1 << 1); | ||||
|     LPC_PWM1->CTCR = 0; | ||||
|     LPC_PWM1->PR = 0; | ||||
|     // Reset and configure PWM1 counter and prescaler
 | ||||
|     LPC_PWM1->TCR = (1 << 1);     // Reset PWM counter
 | ||||
|     LPC_PWM1->CTCR = 0;           // Timer mode (counter increments on PCLK)
 | ||||
|     LPC_PWM1->PR = 0;             // Prescaler = 0 (no prescaling)
 | ||||
| 
 | ||||
|     LPC_PWM1->MR0 = 3000; | ||||
|     LPC_PWM1->MR4 = duty_cycle; | ||||
|     // Set PWM cycle period and initial duty cycle
 | ||||
|     LPC_PWM1->MR0 = 3000;         // PWM period (match register 0)
 | ||||
|     LPC_PWM1->MR4 = duty_cycle;   // Initial duty cycle (match register 4)
 | ||||
| 
 | ||||
|     LPC_PWM1->MCR = (1 << 1) | (1 << 0); | ||||
|     LPC_PWM1->PCR = (1 << 12); | ||||
|     // Configure PWM interrupts and enable output
 | ||||
|     LPC_PWM1->MCR = (1 << 1) | (1 << 0);  // Reset on MR0 and interrupt on MR0
 | ||||
|     LPC_PWM1->PCR = (1 << 12);            // Enable PWM4 output
 | ||||
| 
 | ||||
|     // Latch the match register values
 | ||||
|     LPC_PWM1->LER = (1 << 0) | (1 << 4); | ||||
| 
 | ||||
|     // Enable PWM1 interrupt in NVIC
 | ||||
|     NVIC_EnableIRQ(PWM1_IRQn); | ||||
| 
 | ||||
|     LPC_PWM1->TCR = (1 << 0) | (1 << 3); | ||||
|     // Start PWM counter and enable PWM mode
 | ||||
|     LPC_PWM1->TCR = (1 << 0) | (1 << 3);  // Counter enable and PWM enable
 | ||||
| 
 | ||||
|     // Infinite loop - everything is handled by interrupts
 | ||||
|     while (1); | ||||
| } | ||||
|  |  | |||
|  | @ -16,90 +16,42 @@ void PWM_Init(void){ | |||
| } | ||||
| 
 | ||||
| void Keyboard_Init(void){ | ||||
|         LPC_PINCON->PINSEL0 &= ~(0x03 << 0); | ||||
|         LPC_PINCON->PINSEL0 &= ~(0x03 << 2); | ||||
|         LPC_PINCON->PINSEL0 &= ~(0x03 << 4); | ||||
|         LPC_PINCON->PINSEL0 &= ~(0x03 << 6); | ||||
| 
 | ||||
|         LPC_GPIO0->FIODIR &= ~(0x0F << 0); | ||||
|     LPC_PINCON->PINSEL0 &= ~0x0FFF; | ||||
|     LPC_GPIO0->FIODIR &= ~0x0F; | ||||
| } | ||||
| 
 | ||||
| void Delay(unsigned long count){ | ||||
|         unsigned long i; | ||||
|         for(i = 0; i < count; i++); | ||||
|     for(unsigned long i = 0; i < count; i++); | ||||
| } | ||||
| 
 | ||||
| unsigned char Read_Keyboard(void){ | ||||
|         unsigned char key = 0xFF; | ||||
| 
 | ||||
|         if(!(LPC_GPIO0->FIOPIN & (1 << 0))){ | ||||
|     for(unsigned char i = 0; i < 4; i++){ | ||||
|         if(!(LPC_GPIO0->FIOPIN & (1 << i))){ | ||||
|             Delay(500000); | ||||
|                 if(!(LPC_GPIO0->FIOPIN & (1 << 0))){ | ||||
|                         key = 0; | ||||
|                         while(!(LPC_GPIO0->FIOPIN & (1 << 0))); | ||||
|             if(!(LPC_GPIO0->FIOPIN & (1 << i))){ | ||||
|                 while(!(LPC_GPIO0->FIOPIN & (1 << i))); | ||||
|                 Delay(500000); | ||||
|                 return i; | ||||
|             } | ||||
|         } | ||||
|         else if(!(LPC_GPIO0->FIOPIN & (1 << 1))){ | ||||
|                 Delay(500000); | ||||
|                 if(!(LPC_GPIO0->FIOPIN & (1 << 1))){ | ||||
|                         key = 1; | ||||
|                         while(!(LPC_GPIO0->FIOPIN & (1 << 1))); | ||||
|                         Delay(500000); | ||||
|     } | ||||
|         } | ||||
|         else if(!(LPC_GPIO0->FIOPIN & (1 << 2))){ | ||||
|                 Delay(500000); | ||||
|                 if(!(LPC_GPIO0->FIOPIN & (1 << 2))){ | ||||
|                         key = 2; | ||||
|                         while(!(LPC_GPIO0->FIOPIN & (1 << 2))); | ||||
|                         Delay(500000); | ||||
|                 } | ||||
|         } | ||||
|         else if(!(LPC_GPIO0->FIOPIN & (1 << 3))){ | ||||
|                 Delay(500000); | ||||
|                 if(!(LPC_GPIO0->FIOPIN & (1 << 3))){ | ||||
|                         key = 3; | ||||
|                         while(!(LPC_GPIO0->FIOPIN & (1 << 3))); | ||||
|                         Delay(500000); | ||||
|                 } | ||||
|         } | ||||
| 
 | ||||
|         return key; | ||||
|     return 0xFF; | ||||
| } | ||||
| 
 | ||||
| int main(void){ | ||||
|     unsigned char key; | ||||
|     const unsigned long pwm_values[] = {100, 250, 500, 750}; | ||||
| 
 | ||||
|     PWM_Init(); | ||||
|     Keyboard_Init(); | ||||
| 
 | ||||
|     while(1){ | ||||
|         key = Read_Keyboard(); | ||||
| 
 | ||||
|                 switch(key){ | ||||
|                         case 0: | ||||
|                                 pwm_value = 100; | ||||
|                                 LPC_PWM1->MR2 = pwm_value; | ||||
|                                 break; | ||||
|                         case 1: | ||||
|                                 pwm_value = 250; | ||||
|                                 LPC_PWM1->MR2 = pwm_value; | ||||
|                                 break; | ||||
|                         case 2: | ||||
|                                 pwm_value = 500; | ||||
|                                 LPC_PWM1->MR2 = pwm_value; | ||||
|                                 break; | ||||
|                         case 3: | ||||
|                                 pwm_value = 750; | ||||
|                                 LPC_PWM1->MR2 = pwm_value; | ||||
|                                 break; | ||||
|                         default: | ||||
|                                 break; | ||||
|                 } | ||||
| 
 | ||||
|         if(key < 4){ | ||||
|             LPC_PWM1->MR2 = pwm_values[key]; | ||||
|             LPC_PWM1->LER |= 0x04; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     return 0; | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue