|
@@ -28,7 +28,7 @@ enum {
|
|
|
CHECKSUM
|
|
CHECKSUM
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
-struct freqout {
|
|
|
|
|
|
|
+struct PWMOUT {
|
|
|
uint8_t portStat;
|
|
uint8_t portStat;
|
|
|
uint16_t freq;
|
|
uint16_t freq;
|
|
|
uint16_t duty;
|
|
uint16_t duty;
|
|
@@ -36,92 +36,129 @@ struct freqout {
|
|
|
uint32_t timchan;
|
|
uint32_t timchan;
|
|
|
void Init(TIM_HandleTypeDef *port, uint32_t tchan);
|
|
void Init(TIM_HandleTypeDef *port, uint32_t tchan);
|
|
|
void output(uint16_t freq);
|
|
void output(uint16_t freq);
|
|
|
|
|
+ uint32_t setupoutput(uint32_t freq);
|
|
|
|
|
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
uint8_t chsum(uint8_t * data);
|
|
uint8_t chsum(uint8_t * data);
|
|
|
uint8_t txdata(uint8_t * data);
|
|
uint8_t txdata(uint8_t * data);
|
|
|
|
|
|
|
|
-freqout port1freq;
|
|
|
|
|
-freqout port2freq;
|
|
|
|
|
|
|
+PWMOUT port1freq;
|
|
|
|
|
+PWMOUT port2freq;
|
|
|
|
|
+
|
|
|
|
|
+uint16_t numberofdigits = 0;
|
|
|
|
|
+uint8_t count = 0;
|
|
|
|
|
|
|
|
//#include "STM_ENC28_J60.h"
|
|
//#include "STM_ENC28_J60.h"
|
|
|
volatile uint16_t pwm1freq = 0;
|
|
volatile uint16_t pwm1freq = 0;
|
|
|
volatile uint16_t pwm1freqnew = 100;
|
|
volatile uint16_t pwm1freqnew = 100;
|
|
|
volatile uint16_t pwm2freq = 0;
|
|
volatile uint16_t pwm2freq = 0;
|
|
|
-volatile uint16_t pwm2freqnew = 10000;
|
|
|
|
|
|
|
+volatile uint16_t pwm2freqnew = 9999;
|
|
|
volatile uint16_t val;
|
|
volatile uint16_t val;
|
|
|
volatile uint32_t pwm1counter;
|
|
volatile uint32_t pwm1counter;
|
|
|
volatile uint32_t pwm1period;
|
|
volatile uint32_t pwm1period;
|
|
|
void maincpp()
|
|
void maincpp()
|
|
|
{
|
|
{
|
|
|
-
|
|
|
|
|
|
|
+ numberofdigits = pwm2freqnew;
|
|
|
|
|
+ while(numberofdigits != 0) {
|
|
|
|
|
+ numberofdigits=numberofdigits/10;
|
|
|
|
|
+ count++;
|
|
|
|
|
+ }
|
|
|
port1freq.Init(&htim1, TIM_CHANNEL_1);
|
|
port1freq.Init(&htim1, TIM_CHANNEL_1);
|
|
|
port2freq.Init(&htim3, TIM_CHANNEL_4);
|
|
port2freq.Init(&htim3, TIM_CHANNEL_4);
|
|
|
-// HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
|
|
|
|
|
-// HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_4);
|
|
|
|
|
|
|
+ // HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
|
|
|
|
|
+ // HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_4);
|
|
|
|
|
|
|
|
- port1freq.freq = (360000/20)-1;
|
|
|
|
|
- port1freq.duty = port1freq.freq/2;
|
|
|
|
|
- htim1.Instance->CCR1 = port1freq.duty;
|
|
|
|
|
- htim1.Instance->ARR = port1freq.freq;
|
|
|
|
|
- port2freq.freq = (360000/10)-1;
|
|
|
|
|
- port2freq.duty = port2freq.freq/2;
|
|
|
|
|
- htim3.Instance->CCR1 = port2freq.duty;
|
|
|
|
|
- htim3.Instance->ARR = port2freq.freq;
|
|
|
|
|
|
|
+ port1freq.setupoutput(10);
|
|
|
|
|
+ port2freq.setupoutput(10);
|
|
|
|
|
|
|
|
-// HAL_TIM_Base_Start_IT(&htim17);
|
|
|
|
|
|
|
+// port1freq.freq = (360000/10)-1;
|
|
|
|
|
+// port1freq.duty = port1freq.freq/2;
|
|
|
|
|
+// htim1.Instance->CCR1 = port1freq.duty;
|
|
|
|
|
+// htim1.Instance->ARR = port1freq.freq;
|
|
|
|
|
+// port2freq.freq = (360000/2000)-1;
|
|
|
|
|
+// port2freq.duty = port2freq.freq/2;
|
|
|
|
|
+// // htim3.Instance->CCR1
|
|
|
|
|
+// htim3.Instance->CCR4 = port2freq.duty;
|
|
|
|
|
+// htim3.Instance->ARR = port2freq.freq;
|
|
|
|
|
+
|
|
|
|
|
+ // HAL_TIM_Base_Start_IT(&htim17);
|
|
|
|
|
|
|
|
while(1)
|
|
while(1)
|
|
|
{
|
|
{
|
|
|
|
|
|
|
|
txdata(txbuff);
|
|
txdata(txbuff);
|
|
|
HAL_Delay(1000);
|
|
HAL_Delay(1000);
|
|
|
-// if(pwm1freq != pwm1freqnew)
|
|
|
|
|
-// {
|
|
|
|
|
-// pwm1freq = pwm1freqnew;
|
|
|
|
|
-//// val = (map(pwm1freq, 1, 10000, 10000, 1))-1;
|
|
|
|
|
-// htim1.Instance->CCR1 = (pwm1freq/2);
|
|
|
|
|
-// htim1.Instance->ARR = pwm1freq;
|
|
|
|
|
-//
|
|
|
|
|
-// }
|
|
|
|
|
-// if(pwm2freq != pwm2freqnew)
|
|
|
|
|
-// {
|
|
|
|
|
-// val = (360000/pwm2freqnew)-1;
|
|
|
|
|
-// pwm1freqnew = val;
|
|
|
|
|
-// pwm2freq = pwm2freqnew;
|
|
|
|
|
-//
|
|
|
|
|
-//
|
|
|
|
|
-// }
|
|
|
|
|
|
|
+ // if(pwm1freq != pwm1freqnew)
|
|
|
|
|
+ // {
|
|
|
|
|
+ // pwm1freq = pwm1freqnew;
|
|
|
|
|
+ //// val = (map(pwm1freq, 1, 10000, 10000, 1))-1;
|
|
|
|
|
+ // htim1.Instance->CCR1 = (pwm1freq/2);
|
|
|
|
|
+ // htim1.Instance->ARR = pwm1freq;
|
|
|
|
|
+ //
|
|
|
|
|
+ // }
|
|
|
|
|
+ // if(pwm2freq != pwm2freqnew)
|
|
|
|
|
+ // {
|
|
|
|
|
+ // val = (360000/pwm2freqnew)-1;
|
|
|
|
|
+ // pwm1freqnew = val;
|
|
|
|
|
+ // pwm2freq = pwm2freqnew;
|
|
|
|
|
+ //
|
|
|
|
|
+ //
|
|
|
|
|
+ // }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
|
|
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
|
|
|
{
|
|
{
|
|
|
- /* Prevent unused argument(s) compilation warning */
|
|
|
|
|
- if(htim->Instance == TIM17)
|
|
|
|
|
- {
|
|
|
|
|
- pwm1counter++;
|
|
|
|
|
- if(pwm1counter >= pwm1period)
|
|
|
|
|
- {
|
|
|
|
|
-// HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
|
|
|
|
|
- pwm1counter = 0;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ /* Prevent unused argument(s) compilation warning */
|
|
|
|
|
+ if(htim->Instance == TIM17)
|
|
|
|
|
+ {
|
|
|
|
|
+ pwm1counter++;
|
|
|
|
|
+ if(pwm1counter >= pwm1period)
|
|
|
|
|
+ {
|
|
|
|
|
+ // HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
|
|
|
|
|
+ pwm1counter = 0;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|
|
|
|
- /* NOTE : This function should not be modified, when the callback is needed,
|
|
|
|
|
|
|
+ /* NOTE : This function should not be modified, when the callback is needed,
|
|
|
the HAL_TIM_PeriodElapsedCallback could be implemented in the user file
|
|
the HAL_TIM_PeriodElapsedCallback could be implemented in the user file
|
|
|
- */
|
|
|
|
|
|
|
+ */
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-void freqout::Init(TIM_HandleTypeDef *port, uint32_t tchan) {
|
|
|
|
|
|
|
+void PWMOUT::Init(TIM_HandleTypeDef *port, uint32_t tchan) {
|
|
|
timport = *port;
|
|
timport = *port;
|
|
|
timchan = tchan;
|
|
timchan = tchan;
|
|
|
HAL_TIM_PWM_Start(&timport, timchan);
|
|
HAL_TIM_PWM_Start(&timport, timchan);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+uint32_t PWMOUT::setupoutput(uint32_t pwmfreq) {
|
|
|
|
|
+
|
|
|
|
|
+ uint32_t scale = 360000;
|
|
|
|
|
+ uint32_t autoreloadr = scale/pwmfreq;
|
|
|
|
|
+
|
|
|
|
|
+ switch (timchan)
|
|
|
|
|
+ {
|
|
|
|
|
+ case TIM_CHANNEL_1:
|
|
|
|
|
+ timport.Instance->CCR1 = autoreloadr/2;
|
|
|
|
|
+ break;
|
|
|
|
|
+ case TIM_CHANNEL_2:
|
|
|
|
|
+ timport.Instance->CCR2 = autoreloadr/2;
|
|
|
|
|
+ break;
|
|
|
|
|
+ case TIM_CHANNEL_3:
|
|
|
|
|
+ timport.Instance->CCR3 = autoreloadr/2;
|
|
|
|
|
+ break;
|
|
|
|
|
+ case TIM_CHANNEL_4:
|
|
|
|
|
+ timport.Instance->CCR4 = autoreloadr/2;
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ timport.Instance->ARR = autoreloadr;
|
|
|
|
|
+ freq = pwmfreq;
|
|
|
|
|
+ return freq;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
uint8_t txdata(uint8_t * data) {
|
|
uint8_t txdata(uint8_t * data) {
|
|
|
txbuff[DATASIZE] = STREAMLENTH;
|
|
txbuff[DATASIZE] = STREAMLENTH;
|
|
|
txbuff[PORT1STAT] = port1freq.portStat;
|
|
txbuff[PORT1STAT] = port1freq.portStat;
|