Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Работа для программиста > Фриланс
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2018, 16:15   #1
def_met
Новичок
Джуниор
 
Регистрация: 21.05.2018
Сообщений: 1
По умолчанию [C] Нужно сделать пояснительную записку к программе

Нужно сделать пояснительную записку к программе по теме
Для измерительного генератора прямого синтеза , построенного на базе микроконтроллера и ЦАП с биполярным выходом напряжения , необходимо сформулировать файл, содержащий отсчеты заданной функции (треугольные импульсы - равносторонний треугольник ). Отсчеты- последовательность целых чисел , представленных в доп. коде.Вводимые оператором параметры: кол. отсчетов в периоде, разрядность ЦАП (от 8 до 24 двоичных разрядов ). Размах выходного сигнала- в пределах полного диапазона ЦАП.
текст программы
Код:
#include <stdio.h>
#include <Math.h>
#include <conio.h> 





int main() {
	FILE *fp;

	if ((fp = fopen("out.txt", "w")) == NULL){
		printf("Error file!\n");
	}
	int bit_depth = -1, count_dt = -1; //1. Переменная для разрядности 2. Количество отсчётов в периоде 
	
	
	// защита от дурака, пока кол-во отсчётов меньше 5 программа будет просить заново ввести count_dt
	while(count_dt < 5){
		printf("Enter count dt\n");
		scanf("%d",&count_dt);
	}
		
	// Аналогично верхней защите, только с разрядностью, она должна быть от 8 до 24
	while(bit_depth<8 || bit_depth>24){
		printf("Enter bit depth\n");
		scanf("%d",&bit_depth);
	} 
	printf("\n");
	
	/*
		В программе требуется использование отрицательных чисел, которые будут представляется в виде
		второго дополнения, алгоритм его полчения довльнно прост:
			Пример для 8 бит
			1.число, например 7, надо представить в двоичном виде 0000 0111
			2.Проводим побитовую инверсию 1111 1000
			3.Прибавляем 0000 0001, получается 1111 1001
			
		1111 1001 - это число -7
		0000 0111 - это число 7
		
		!! В ручную этого делать не придётся, ибо отрицательные числа в памяти уже представлены как надо!!
		
		Будем считать, что максимальная амплитуда равна sqrt(3), минимальная -sqrt(3)
		
		
				    0 - максимальная амплитуда (определяется разрядностью)           
				  0 . 0             
		--->    0   .   0       0  	Так выглядит один период треугольной "биполярной" функции 
		ось x	.	.     0   0	.    
		 		.	.       0 - . - минимальная амплитуда 	
		 		.	.       .   .
		 		.   .       .   .
				0   1       3   4 - точки на оси Х	
		
		В задании не указано, за сколько фукнция совершает полный период, поэтому я приму его за 4 условные единицы
		
		Функция состоит из двух равностороннх треугольников, следовательно линия в точке 1
		составляет угол 60 градусов с осью Х
		
		разбиваем функцию на 3 участа (0,1) (1,3) (3,4) 
		
		на участке  (0,1) можно записать уравнение функции так y =  sqrt(3)*x;
		на участке  (1,3) можно записать уравнение функции так y = -sqrt(3)*x + 2*sqrt(3);
		на участке  (3,4) можно записать уравнение функции так y =  sqrt(3)*x - 4*sqrt(3);	 
					 		
	*/
	
	count_dt--; //Делаем count_dt на один меньше т.к. дальше будут не жёсткие границы и это будет скомпенсированно
	
	//Разбиваем ось x на равные отрезки, в зависимости от count_dt
	float n = 0; 
	for(n = 0; n <= 4; n += (4 /(float) count_dt)){
		/*
			long int используется из-за того, 
			что в нём 4 байта информацции (24 бита), обычного int просто не хватит
		*/
		long int OutY = 0;
		double TmpY = 0; 
		if(n>=0 && n < 1){
			TmpY =  sqrt(3)*n;  //Первая область
		}
		
		if(n>=1 && n <= 3){
			TmpY = -sqrt(3)*n + 2*sqrt(3); //Втораяя область
		}
		
		if(n>3  && n <= 4){
			TmpY =  sqrt(3)*n - 4*sqrt(3); // Ну и последняя
		}
		
		/*Выходное значение вычисляется так:
			1. В Переменной TmpY лежит высота функции в некторой точке n, например, в точке n = 1 TmpY = sqrt(3)
			2. TmpY/sqrt(3) это нормализированная высота диапозон [-1;1];
			3. pow(2,bit_depth-1) Максимальная амплитуда  
				a) Для 8 бит 127 (не 255 т.к. самый левый разряд уходит под знак)
				б) Для 9 бит 255
				в) Для 10 бит 1023
			4. в out записывается pow(2,bit_depth-1)*TmpY/sqrt(3)
		
		*/
		long int out = (long int)( (pow(2,bit_depth-1)-1 )*TmpY/sqrt(3) );
		
		
		int i;
		//Вывод на экран
		for(i = bit_depth-1; i > -1; i--)printf("%d",(out >> i) & 1); // вывод числа в двоичном виде
		printf(" %ld \n",out);
		
		//Вывод в файл 
		for(i = bit_depth-1; i > -1; i--)fprintf(fp,"%d",(out >> i) & 1);// вывод числа в двоичном виде
			
		
	}
	printf("\nComplete!");
	getch(); //не даю окну закрыться
	return 0;
}

Последний раз редактировалось Вадим Мошев; 03.06.2018 в 19:42.
def_met вне форума Ответить с цитированием
Старый 04.06.2018, 09:19   #2
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 746
По умолчанию

Замечания по заданию:
Цитата:
Сообщение от def_met Посмотреть сообщение
Для измерительного генератора прямого синтеза , построенного на базе микроконтроллера и ЦАП с биполярным выходом напряжения, необходимо сформулировать файл, содержащий отсчеты заданной функции (треугольные импульсы - равносторонний треугольник).
В кавычки взяты его цитаты из задания.
1) Фраза "измерительный генератор" просто поставила меня в тупик. Есть либо измеритель, либо генератор. В обобщенном варианте не встречается, хотя в принципе может. Поэтому глупость не пишите, пожалуйста.
2) Какой микроконтроллер?
3) "сформулировать файл" - не сформулировать, а сформировать. Вы там студенты думайте, хоть маленько. Совсем расслабились уже. Преподы орут над вами, а вы тупите. Да еще и темы такие создаете. - Весь мир над вами орет.
4) "Размах выходного сигнала - в пределах полного диапазона ЦАП." - ну это и так понятно, еще максимальное напряжение забыли указать, для полной картины.
5)
Цитата:
Сообщение от def_met Посмотреть сообщение
обычного int просто не хватит
- DOS-овского int не хватит(16-бит), а Windows-int хватает - потому что это 32-бита или как сейчас 64-бита.
В общем могу на словах описать, как работает программа. В этом случае пишите мне на почту: sergeisky@yahoo.com. Только графики и сам текст записки будете сами писать на основе своих умозаключений. Какой бюджет-то, кстати?
Напишу программу на C++ и Asm для AVR. Черчение: sergeisky@yahoo.com.
Cuprum5 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Я изучил HTML в программе " Solo Learn" Мне нужно создать сайт для продажы велосипедов. Подскажите как это сделать? Магик HTML и CSS 5 23.03.2017 08:16
Необходимо написать пояснительную записку для курсовой работы Joker_vad Фриланс 0 30.03.2016 09:25
нужно сделать, чтобы в программе можно вводить какие строки сравнивать, у какой строки определить длину и так далее, по всем задан Евгения Е Общие вопросы C/C++ 0 18.12.2014 20:13
Нужно сделать комментариями к программе (Вечный календарь на TurboPascal). ArtiomS Помощь студентам 1 22.05.2011 15:25
Нужно сделать паузу в программе по нажатию пробела Pblcb Помощь студентам 4 14.02.2011 17:12